数值分析编程及运行结果高斯顺序消元法课案Word文件下载.docx
《数值分析编程及运行结果高斯顺序消元法课案Word文件下载.docx》由会员分享,可在线阅读,更多相关《数值分析编程及运行结果高斯顺序消元法课案Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
fori=(m-1):
-1:
1
x(i)=(A(i,n)-A(i,i+1:
m)*x(i+1:
m)'
)/A(i,i);
x
2.运行结果:
高斯选列主元消元法
1.程序:
numb=int2str(i);
次选列主元后的增广矩阵'
temp=max(abs(A(i:
m,i)));
[a,b]=find(abs(A(i:
m,i))==temp);
tempo=A(a
(1)+i-1,:
);
A(a
(1)+i-1,:
)=A(i,:
A(i,:
)=tempo
])
forj=(i+1):
m
A(j,:
end
A
disp('
)
x(m)=A(m,n)/A(m,m);
1
x(i)=(A(i,n)-A(i,i+1:
x
追赶法
1.程序:
function[x,L,U]=zhuiganfa(a,b,c,f)
a=input('
输入矩阵-1对角元素a='
b=input('
输入矩阵对角元素b='
c=input('
输入矩阵+1对角元素c='
f=input('
输入增广矩阵最后一列元素f='
n=length(b);
%对A进行分解
u
(1)=b
(1);
fori=2:
n
if(u(i-1)~=0)
l(i-1)=a(i-1)/u(i-1);
u(i)=b(i)-l(i-1)*c(i-1);
else
break;
end
L=eye(n)+diag(l,-1);
U=diag(u)+diag(c,1);
x=zeros(n,1);
y=x;
%求解Ly=b
y
(1)=f
(1);
y(i)=f(i)-l(i-1)*y(i-1);
%求解Ux=y
if(u(n)~=0)
x(n)=y(n)/u(n);
fori=n-1:
x(i)=(y(i)-c(i)*x(i+1))/u(i);
高斯-塞德尔迭代格式
1.程序:
functionx=Gauss_Seidel(a,b)
输入系数矩阵a='
输入增广矩阵最后一列b='
e=0.5e-7;
N=50;
t=zeros(n,1);
fork=1:
N
sum=0;
E=0;
t(1:
n)=x(1:
n);
fori=1:
x(i)=(b(i)-a(i,1:
(i-1))*x(1:
(i-1))-a(i,(i+1):
n)*t((i+1):
n))/a(i,i);
end
ifnorm(x-t)<
e
k
2.运行结果:
雅戈比迭代格式
functionx=Jocabi(a,b)
N=100;
y=zeros(n,1);
n
y(i)=(b(i)-a(i,1:
n)*x(1:
n)+a(i,i)*x(i))/a(i,i);
sum=sum+(y(i)-x(i))^2;
ifsqrt(sum)<
else
x(i)=y(i);
ifk==Nwarning('
未能找到近似解'
逐次超松弛法(SOR)
function[n,x]=sor22(A,b,X,nm,w,ww)
%用超松弛迭代法求解方程组Ax=b
%输入:
A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度,ww为松弛因子
%输出:
x为求得的方程组的解构成的列向量,n为迭代次数
输入系数矩阵A='
输入方程组右端的列向量b='
X=input('
输入迭代初值构成的列向量X='
nm=input('
输入最大迭代次数nm='
w=input('
输入误差精度w='
ww=input('
输入松弛因子ww='
n=1;
m=length(A);
D=diag(diag(A));
%令A=D-L-U,计算矩阵D
L=tril(-A)+D;
%令A=D-L-U,计算矩阵L
U=triu(-A)+D;
%令A=D-L-U,计算矩阵U
M=inv(D-ww*L)*((1-ww)*D+ww*U);
%计算迭代矩阵
g=ww*inv(D-ww*L)*b;
%计算迭代格式中的常数项
%下面是迭代过程
whilen<
=nm
x=M*X+g;
%用迭代格式进行迭代
ifnorm(x-X,'
inf'
)<
w
迭代次数为'
方程组的解为'
return;
%上面:
达到精度要求就结束程序,输出迭代次数和方程组的解
X=x;
n=n+1;
%下面:
如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)
在最大迭代次数内不收敛!
'
最大迭代次数后的结果为'
二分法求解方程的根
%其中a,b表示查找根存在的范围,M表示要求解函数的值
%f(x)表示要求解根的方程
%eps表示所允许的误差大小
functiony=er_fen_fa(a,b,M)
k=0;
eps=0.05
whileb-a>
eps
x=(a+b)/2;
%检查是否大于值
if((x^3)-3*x-1)>
M
b=x
a=x
k=k+1
Newton迭代法(切线法)
functionx=nanewton(fname,dfname,x0,e,N)
%newton迭代法解方程组
%fname和dfname分别表示F(x)及其导函数的M函数句柄或内嵌函数,x0为迭代初值,e为精度要求
x=x0;
x0=x+2*e;
ifnargin<
5,N=500;
4e=1e-4;
whileabs(x0-x)>
e&
k<
N,
k=k+1;
x0=x;
x=x0-feval(fname,x0)/feval(dfname,x0);
disp(x)
ifk==N,warning('
已达迭代次数上限'
割线方式迭代法
functionx=ge_xian_fa(fname,dfname,x0,x1,e,N)
%割线方式迭代法解方程组
%fname和dfname分别表示F(x)及其导函数的M函数句柄或内嵌函数,x0,x1分别为迭代初值,e为精度要求
a=x1;
b=x0;
whileabs(a-b)>
x=x1-((x1-x0)/(feval(fname,x1)-feval(fname,x0)))*feval(fname,x1);
iffeval(fname,x)*feval(fname,x0)>
0,
x1=x;
numb=int2str(k);
disp(['
次计算后x='
fprintf('
%f\n\n'
x);
Newton插值
%保存文件名为New_Int.m
%Newton基本插值公式
%x为向量,全部的插值节点
%y为向量,差值节点处的函数值
%xi为标量,是自变量
%yi为xi出的函数估计值
functionyi=newton_chazhi(x,y,xi)
n=length(x);
m=length(y);
ifn~=m
error('
ThelengthsofXangYmustbeequal!
return;
%计算均差表Y
Y=zeros(n);
Y(:
1)=y'
;
n-1
n-k
ifabs(x(i+k)-x(i))<
theDATAiserror!
Y(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i));
%计算牛顿插值公式
yi=0;
z=1;
i-1
z=z*(xi-x(k));
yi=yi+Y(1,i)*z;
Lagrange插值
functiony0=Language(x,y,x0)
symstl;
iflength(x)==length(y)
n=length(x);
else
x和y的维数不相等!
%检错
h=sym(0);
l=sym(y(i));
forj=1:
l=l*(t-x(j))/(x(i)-x(j));
end;
forj=i+1:
h=h+l;
simplify(h);
ifnargin==3
y0=subs(h,'
t'
x0);
%计算插值点的函数值