2016-09-25 7 views
1

Я пытаюсь написать код, чтобы найти A в системе линейных уравнений Ax=B, поэтому я использовал разложение LU. Теперь, когда у меня есть L и U правильно, я застрял в прямой подстановке, чтобы получить y в B = Ly.Прямая замена не работает должным образом в C

Я написал некоторый код в MatLab, который отлично работает, но я не могу получить те же результаты, что и переписывание кода на C. Поэтому мне было интересно, может ли кто-нибудь узнать, что я делаю неправильно, я не полностью использую к С.

Вот мой код в MatLab:

y(1,1) = B(1,1)/L(1,1); 
for i= 2:n 
    sum=0; 
    sum2=0; 
    for k = 1: i-1 
     sum = sum + L(i,k)*y(k,1); 
    end 
    y(i,1)=(B(i,1)-sum)/L(i,i); 
end 

где L моя нижняя треугольная матрица, B вектор того же размера, и n является 2498 в этом случае.

Мой C код выглядит следующим образом:

float sum = 0; 

y_prev[0]=B[0]/(float)Low[0][0]; 

for (int i = 1; i < CONST; i++) 
{ 
    for (int k = 0; k < i-1; k++) 
    { 
     sum = sum +Low[i][k]*y_prev[k]; 
    } 

    y_prev[i]= (B[i]- sum)/(float)Low[i][i]; 
} 
+3

Где вы находитесь в C 'float (Low [0] [0])' вы имели в виду '(float) Low [0] [0]'? '(Float)' здесь должен быть типом cast, а не функцией. –

+0

Какова ваша проблема? (кроме флоат-броска). Если вы получаете ошибки, возможно, это из-за кода определения/распределения массива, который мы не видим. –

+0

Я не получаю ошибки для кода, но выходной вектор неверен. Благодарю вас. – SDj

ответ

2

Одно различие между кодами происходит от того, как вы изменили для цикла индексов для работы с индексацией на основе нулевого в С (я не могу запустить версию MATLAB и не иметь какой-либо контекст для кода, поэтому могут быть и другие отличия.)

Переменные i и имеют значения, меньшие на 1 в коде C. Это именно то, что вы хотите для индексов цикла, но проблема возникает, когда вы используете i для управления количеством итераций во внутреннем контуре по k. Это i-1 в обеих версиях кода, хотя i имеет разные значения. Например, в первой итерации внешнего цикла внутренний цикл выполняется один раз в коде MATLAB, но не на всех в C.

Возможное исправление было бы переписать внутренний цикл в коде C, как

for (int k = 0; k < i; k++) 
{ 
    sum = sum +Low[i][k]*y_prev[k]; 
} 

Второе отличие состоит в том, что вы сброса sum до нуля в коде MATLAB, но не в C (код MATLAB также имеет sum2, который, похоже, не используется?). Это приведет к различиям в y_prev[i] для i>0.

+0

Спасибо! ты так прав, я полностью пропустил это. К сожалению, мой код по-прежнему не работает должным образом, он дает мне первый результат, а затем, как и сумма, всегда была cero:/ – SDj

+0

@SDj: Я заметил другую разницу и добавил ее к ответу - это помогает? –

+0

не очень (эта сумма2 не должна быть там, я использовал ее раньше и забыл ее удалить) – SDj