2015-01-24 3 views
0

У меня есть многомерный массив, который необходимо решить, для решения неизвестных значений (x1, x2, x3, ..). В этом многомерном массиве размер моего массива в координатах i и j различен; В [п] [п + 1]. Я знаю, что этот базовый C, метод Джорджа Гаусса для решения неизвестного, неверен и хотел бы, чтобы кто-то указал, как его модифицировать.Метод Гаусса Джорда в Basic C Multi

Этот код является точным для массива с теми же значениями n; например. Анна].

//Computation to solve 
for(j=0; j<=n; j++) 
{ 
    for(i=0; i<=n; i++) 
    { 
     if(i!=j) 
     { 
      c=B[i][j]/B[j][j];      
      for(k=0;k<=n+1;k++) 
      { 
       B[i][k] = B[i][k] - c*B[j][k]; 
      } 
     } 
    } 
} 

//Print Solution 
printf("\nThe solution is:\n"); 
for(i=0; i<=n; i++) 
{ 
    x[i]=B[i][n+1]/B[i][i]; 
    printf("\n x%d=%.3f\n",i,x[i]); 
} 

Примером может быть, если мой n = 2. Массив, который я хотел бы решить, - B [2] [3].

0 -20 0 -1 
0 30 -10 0 
0 -10 10 1 

Выходной сигнал этого кода

x1= -inf 
x2=0.050 
x3=0.000 

Правильный вывод должен быть

x1=0.00 
x2=0.05 
x3=0.15 
+3

начальный индекс массива от 0 до n-1. Что не так с приведенным выше кодом и какой результат вы ожидаете, неясно. – SMA

+0

Мой горизонтальный j имеет 4 значения, а мой n всего 2-1? –

+0

X [n] [n + 1], n = 3 => 'double X [3] [4];', X [0..2] [0 ..3] – BLUEPIXY

ответ

0

Этот код является точным для массива с теми же п только значения; например. A [n] [n].

Нет, код уже составляет колонке п + 1 (который держит правую постоянные члены) в цикле

  for(k=0;k<=n+1;k++) 
      { 
       B[i][k] = B[i][k] - c*B[j][k]; 
      } 

k пробегов до n+1). Таким образом, это правильно в этом отношении.

Примером может быть, если мой n = 2. Массив, который я хотел бы решить, - B [2] [3].

C массивы объявляются путем указания количества элементов в массиве, а не самого высокого индекса, поэтому вы хотите B[3][4].

Основной недостаток показанного кода заключается в отсутствии у него row swapping operation, который может потребоваться, если B[j][j] равен нулю, и соответствующий тест. Мы можем осуществить это путем вставки

 if (!B[j][j]) 
     { 
      for (i=j+1; i<=n; i++) 
       if (B[i][j]) { swap(B[j], B[i]); break; } 
      if (!B[j][j]) continue; // leave all-zero column as is 
     } 

в начале тела в for(j=0; j<=n; j++) петли (реализации swap() читателю).

Правильный выход должен быть

x1=0.00 

ли это правильно спорно, но если вы хотите переменную, где каждое число является решением принять нулевое значение, вы можете вставить

 if (B[i][i] == 0 && B[i][n+1] == 0) x[i] = 0; 

до printf("\n x%d=%.3f\n",i,x[i]).

 Смежные вопросы

  • Нет связанных вопросов^_^