Прямая замена не работает должным образом в C

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

Я написал некоторый код в MatLab, который отлично работает, но я не могу получить те же результаты, переписав код на C. Поэтому мне было интересно, может ли кто-нибудь знать, что я делаю неправильно, я не полностью привык к 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];
}

person SDj    schedule 25.09.2016    source источник
comment
Где у вас в C float(Low[0][0]) вы имели в виду (float)Low[0][0]? (float) здесь должно быть приведением типа, а не функцией.   -  person Weather Vane    schedule 25.09.2016
comment
в чем именно твоя проблема? (кроме поплавкового литья). Если вы получаете ошибки, возможно, это связано с кодом определения/распределения массива, который мы не видим.   -  person Jean-François Fabre    schedule 25.09.2016
comment
Я не получаю ошибок для кода, но выходной вектор неверен. Я сейчас же поменяю актерский состав, спасибо.   -  person SDj    schedule 25.09.2016


Ответы (1)


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

Переменные i и k имеют значения, которые в коде C меньше на 1. Это именно то, что вам нужно для индексов цикла, но возникает проблема, когда вы используете 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.

person Mike Dinsdale    schedule 25.09.2016
comment
Спасибо! ты так прав, я полностью пропустил это. К сожалению, мой код все еще не работает должным образом, он дает мне первый результат в порядке, а затем, как будто сумма всегда была нулевой:/ - person SDj; 26.09.2016
comment
@SDj: я заметил еще одно отличие и добавил его в ответ - это помогает? - person Mike Dinsdale; 26.09.2016
comment
не совсем (этого sum2 не должно быть, я использовал его раньше и забыл удалить) - person SDj; 26.09.2016