概述
利用上下三角分解的方法解方程
解线性方程的直接法是指在无舍入误差存在的情况下,经过有限步计算即可求得方程组精确解的算法,这种方法是通过矩阵约化将原方程组化成与之等价的三角形方程组或者其他形式的可以直接求解的方程组而实现的。今天用的代码就是用了消元的思想。
主元消去法
简单的知识储备
- 定理 设A的前n-1个顺序主子阵非奇异,则存在单位下三角矩阵L及上三角矩阵U,使得A=LU,而且这样的分解是唯一的。
在很多时候这样的分解不能够直接的实现,这个时候要使用主元消去法,从第一列开始选取绝对值最大的元素所在行作为主元,对其他行进行消元,直至最后一列,实现代码如下。
function y=principal(A)
%A是系数矩阵,b是方程组右侧的列向量
%化简方程
n = length(A);
A = [A';B]';
for i=1:n-1
[m,s]=max(abs(A(i:n,i)));
s = s+i-1
while(m)
A([s,i],:)=A([i,s],:);
for j=i+1:n
A(j,:)=A(j,:)-A(i,:)*A(j,i)/A(i,i);
end
m=0;
end
end
B = A(1:n,1:n);
%计算方程
for i=n:-1:2
A(i,:)=A(i,:)/A(i,i);
for j=i-1:-1:1
A(j,:)=A(j,:)-A(i,:)*A(j,i)/A(i,i);
end
end
A(1,:)=A(1,:)/A(1,1);
y = A(:,n+1);
Cholesky分解
对于一些特殊的情况是不需要选取主元的,例如系数矩阵为严格对角占优或者不可约对角占优矩阵。
当系数矩阵为对称正定矩阵的时候,也不用选取主元。
可以将其分解为LL’的形式,此时L不一定是单位下三角矩阵,代码实现如下。
function l=Cholesky(A) %A是分解的矩阵
n = length(A);
l = zeros(n);
for j = 1:n
if j == 1
l(j,j) = sqrt(A(1,1));
else
for k=1:j-1
l(j,j) = l(j,j)+l(j,k)^2;
end
l(j,j) = sqrt(A(j,j)- l(j,j));
end
for i = j+1:n
for k=1:j-1
l(i,j) = l(i,k)*l(j,k);
end
l(i,j) = (A(i,j)-l(i,j))/l(j,j);
end
end
该分解方法可以与追赶法相结合进行方程组的求解,即将方程Ax=b问题转化为解Ly=b和L’x=y;
实现的代码如下。
function y= question6(l,b) %b是方程组右侧的列向量
L = l;
n = length(L);
y = zeros(1,n);
y(1) = b(1)/L(1,1);
for i=2:n
y(i) = (b(i)-L(i,i-1)*y(i-1))/L(i,i);
end
L = l';
y(n)=y(n)/L(n,n);
for i=n-1:-1:1
y(i) = (y(i)-L(i,i+1)*y(i+1))/L(i,i);
end
这次的内容主要参考了冯国忱和黄明游老师的数值分析,这本书写的很精妙,还有很多东西是我读不懂的,编程也编了很久,其实还是平常的时间花费的不够,继续加油!
最后
以上就是柔弱抽屉为你收集整理的丁丁的Matlab学习笔记20191214 三角分解解方程利用上下三角分解的方法解方程的全部内容,希望文章能够帮你解决丁丁的Matlab学习笔记20191214 三角分解解方程利用上下三角分解的方法解方程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复