Здравствуйте, товарищи, помогите, пожалуйста подкорректировать код для метода сопряжённый градиентов ( это из численного анализа))
У меня цикл почему-то на первой итерации прерывается ( может быть это из затого, что я криво прописал первую итерацию ?(начальные условия то есть )?
Код:
A = {{4, 1, -1, 1}, {1, 4, -1, -1}, {-1, -1, 5, 1}, {1, -1, 1, 3}};
B = {-2, 1, 0, 1};
Print["A = " , MatrixForm[A], "," " B = ",
MatrixForm[B], ",", " A.x=B"]
Print["x[0] = ", x[0] = {0, 0, 0, 0}]
Print[ ]
Print[" "]
Print["______________________________________________________________"]
While[Sqrt[(B - A.x[i + 1]).(B - A.x[i + 1])] > 10^(-6), i++;
i = 0
d[i] = r[i] = B - A.x[i];
Ro[i] = -((B - A.x[i]).(B - A.x[i]))/(d[i].A.d[i])
x[i + 1] = x[i] + Ro[i]*d[i] (*!!!!!!!!!!!!!!!!!!!!*)
r[i + 1] = r[i] + Ro[i]*A*d[i]
betta[
i + 1] = ((B - A.x[i + 1]).(B - A.x[i + 1]))/((B -
A.x[i]).(B - A.x[i]))
d[i + 1] = (B - A.x[i + 1]) + betta[i + 1]*d[i]
i = 1
r[i] = B - A.x[i];
Ro[i] = -((B - A.x[i]).(B - A.x[i]))/(d[i].A.d[i])
x[i + 1] = x[i] + Ro[i]*d[i]
r[i + 1] = r[i] + Ro[i]*A*d[i]
betta[
i + 1] = ((B - A.x[i + 1]).(B - A.x[i + 1]))/((B -
A.x[i]).(B - A.x[i]))
d[i + 1] = (B - A.x[i + 1]) + betta[i + 1]*d[i]
{
Ro[i] = -((B - A.x[i]).(B - A.x[i]))/(d[i].A.d[i])
x[i + 1] = x[i] + Ro[i]*d[i] (*!!!!!!!!!!!!!!!!!!!!*)
r[i + 1] = r[i] + Ro[i]*A*d[i]
betta[i +
1] = ((B - A.x[i + 1]).(B - A.x[i + 1]))/((B -
A.x[i]).(B - A.x[i]))
d[i + 1] = (B - A.x[i + 1]) + betta[i + 1]*d[i]
}
Print["Iteration = ", i, ", x=", x[i]]]
Print[" "]
Print["Resultado de função, calculada com LinearSolve[A,B]: x = ",
LinearSolve[A, B] // N]
Print["Verificar de solução: A.x[i] = ", Round[A.x[i]], "~~B = ", B]
Print["______________________________________________________________\
"]