概述
说明:数值分析要考试了,把一些东西总结一下,留着以后看看,也加深理解一下。
1:直接求解:Gauss消去法,LU分解
2:迭代求解:jacobi,Gauss-Seidel ,超松弛法,共轭梯度法
3:特征值求解:幂法和反幂法
LU 分解
%%%LU 分解
function [A]=lu_ijk(A)%Doolittle分解 以对角线为分界限 两次for循环
[n,n]=size(A)
%L下三角+对角线是1
U为上三角
for i=1:n
%表示行数
第一行没有用
for j=2:i%第一次for循环消去对角线下面的元
从第二行开始进行
A(i,j-1)=A(i,j-1)/A(j-1,j-1);
for k=1:j-1
A(i,j)=A(i,j)-A(i,k)*A(k,j);
end
end
for j=i+1:n%第二次for循环 消去对角线上面的元
for k=1:i-1
A(i,j)=A(i,j)-A(i,k)*A(k,j);
end
end
end
end
高斯选主元消去法:把矩阵A,b放到一起,进行行变换。
%%高斯选主元消去法
c为上三角矩阵
最后一列为变化后的b
function c=guasslzy1(A,b)
c=[A,b'];
[m,m1]=size(c);
for k=1:m
[maxvalue,pos]=max(abs(c(k:m,k)));%选列主元
c([k,pos+k-1],:)=c([pos+k-1,k],:); %%行交换
for i=k+1:m
%K+1后的所有行
temp=c(i,k)/c(k,k);
for j=k:m+1
c(i,j)=c(i,j)-temp*c(k,j);
end
end
end
end
由于jacobi Gauss_Seidal和SOR方法很类似,只附上SOR
超松弛方法。
%%超松弛方法:w为权重[0 2]
function y=SOR(A,b,w)
[n,temp]=size(A);
k=0;
eps=2;
x=zeros(n,1);
while k<100 & eps>0.00005
x1=x;
disp(x1');
for i=1:n
s=0;
for j=1:i-1
s=s+A(i,j)*x(j);
end
for j=i:n
s=s+A(i,j)*x1(j);
end
x(i)=w*b(i)/A(i,i)-w*s/A(i,i)+x1(i);
end
eps=abs(x-x1);
k=k+1;
end
if
k>100
error('迭代次数太多');
else
y=x';
end
end
幂法程序:运用了原点平移加速技巧
function [v,lamuda,k,time]=powermethod2(A,t) %A为输入矩阵
t
为原点位移长度 t为0时为幂法
e1=clock;
I=eye(size(A));
B=A-t*I;
m=size(B);
v0=[1:1:m]';
k=0;lamuda1=0;
e=1;
while e>0.00001
[temp,pos]=max(abs(v0));%选取最大值
u=v0/v0(pos);%归一化 u
v=A*u;
v0=v;
k=k+1;
lamuda=v(pos)+t;
e=abs(lamuda-lamuda1);
lamuda1=lamuda;
end
v=v/max(abs(v));
e2=clock;
time=etime(e2,e1);
end
共轭梯度法
function [x k]=GETDF(A,b)%共轭梯度法y是最终解 K是迭代次数
b=b';
% 沿着共轭方向下降最快
e=2;
x=[1 1 1]';
k=0;
while e>0.00003
r=b-A*x;
p=r;
c=r'*r;
a=c/(p'*A*p);
x1=x+a*p;
r1=r-a*A*p;
temp=(r1'*r1)/c;
p1=r1-temp*p;
e=abs(r1);
x=x1;
r=r1;
p=p1;
k=k+1;
end
最后
以上就是大方铃铛为你收集整理的<数值分析>学习笔记的全部内容,希望文章能够帮你解决<数值分析>学习笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复