直接法 matlab,线性方程组直接解法MATLAB仿真

在《数值分析》第四章提到的求解线性方程组直接解法有Cramer法则,Gauss消元法,LU分解法,Gauss-Jordan消元法,Cholesky分解法、追赶法等等,在这里我主要通过编写Gauss列主元消元法,LU分解法,Cholesky分解法的程序来实现对线性方程组的求解。

1.Gauss列主元消元法

1.1.实验原理

在采用Guass消去法的时候,主元绝对值的大小将影响到计算结果,主元的绝对值越大,算法的稳定性越好,列主元消去法matlab程序设计思路为:

1)构造需要计算的矩阵,得到增广矩阵Ab;

2)将系数矩阵A的每一列的绝对值最大的元素换到列对角线上,矩阵b中的元素也随之改变,先判断主元是否为0,然后再利用此主元逐行消去此主元所在列中的元素,矩阵b中的元素也随之改变;

3)经过n-1步运算后,矩阵A就变换成一个上三角矩阵,从最后一行进行逐次回代,计算方程组的解。

1.2.实验程序

%高斯列主元消元法求解线性方程组Ax=b

%A为输入矩阵系数,b为方程组右端系数

%方程组的解保存在变量x中

clear;clc;

A=[2,1,2;

5,-1,1;

1,-3,-4]%系数矩阵

b=[5,8,-4]'%n维向量

[m,n]=size(A);

%先检查系数正确性

if m~=n

error('矩阵A的行数和列数必须相等');

return;

end

if m~=size(b)

error('b的大小必须和A的行数或者A的列数相等');

return;

end

%检查方程是否存在唯一解

if rank(A)~=rank([A,b])

error('A的矩阵的秩和增广矩阵的秩不相等,方程不存在唯一解');

return;

end

c=n+1;

A(:,c)=b; %(增广)

for k=1:n-1

[r,m]=max(abs(A(k:n,k))); %选主元

m=m+k-1; %修正操作行的值

if(A(m,k)~=0)

if(m~=k)

A([k m],:)=A([m k],:); %换行

end

A(k+1:n,k:c)=A(k+1:n, k:c)-(A(k+1:n,k)/ A(k,k))*A(k, k:c);%消去

end

end

x=zeros(length(b),1); %回带求解

x(n)=A(n,c)/A(n,n);

for k=n-1:-1:1

x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);

end

disp('高斯列主元消元法得线性方程组的解为:');

disp('X=');

disp(x);

1.3.实验结果

我们拿《数值分析》课本第117页的例题4.2.2来试试

例4.2.2 求解线性方程组(系数矩阵和n维列矩阵看图片,矩阵编辑不进博客)

a4c26d1e5885305701be709a3d33442f.png

2.LU分解法

2.1.实验原理

设A为n阶矩阵,如果A的各阶顺序主子式Di

≠0(i=1,2,···,n),则A可分解为一个单位下三角矩阵L和一个上三角矩阵U的乘积,且这种分解是唯一的。

2.2.实验程序

%LU分解法求解线性方程组Ax=b

%A为输入矩阵系数,b为方程组右端系数

%方程组的解保存在变量x中

clear;clc;

A=[1 0 2 0;

0 1 0 1;

1 2 4 3;

0 1 0 3]

%系数矩阵

b=[5 3 17 7]' %n维向量

[m,n]=size(A);

L=zeros(m,m);

temp=0;

for ii=1:m

for

jj=ii+1:m

temp=A(jj,ii)/A(ii,ii);

L(jj,ii)=temp;

for kk=ii:m

A(jj,kk)=A(jj,kk)-A(ii,kk)*temp;

end

b(jj,1)=b(jj,1)-b(ii,1)*temp;

end

end

for ii=1:m

L(ii,ii)=1;

end

disp('LU分解法得单位下三角矩阵L为:');

disp('L=');

disp(L); %显示LU分解后的L,单位下三角矩阵

disp('LU分解法得上三角矩阵U为:');

disp('U=');

U=A;

disp(U); %显示LU分解后的U,上三角矩阵

%回代结果

x=zeros(m,1);

x(m,1)=b(m,1)/U(m,m);

sum=0;

for ii=m-1:-1:1

sum=0;

for

jj=ii+1:m

sum=sum+U(ii,jj)*x(jj,1);

end

x(ii,1)=(b(ii,1)-sum)/U(ii,ii);

end

%显示计算结果

disp('LU分解法算得线性方程组的解为:');

disp('X=');

disp(x);

2.3实验结果

我们拿《数值分析》2016年期末试题中的第六题的第(1)题来试试

(1).对下图方程组的系数矩阵做LU分解,其中L是单位下三角矩阵,U是上三角矩阵,并用此解求解线性方程组

a4c26d1e5885305701be709a3d33442f.png

3.Chlesky分解法

3.1.实验原理

若A为n阶对称正定矩阵,则存在唯一的主对角线元素都是正数的下三角矩阵L,使得 A=LLT

3.2.实验程序

%Cholesky消元法求解线性方程组Ax=b

%A为输入矩阵系数,b为方程组右端系数

%方程组的解保存在x变量中

clear;clc;

A=[0.01,0.02,-0.02;

0.02,0.13,0.11;

-0.02,0.11,0.65]

b=[-0.07 -0.02 1.06]'

n = length(b); L = zeros(n);

for k = 1 : n

delta =

A(k,k);

for j = 1 :

k-1

delta = delta - L(k,j)^2;

end

if delta <

1e-15

error('矩阵不正定,无法分解');

end

L(k,k) =

sqrt(delta);

for i = k+1 :

n

L(i,k) = A(i,k);

for j = 1 : k-1

L(i,k) = L(i,k) - L(i,j)*L(k,j);

end

L(i,k) = L(i,k)/L(k,k);

end

end

disp(' Cholesky消元法得下三角矩阵L为:');

disp('L=');

disp(L);

%解Ly = b

y = b;

y(1) = b(1)/L(1,1);

for i = 2:n

tempy = 0;

for k =

1:i-1

tempy = tempy + L(i,k)*y(k);

end

y(i) =

(b(i)-tempy)/L(i,i);

end

%解L'x = y;

x = y; x(n) = y(n)/L(n,n);

for i = n-1:-1:1

tempx = 0;

for k =

i+1:n

tempx = tempx + L(k,i)*x(k);

end

x(i) =

(y(i)-tempx)/L(i,i);

end

disp('Cholesky消元法得线性方程组的解为:');

disp('X=');

disp(x);

3.3.实验结果

我们拿《数值分析》2016年期末试题中的第六题的第(2)题来试试

(2).对下面方程组的系数矩阵做LLT分解,其中L是对角元素为正数的下三角矩阵,并用此分解求解线性方程组

a4c26d1e5885305701be709a3d33442f.png

你可能感兴趣的:(直接法,matlab)