当前位置:文档之家› 线性方程组数值解法总结

线性方程组数值解法总结

好久没来论坛,刚刚发现以前的帖子现在那么火很欣慰,谢谢大家支持!
今天趁着不想做其他事情,把线性方程组的数值解法总结下,有不足的地方希望大神指教!数学建模中也会用到线性方程组的解法,你会发现上10个的方程手动解得话把你累个半死,而且不一定有结果,直接用matlab的函数,可以,关键是你不理解用着你安心吗?你怎么知道解得对不对?
我打算开个长久帖子,直到讲完为止!这是第一讲,如有纰漏请多多直接,大家一起交流!线性方程组解法有两大类:直接法和迭代法
直接法是解精确解,这里主要讲一下Gauss消去法,目前求解中小型线性方程组(阶数不超过1000),它是常用的方法,一般用于系数矩阵稠密,而有没有特殊结构的线性方程组。

首先,有三角形方程组的解法引入Gauss消去法,下三角方程组用前代法求解,
这个很简单,就是通过第一个解第二个,然后一直这样直到解出最后一个未知数,代码如下:前代法:
function [b]= qiandai_method(L,b)
n=size(L,1); %n 矩阵L的行数
for j=1:n-1 %前代法求解结果存放在b中
b(j)=b(j)/L(j,j);
b(j+1:n)=b(j+1:n)-b(j)*L(j+1:n,j);
end
b(n)=b(n)/L(n,n);
上三角方程组用回代法,和前面一样就是从下面开始解x,代码:
后代法:
function [y]=houdai_method(U,y)
n=size(U,1); %n 矩阵L的行数
for j=n:-1:2 %后代法求解结果存放在y中
y(j)=y(j)/U(j,j);
y(1:j-1)=y(1:j-1)-y(j)*U(1:j-1,j);
end
y(1)=y(1)/U(1,1);
Gauss消去的前提就是这两个算法:
具体思想是把任何一个线性方程组的系数矩阵A,分解为一个上三角和一个下三角的乘积,即A=LU,其中L为下三角,U为上三角。

那么具体怎么做呢?
有高斯变换,什么是高斯变换?由于时间有限我不可能去输入公式,所以我用最平白的话把它描述出来。

你先想一下怎么把一个矩阵的某一列的从第j个分量后全部变0?
高斯变换就是通过每次一个矩阵Li把A的第i列对角线元素以下的都变为0,最后把这么多Li一次左乘起来就是一个矩阵L’=L(n-1)L(n-2)…L2L1,而L’A=U,
那么L=L’的转置,这样就得到了A得分解。

我们要求Ax=b
A=LU
因此可以利用前代法先求Ly=b,
得到y
Ux=y
回代法求解x,这样就可以得到线性方程组的解。

高斯消去:
function [b]=Gauss(A,b)
n=size(A,1);
for k=1:n-1
A(k+1:n,k)=A(k+1:n,k)/A(k,k);
A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-A(k+1:n,k)*A(k,k+1:n);
end
L=zeros(n,n); %L为下三角矩阵
U=zeros(n,n); %U为上三角矩阵
for i=1:n; %求解L,为A的对角下半部分
L(i+1:n,i)=A(i+1:n,i);
end
U=A-L;
L=L+eye(n); %将L的对角位置设为1
if(rank(L)<n||rank(U)<n) %提醒,如果L或U求出的秩小于n报错
error('输入的矩阵无法进行高斯分解(前代|后代法无法调用)');
end
n=size(b);
y=ones(n);
y=qiandai_method(L,b);
x=houdai_method(U,y);
给一个测试案例:
function test1
A = [ 1 3 6 8 9 2;
2 5
3 1 6 3;
3 6 1 2 8 5;
2 6 8 9
3 8;
5 8 9 3 2 3;
3 5 8 1 7 2];
b=[ 2; -3; 2;55;16;-6];
b=Gauss(A,b)
但是注意这个解法并不是完美的,如果A 的顺序主子式不是全为非奇异是不能得到精确解,而且误差非常大,所以下面会讲到选主元三角分解。

我今天就讲到这里,请继续关注第二讲!
谢谢
这些算法要熟练能随时写出来或者背默出来,当然是理解的基础上.。

相关主题