【免费下载】数值分析的几个简单算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析的几个简单算法实现 Matlab6.5
function x=Aitken(fname,x0,N,e)
k=1;e=1e-5;x2=x0+2*e;
while abs(x2-x0)>e&k x1=feval(x0);x2=feval(x1); x2=x2-(x2-x1)^2/(x2-2*x1+x0); k=k+1; x2=x0;end; disp(x2); if k==N,warning('迭代失败');end; end %迭代法diedai.m文件 function x=diedai(fname,x0,e,N) if nargin<5;N<500;end; if nargin<4;e=1e-4;end; x=x0;x0=x+2*e;e=1e-5;k=1; while abs(x0-x)>e&k x=feval(fname,x0); k=k+1; x0=x; disp(x); end if k==N,warning('迭代失败');end %二分法erfenfa.m function x=erfenfa(fname,a,b,e) y0=feval(fname,a);e=1e-5; while (b-a)>e x=(a+b)/2; y=feval(fname,x); if y*y0>0 a=x; else b=x; end disp(x); end %牛顿法 function x=newton(fname,dfname,x0,e,N) if nargin<5;N<500;end; if nargin<4;e=1e-4;end; x=x0;x0=x+2*e;k=0; while abs(x0-x)>e&k k=k+1; x0=x;x=x0-feval(fname,x0)/feval(dfname,x0); disp(x); end if k==N,warning('已达迭代次数上限');end % format long; newton(inline('exp(x)-4*cos(x)'),inline('exp(x)+4*sin(x)'),pi/4,1e-4,20) function t=Rombeg(fname,a,b,e) %用途:龙贝格法求函数积分 %格式:t=Rombeg(fname,a,b,e) fname是被积函数,a,b分别为下上限,e为精度(默认1e-4) if nargin<4,e=1e-4;end; i=1;j=1;h=b-a; T(i,1)=h/2*(feval(fname,a)+feval(fname,b)); T(i+1,1)=T(i,1)/2+sum(feval(fname,a+h/2:h:1-h/2+0.001*h))*h/2; T(i+1,j+1)=4^j*T(i+1,j)/(4^j-1)-T(i,j)/(4^j-1); while abs(T(i+1,i+1)-T(i,i))>e i=i+1;h=h/2; T(i+1,1)=T(i,1)/2+sum(feval(fname,a+h/2:h:1-h/2+0.001*h))*h/2; for j=1:i T(i+1,j+1)=4^j*T(i+1,j)/(4^j-1)-T(i,j)/(4^j-1); end end T t=T(i+1,j+1); % format long;Rombeg(inline('sin(x)./x'),eps,1,1e-6) function x=gaussseidel(A,b,x0,e,N) %用途:用向量形式的gauss-seidel迭代解线性方程组Ax=b if nargin<5,N=500;end x=x0;x0=x+2*e; k=0;A1=tril(A);A2=inv(A1); while norm(x0-x,inf)>e&k k=k+1; x0=x;x=-A2*(A-A1)*x0+A2*b; disp(x') end if k==N,warning('已达到迭代次数上限'); end >> x=gaussseidel(A,b,[1 1 1]',1e-6) function x=sor(A,b,omega,x0,e,N) %用途:用分量形式的sor迭代解线性方程组Ax=b n=length(b); if nargin<6,N=500;end x=x0;x0=x+2*e; k=0;L=tril(A,-1);U=triu(A,1); while norm(x0-x,inf)>e&k k=k+1 x0=x; for i=1:n x1(i)=(b(i)-L(i,1:i-1)*x(1:i-1,1)-U(i,i+1:n)*x0(i+1:n,1))/A(i,i); x(i)=(1-omega)*x0(i)+omega*x1(i); end disp(x') end if k==N,warning('已达到迭代次数上限'); end >> sor(A,b,1.45,[1 1 1]',1e-6) function x=jacobi(A,b,x0,e) %用途:用分量形式的sor迭代解线性方程组Ax=b n=length(b); x=x0;x0=x+2*e; k=0;L=tril(A,-1);U=triu(A,1); while norm(x0-x,inf)>e, k=k+1; x0=x; for i=1:n x(i)=(b(i)-L(i,1:i-1)*x0(1:i-1,1)-U(i,i+1:n)*x0(i+1:n,1))/A(i,i); end disp(k)