直接法
1.利用左除運算符的直接解法
== Ax=b→x=A\b==
ps:如果矩陣A是奇異的或者接近奇異的,則matlab會給出警告。
利用矩陣分解求解線性方程組
主要介紹LU分解(方陣爲非奇異的)
將一個n階矩陣表示爲一個下三角陣和一個上三角陣的乘積
[L,U]=lu(A)
:產生一個上三角陣U和一個變換形式的下三角陣L,使之滿足A=LU。(A必須爲方陣)[L,U,P]=lu(A)
:產生一個上三角陣U和一個變換形式的下三角陣L一個以及置換矩陣P,使之滿足PA=LU。(A必須爲方陣)
使用LU分解後
例子:
做除法
A=[2 1 -5 1;1 -5 0 7;0 2 1 -1;1 6 -1 -4];
b=[13;-9;6;0];%列向量
x=A\b
結果:
x =
-66.555555555555543
25.666666666666664
-18.777777777777775
26.555555555555550
LU分解
A=[2 1 -5 1;1 -5 0 7;0 2 1 -1;1 6 -1 -4];
b=[13;-9;6;0];
[L,U]=lu(A);
x=U\(L\b)
結果和上面相同
迭代法
這裏只介紹實際用法,在使用時要考慮算法的收斂性。
雅可比迭代法
function [y,n] = jacobi(A,b,x0,ep)
%雅可比迭代函數
%()內參數分別爲:係數陣、右端列向量、迭代的初值和精度
%[]內分別爲方程的解和迭代次數
D=diag(diag(A));%A對角陣
L=-tril(A,-1);%A下三角陣
U=-triu(A,1);%A上三角陣
B=D\(L+U);
f=D\b;
y=B*x0+f;%第一次迭代結果
n=1;%迭代次數置1
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
end
高斯迭代法
function [y,n]=gauseidel(A,b,x0,ep)
%高斯迭代法
%()內參數分別爲:係數陣、右端列向量、迭代的初值和精度
%[]內分別爲方程的解和迭代次數
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=(D-L)\U;
f=(D-L)\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
A=[4 -2 -1;-2 4 3;-1 -3 3];
b=[1;5;0];
[x,n]=jacobi(A,b,[0,0,0]',1.0e-6)
[x,n]=gauseidel(A,b,[0,0,0]',1.0e-6)
結果:
x =
0.970588483091126
0.852941039929380
1.176470992801838
n =35
x =
0.970588105856975
0.852941168882785
1.176470537501776
n = 16