Приближени методи за решаване на СЛАУ (системи линейни алгебрични уравнения)

Пример за случая А е близка до единичната матрица:

B = (({{0.05, 0.1, -0.1}, {-0.15, -0.1, 0.05}, {0.1, -0.1, -0.05}})); b = {0.85,0.2,-1.15};
x = {0,0,0};
For[k = 0, k ≤ 10, k++,
eps = (0.3^k)*(1.15/0.7);
Print["k = ",k," x = ",x," e = ",eps];
x = B.x+b]

В горния код, при този избор на начално приближение, попадаме още на първата стъпка на точното решение.

B = (({{-0.2, 0.1, -0.2}, {-0.1, 0.1, -0.1}, {-0.1, -0.2, -0.1}})); b = {1,0,-1};
x = {0.1,0,0};
For[k = 0, k ≤ 11, k++,
Print["k = ",k," x = ",x];
x = B.x+b]

В примера за оценка на грешката гледаме колко са верните знака в решението. В случая, това можем да го направим, защото знаем точното решение.

Пример за случая А е с ДГД (доминиращ главен диагонал). Метод на простата итерация (Якоби):

Пресмятане на нормите, необходими за изчисляване на грешката:

B = (({{0, ((-1)/23), ((-2)/23)}, {-1/16, 0, 3/16}, {-2/9, 0, 0}})); b = {1./23,1./8,4./9};
n = Length[B];
Max[(∑_(j=1)^n)Abs[B[[1,j]]],(∑_(j=1)^n)Abs[B[[2,j]]],(∑_(j=1)^n)Abs[B[[3,j]]]]

Max[Abs[b]]

(Subscript[e, k]) = ||B((||)^k) (||(x^((0)))|| + ((||b||)/(1-||B||)))

B = (({{0, ((-1)/23), ((-2)/23)}, {-1/16, 0, 3/16}, {-2/9, 0, 0}})); b = {1./23,1./8,4./9};
x = {0,0,0};
For[k = 0, k ≤ 10, k++,
eps = ((((1/4)))^k)*(0.444444/(1-(1/4)));
Print["k = ",k," x = ",x," e = ",eps];
x = B.x+b]

Програма на доц. Боядциев:

B =(({{1.2, -.1, .2}, {.1, .9, .1}, {.1, .2, 1.1}})); b = {1,0,-1};
n = Length[b];
For[i = 1,i≤n,i++, 
b[[i]]=b[[i]]/B[[i,i]];
B[[i]] = -B[[i]]/B[[i,i]];
B[[i,i]]=0];
Print["ИП: (x^((k + 1))) = ", MatrixForm[B], ".(x^((k)))+",MatrixForm[b]]
x = {0.1,0,0};
For[k = 0, k ≤ 11, k++,
Print["k = ",k," x = ",x];
x = B.x+b]

B =(({{1.2, -.1, .2}, {.1, .9, .1}, {.1, .2, 1.1}})); b = {1,0,-1};
n = Length[b];
For[i = 1,i≤n,i++, 
b[[i]]=b[[i]]/B[[i,i]];
B[[i]] = -B[[i]]/B[[i,i]];
B[[i,i]]=0];
Print["ИП: (x^((k + 1))) = ", MatrixForm[B], ".(x^((k)))+",MatrixForm[b]]
x = {0.1,-1,2};
For[k = 0, k ≤ 11, k++,
Print["k = ",k," x = ",x];
x = B.x+b]

Пускаме програмата с друго начално прибижение:

B =(({{1.2, -.1, .2}, {.1, .9, .1}, {.1, .2, 1.1}})); b = {1,0,-1};
n = Length[b];
For[i = 1,i≤n,i++, 
b[[i]]=b[[i]]/B[[i,i]];
B[[i]] = -B[[i]]/B[[i,i]];
B[[i,i]]=0];
Print["ИП: (x^((k + 1))) = ", MatrixForm[B], ".(x^((k)))+",MatrixForm[b]]
x = {0.1,-10,2};
For[k = 0, k ≤ 20, k++,
Print["k = ",k," x = ",x];
x = B.x+b]

Тайни козове:

A = (({{0.95, -0.1, 0.1}, {0.15, 1.1, -0.05}, {-0.1, 0.1, 1.05}}));
LinearSolve[A,b]

A = (({{23, 1, 2}, {-1, -16, 3}, {4, 0, 18}}));b={1.,-2.,8.};
LinearSolve[A,b]