计算方法第一次上机作业
(完整版)数值计算方法上机实习题答案

(完整版)数值计算⽅法上机实习题答案1.设?+=105dx xx I nn ,(1)由递推公式nI I n n 151+-=-,从0I 的⼏个近似值出发,计算20I ;解:易得:0I =ln6-ln5=0.1823, 程序为:I=0.182; for n=1:20I=(-5)*I+1/n; end I输出结果为:20I = -3.0666e+010 (2)粗糙估计20I ,⽤nI I n n 515111+-=--,计算0I ;因为 0095.056 0079.01020201020≈<<≈??dx x I dx x 所以取0087.0)0095.00079.0(2120=+=I 程序为:I=0.0087; for n=1:20I=(-1/5)*I+1/(5*n); end I0I = 0.0083(3)分析结果的可靠性及产⽣此现象的原因(重点分析原因)。
⾸先分析两种递推式的误差;设第⼀递推式中开始时的误差为000I I E '-=,递推过程的舍⼊误差不计。
并记nn n I I E '-=,则有01)5(5E E E n n n -==-=-Λ。
因为=20E 20020)5(I E >>-,所此递推式不可靠。
⽽在第⼆种递推式中n n E E E )51(5110-==-=Λ,误差在缩⼩,所以此递推式是可靠的。
出现以上运⾏结果的主要原因是在构造递推式过程中,考虑误差是否得到控制,即算法是否数值稳定。
2.求⽅程0210=-+x e x的近似根,要求41105-+?<-k k x x ,并⽐较计算量。
(1)在[0,1]上⽤⼆分法;程序:a=0;b=1.0;while abs(b-a)>5*1e-4 c=(b+a)/2;if exp(c)+10*c-2>0 b=c; else a=c; end end c结果:c =0.0903(2)取初值00=x ,并⽤迭代1021x k e x -=+;程序:x=0; a=1;while abs(x-a)>5*1e-4 a=x;x=(2-exp(x))/10; end x结果:x =0.0905(3)加速迭代的结果;程序:x=0; a=0;b=1;while abs(b-a)>5*1e-4 a=x;y=exp(x)+10*x-2; z=exp(y)+10*y-2;x=x-(y-x)^2/(z-2*y+x); b=x; end x结果:x =0.0995(4)取初值00=x ,并⽤⽜顿迭代法;程序:x=0; a=0;b=1;while abs(b-a)>5*1e-4 a=x;x=x-(exp(x)+10*x-2)/(exp(x)+10); b=x; end x结果: x =0.0905(5)分析绝对误差。
《计算方法》上机实验试题

《计算方法》上机实验试题
1. (25分)计算积分
dx x x I n n ⎰
+=105, n=0,1,2,…,20 若用下列两种算法 (A) n I I n n 151+
-=- (B) ⎪⎭
⎫ ⎝⎛-=-n n I n I 1511 试依据积分I n 的性质及数值结果说明何种算法更合理。
2. (25分)求解方程f(x)=0有如下牛顿迭代公式
)()(111---'-
=n n n n x f x f x x , n ≥1,x 0给定 (1) 编制上述算法的通用程序,并以ε<--1n n x x (ε为预定精度)作为终止迭
代的准则。
(2)
利用上述算法求解方程 0cos :)(=-=x x x f
这里给定x 0=π/4,且预定精度ε=10-10。
3. (25分) 已知)3()(x x e x e x f -=,
(1)
利用插值节点x 0=1.00,x 1=1.02,x 2=1.04,x 3=1.06,构造三次Lagrange 插值公式,由此计算f(1.03)的近似值,并给出其实际误差; (2) 利用插值节点x 0=1,x 1=1.05构造三次Hermite 插值公式,由此计算f(1.03)的近
似值,并给出其实际误差。
4. (25分) 利用Romberg 算法计算积分
⎰
+4802cos 1dx x
精确到10
-4
总体要求:打印各题的程序代码及数值结果。
计算方法上机题答案

2.用下列方法求方程e^x+10x-2=0的近似根,要求误差不超过5*10的负4次方,并比较计算量(1)二分法(局部,大图不太看得清,故后面两小题都用局部截图)(2)迭代法(3)牛顿法顺序消元法#include<stdio.h>#include<stdlib.h>#include<math.h>int main(){ int N=4,i,j,p,q,k; double m;double a[4][5]; double x1,x2,x3,x4; for (i=0;i<N ;i++ )for (j=0;j<N+1; j++ )scanf("%lf",&a[i][j]);for(p=0;p<N-1;p++) {for(k=p+1;k<N;k++){m=a[k][p]/a[p][p];for(q=p;q<N+1;q++)a[k][q]=a[k][q]-m*a[p][q];}}x4=a[3][4]/a[3][3];x3=(a[2][4]-x4*a[2][3])/a[2][2];x2=(a[1][4]-x4*a[1][3]-x3*a[1][2])/a[1][1];x1=(a[0][4]-x4*a[0][3]-x3*a[0][2]-x2*a[0][1])/a[0][0];printf("%f,%f,%f,%f",x1,x2,x3,x4);scanf("%lf",&a[i][j]); (这一步只是为了看到运行的结果)}运行结果列主元消元法function[x,det,flag]=Gauss(A,b)[n,m]=size(A);nb=length(b);flag='OK';det=1;x=zeros(n,1);for k=1:n-1 max1=0;for i=k:nif abs(A(i,k))>max1max1=abs(A(i,k));r=i;endendif max1<1e-10flag='failure';return;endif r>kfor j=k:nz=A(k,j);A(k,j)=A(r,j);A(r,j)=z;endz=b(k);b(k)=b(r);b(r)=z;det=-det; endfor i=k+1:nm=A(i,k)/A(k,k);for j=k+1:nA(i,j)=A(i,j)-m*A(k,j);endb(i)=b(i)-m*b(k);enddet=det*A(k,k);enddet=det*A(n,n)if abs(A(n,n))<1e-10flag='failure';return;endx(n)=b(n)/A(n,n);for k=n-1:-1:1for j=k+1:nb(k)=b(k)-A(k,j)*x(j);endx(k)=b(k)/A(k,k);end运行结果:雅可比迭代法function y=jacobi(a,b,x0) D=diag(diag(a));U=-triu(a,1);L=-tril(a,-1);B=D\(L+U);f=D\b;y=B*x0+f;n=1;while norm(y-x0)>1e-4 x0=y;y=B*x0+f;n=n+1;endyn高斯赛德尔迭代法function y=seidel(a,b,x0) D=diag(diag(a));U=-triu(a,1);L=-tril(a,-1);G=(D-L)\U;f=(D-L)\b;y=G*x0+f;n=1;while norm(y-x0)>10^(-4) x0=y;y=G*x0+f;n=n+1;endynSOR迭代法function y=sor(a,b,w,x0)D=diag(diag(a));U=-triu(a,1);L=-tril(a,-1);lw=(D-w*L)\((1-w)*D+w*U); f=(D-w*L)\b*w;y=lw*x0+f;n=1;while norm(y-x0)>10^(-4) x0=y;y=lw*x0+f;n=n+1;endyn1.分段线性插值:function y=fdxx(x0,y0,x)p=length(y0);n=length(x0);m=length(x);for i=1:mz=x(i);for j=1:n-1if z<x0(j+1)break;endendy(i)= y0(j)*(z-x0(j+1))/(x0(j)-x0(j+1))+y0(j+1)*(z-x0(j))/(x0(j+1)-x0(j));fprintf('y(%d)=%f\nx1=%.3fy1=%.3f\nx2=%.3fy2=%.3f\n\n',i,y(i),x0(j),y0(j),x0(j+1),y0(j+1));endend结果0.39404 0.38007 0.356932.分段二次插值:function y=fdec(x0,y0,x)p=length(y0);n=length(x0);m=length(x);for i=1:mz=x(i);for j=1:n-1if z<x0(j+1)break;endendif j<2j=j+1;elseif (j<n-1)if (abs(x0(j)-z)>abs(x0(j+1)-z))j=j+1;elseif ((abs(x0(j)-z)==abs(x0(j+1)-z))&&(abs(x0(j-1)-z)>abs(x0(j+2)-z)))j=j+1;endendans=0.0;for t=j-1:j+1a=1.0;for k=j-1:j+1if t~=ka=a*(z-x0(k))/(x0(t)-x0(k));endendans=ans+a*y0(t);endy(i)=ans;fprintf('y(%d)=%f\n x1=%.3f y1=%.3f\n x2=%.3f y2=%.3f\n x3=%.3f y3=%.3f\n\n',i,y(i),x0(j-1),y0(j-1),x0(j),y0(j),x0(j+1),y0(j+1));endend结果为0.39447 0.38022 0.357253.拉格朗日全区间插值function y=lglr(x0,y0,x)p=length(y0);n=length(x0);m=length(x);for t=1:mans=0.0;z=x(t);for k=1:np=1.0;for q=1:nif q~=kp=p*(z-x0(q))/(x0(k)-x0(q));endendans=ans+p*y0(k);endy(t)=ans;fprintf('y(%d)=%f\n',t,y(t));endend结果为0.39447 0.38022 0.35722function [p,S,mu] = polyfit(x,y,n)if ~isequal(size(x),size(y))errorendx = x(:);y = y(:);if nargout > 2mu = [mean(x); std(x)];x = (x - mu(1))/mu(2);endV(:,n+1) = ones(length(x),1,class(x));for j = n:-1:1V(:,j) = x.*V(:,j+1);end[Q,R] = qr(V,0);ws = warning;p = R\(Q'*y); warning(ws);if size(R,2) > size(R,1)warning;elseif warnIfLargeConditionNumber(R)if nargout > 2warning;elsewarning;endendif nargout > 1r = y - V*p;S.R = R;S.df = max(0,length(y) - (n+1));S.normr = norm(r);endp = p.';function flag = warnIfLargeConditionNumber(R) if isa(R, 'double')flag = (condest(R) > 1e+10);elseflag = (condest(R) > 1e+05);endx=[1,3,4,5,6,7,8,9,10];y=[10,5,4,2,1,1,2,3,4];p=polyfit(x,y,2);y=poly2sym(p);a=-p(1)/p(2)*0.5;xa=-p(2)/(2*p(1));min=(4*p(1)*p(3)-p(2)^2)/(4*p(1)); yxamin运行截图运行结果function [I] = CombineTraprl(f,a,b,eps)if(nargin ==3)eps=1.0e-4;endn=1;h=(b-a)/2;I1=0;I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))/h; while abs(I2-I1)>epsn=n+1;h=(b-a)/n;I1=I2;I2=0;for i=0:n-1x=a+h*i;x1=x+h;I2=I2+(h/2)*(subs(sym(f),findsym(sym(f)),x)+subs(sym( f),findsym(sym(f)),x1));endendI=I2;程序:>> [q]=CombineTraprl('(1-exp(-x))^0.5/x'10^-12,1)结果:q =1.8521欧拉方法function [x,y]=euler(fun,x0,xfinal,y0,n);if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;for i=1:nx(i+1)=x(i)+h;y(i+1)=y(i)+h*feval(fun,x(i),y(i));end程序:[x,y]=euler('doty',0,1,1,10)结果:改进欧拉方法function [x,y]=eulerpro(fun,x0,xfinal,y0,n); if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;x(i+1)=x(i)+h;y1=y(i)+h*feval(fun,x(i),y(i));y2=y(i)+h*feval(fun,x(i+1),y1);y(i+1)=(y1+y2)/2;end程序:>> [x,y]=eulerpro('doty',0,1,1,10)结果:经典RK法function [x,y]=RungKutta4(dyfun,xspan,y0,h) x=xspan(1):h:xspan(2);y(1)=y0;for n=1:length(x)-1k1=feval(dyfun,x(n),y(n));k2=feval(dyfun,x(n)+h/2,y(n)+h/2*k1);k3=feval(dyfun,x(n)+h/2,y(n)+h/2*k2);k4=feval(dyfun,x(n+1),y(n)+h*k3);y(n+1)=y(n)+h*(k1+2*k2+2*k3+k4)/6; end程序:dyfun=inline('(2*x*y^-2)/3');[x,y]=RungKutta4(dyfun,[0,1],1,0.1)标准函数x(1)=0;h=0.1;for i=1:10y(i)=(1+x(i)^2)^(1/3); endxY结果:。
计算方法上机作业集合

第一次&第二次上机作业上机作业:1.在Matlab上执行:>> 5.1-5-0.1和>> 1.5-1-0.5给出执行结果,并简要分析一下产生现象的原因。
解:执行结果如下:在Matlab中,小数值很难用二进制进行描述。
由于计算精度的影响,相近两数相减会出现误差。
2.(课本181页第一题)解:(1)n=0时,积分得I0=ln6-ln5,编写如下图代码从以上代码显示的结果可以看出,I 20的近似值为0.7465(2)I I =∫I I 5+I 10dx,可得∫I I 610dx ≤∫I I 5+I 10dx ≤∫I I 510dx,得 16(I +1)≤I I ≤15(I +1),则有1126≤I 20≤1105, 取I 20=1105,以此逆序估算I 0。
代码段及结果如下图所示(3)从I20估计的过程更为可靠。
首先根据积分得表达式是可知,被积函数随着n的增大,其所围面积应当是逐步减小的,即积分值应是随着n的递增二单调减小的,(1)中输出的值不满足这一条件,(2)满足。
设I I表示I I的近似值,I I-I I=(−5)I(I0−I0)(根据递推公式可以导出此式),可以看出,随着n的增大,误差也在增大,所以顺序估计时,算法不稳定性逐渐增大,逆序估计情况则刚好相反,误差不断减小,算法逐渐趋于稳定。
2.(课本181页第二题)(1)上机代码如图所示求得近似根为0.09058 (2)上机代码如图所示得近似根为0.09064;(3)牛顿法上机代码如下计算所得近似解为0.09091第三次上机作业上机作业181页第四题线性方程组为[1.13483.83260.53011.78751.16513.40172.53301.54353.41294.93171.23714.99988.76431.314210.67210.0147][I1I2I3I4]=[9.53426.394118.423116.9237](1)顺序消元法A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];上机代码(函数部分)如下function [b] = gaus( A,b )%用b返回方程组的解B=[A,b];n=length(b);RA=rank(A);RB=rank(B);dif=RB-RA;if dif>0disp('此方程组无解');returnendif RA==RBif RA==nformat long;disp('此方程组有唯一解');for p=1:n-1for k=p+1:nm=B(k,p)/B(p,p);B(k,p:n+1)=B(k,p:n+1)-m*B(p,p:n+1);endend %顺序消元形成上三角矩阵b=B(1:n,n+1);A=B(1:n,1:n);b(n)=b(n)/A(n,n);for q=n-1:-1:1b(q)=(b(q)-sum(A(q,q+1:n)*b(q+1:n)))/A(q,q);end %回代求解elsedisp('此方程组有无数组解');endend上机运行结果为>>A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];>> X=gaus(A,b)此方程组有唯一解X =1.00001.00001.00001.0000>>(2)列主元消元法A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];函数部分代码如下function [b] = lieZhu(A,b )%用b返回方程组的解B=[A,b];RA=rank(A);RB=rank(B);n=length(b);dif=RB-RA;format long;if dif>0disp('该方程组无解');returnendif dif==0if RA==ndisp('该方程组有唯一解');c=zeros(1,n);for i=1:n-1max=abs(A(i,i));m=i;for j=i+1:nif max<abs(A(j,i))max=abs(A(j,i));m=j;endend %求出每一次消元时绝对值最大的一行的行号 if m~=ifor k=i:nc(k)=A(i,k);A(i,k)=A(m,k);A(m,k)=c(k);endd1=b(i);b(i)=b(m);b(m)=d1;%函数值跟随方程一起换位置endfor k=i+1:nfor j=i+1:nA(k,j)=A(k,j)-A(i,j)*A(k,i)/A(i,i);endb(k)=b(k)-b(i)*A(k,i)/A(i,i);A(k,i)=0;endend %完成消元操作,形成上三角矩阵b(n)=b(n)/A(n,n);for i=n-1:-1:1sum=0;for j=i+1:nsum=sum+A(i,j)*b(j);endb(i)=(b(i)-sum)/A(i,i) ;%回代求解其他未知数endendelsedisp('此方程组有无数组解');endend上机运行,结果为>>A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];X=lieZhu(A,b)该方程组有唯一解X =1.00001.00020.99990.9999>>根据两种方法运算结果,顺序消元法得到结果比列主元消元法得到的结果精度更高。
应用计算方法

结果分析:比较发现,经过两种改进迭代法,求重根时迭代速度明显加快。
3-4 试验目的体验 Steffensen’s method 加速技巧 试验内容:先用 Newton 法求解方程 x-tanx=0 再用 Steffensen 法求解,比较迭代步数。精确到 10-4。 迭代公式: P(k+1)=P(k)-(P(k)-tan(P(k)))/(1-(sec(P(k)))^2) 初值 P0=1 Newton 法: function [ p,k ]=fnewton( p0,max,tol ) for k=1:max p=p0-(p0-tan(p0))/(1-(sec(p0))^2); if abs(p-p0)<tol break; end p0=p; end disp(p); disp(k) % fnewton( 1,100,10^(-4) ) Steffensen 法: function [ p1,k ]=steffensen( p0,max,tol ) n=1; p(1)=p0; while n<=max for k=1:2 p(k+1)=p(k)-(p(k)-tan(p(k)))/(1-(sec(p(k)))^2); end p1=p(1)-(p(2)-p(1))^2/(p(3)-2*p(2)+p(1)); f0=p1-(p1-tan(p1))/(1-(sec(p1))^2); if abs(f0)<tol break; end n=n+1; p(1)=p1; end disp(p1); disp(n) % steffensen( 1,100,10^(-4) ) >> steffensen( 1,100,10^(-4) ) -1.3387e-07 3
3-2 试验目的:考察 Newton 法求单根的收敛速度 应用 Newton 迭代法求 3-1 中的方程,并与 3-1 中的迭代法相比较,考察收敛速度。精确到时 10-4 迭代公式: P(k+1)= P(k)-(2P(k)-eP(k)+3)/(2- eP(k)) 初值 P0=1 和-1。 Newton 法: function [ p,k ] = fnewton( p0,max,tol ) for k=1:max p=p0-(2*p0-exp(p0)+3)/(2-exp(p0)); if abs(p-p0)<tol break; end
计算方法大作业1 克服Runge现象

x3
x2
x
1
S1 ( x)
-0.34685
0.2086
0.073964
0.038462
S2 (x)
S (xi 0 ) S x(i 0 )
S
'
(xi
0) S
xi' (
0 )i
S
'
'
x(i
0)S
xi' ' (
0)
1 ,n2, . . . , 1
(1)
这里共有了 3n-3 个条件,再加上条件(2)中的 n+1 个插值条件,共有 4n-2 个条件,
因此还需要 2 个方程才能确定 S (x) .通常可在区间[a, b]的端点 a x0,b xn 上各加一个边
dn1
1
2
Mn
dn
(6)
2 1
2
2
2
1 M1 d1
M2
d2
n 1
2
n
1
M
n
1
dn1
n
n 2 M n dn
由式(1)内点拼接条件,可得
i M i1 2M i i M i1 d j i 1, 2,..., n 1
(3) (4)
其中
i
hi 1 hi1
, hi
i
hi hi 1
计算方法与实习上机实验报告

计算方法与实习上机实验报告一、引言本文旨在介绍和展示我们在“计算方法”课程中的实习上机实验环节所完成的一些关键任务和所取得的成果。
该实验课程的目标是让我们更深入地理解和应用各种计算方法,并在实际操作中提高我们的编程和问题解决能力。
二、实验内容与目标实验的主要内容是利用各种计算方法解决实际数学问题。
我们被要求使用编程语言(如Python或Java)来实现和解决这些问题。
这些问题包括使用牛顿法求解平方根,使用蒙特卡洛方法计算圆周率,以及使用最优化方法求解函数的最小值等。
实验的目标不仅是让我们掌握计算方法的基本理论,更是要让我们能够在实际操作中运用这些方法。
我们需要在实习过程中,通过与同伴们合作,共同解决问题,提高我们的团队合作能力和问题解决能力。
三、实验过程与问题解决策略在实验过程中,我们遇到了许多问题,如编程错误、理解困难和时间压力等。
我们通过相互讨论、查阅资料和寻求教师帮助等方式,成功地解决了这些问题。
例如,在实现牛顿法求解平方根时,我们一开始对导数的计算和理解出现了一些错误。
但我们通过查阅相关资料和讨论,最终理解了导数的正确计算方法,并成功地实现了牛顿法。
四、实验结果与结论通过这次实习上机实验,我们不仅深入理解了计算方法的基本理论,还在实际操作中提高了我们的编程和问题解决能力。
我们的成果包括编写出了能有效求解平方根、计算圆周率和求解函数最小值的程序。
这次实习上机实验非常成功。
我们的团队不仅在理论学习和实践操作上取得了显著的进步,还在团队合作和问题解决方面积累了宝贵的经验。
这次实验使我们对计算方法有了更深的理解和认识,也提高了我们的编程技能和解决问题的能力。
五、反思与展望回顾这次实验,我们意识到在实验过程中,我们需要更好地管理我们的时间和压力。
在解决问题时,我们需要更有效地利用我们的知识和资源。
在未来,我们希望能够更加熟练地运用计算方法,并能够更有效地解决问题。
我们也希望能够将所学的计算方法应用到更广泛的领域中,如数据分析、科学研究和工业生产等。
计算方法上机作业

方程求根一、目的和意义非线性方程在科学研究与工程实践中广泛出现,例如,优化问题、特征值问题、微分方程问题等。
但是,除少量方程外,大多数非线性方程求根相当困难,常见的几个简单、有效的数值求根方法,包括二分法、迭代法、牛顿法、割线法等,本实验旨在比较各种算法的计算性能和使用范围。
二、计算公式1.二分法2.不动点迭代法三、结构程序设计代码1.二分法1).定义所求解函数function [ y ] = f( x )y = x^3 + 4*x^2 - 10;end2).执行算法%初始化,设置区间端点a、b,误差限tola = 1;b = 2; tol = 0.5*10^(-6);k = 0; fa = f(a);%设置最大二分次数为30for k = 1:50p = (a + b)/2; fp = f(p);if(fp == 0 || (b - a)/2 < tol)breakendif(fa * fp < 0)b = p;elsea = p;enddisp('近似解p = ');disp(vpa(p,10)); disp('迭代次数k = ');disp(k);end2.不动点迭代法1).定义不动点方程g(x)function [ y ] = g( x )y = x^3 + 4*x^2 + x - 10;end2).执行算法%初始化,设置误差限,设置初值p0tol = 0.5*10^(-6);k = 1; p0 = 1.5;%迭代次数为10次while k <= 10p = g(p0);if abs(p - p0) < tolbreakenddisp('近似解p = ');disp(vpa(p,10)); disp('迭代次数k = ');disp(k);k = k + 1; p0 = p;end四、结果及其讨论1.二分法结果由于结果较长,只取了一部分,从图中可以看出,迭代20次可得到误差限范围内的近似解p=1.36522。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b=(1+2*(x-a0(i+1))/(a0(i)-a0(i+1)))*(x-a0(i))^2/(a0(i+1)-a0(i))^2; c=(x-a0(i))*(x-a0(i+1))^2/(a0(i)-a0(i+1))^2; d=(x-a0(i+1))*(x-a0(i))^2/(a0(i+1)-a0(i))^2; y=b0(i)*a+b0(i+1)*b+c0(i)*c+c0(i+1)*d; xc=a0(i)+0.01:0.01:a0(i+1)-0.01; x1=[x1 xc];y1=[y1 subs(y,'x',xc)]; end plot(x1,y1,'r'); end
将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)
3.拉格朗日插值法 运行代码:
fori=0:20 x0(i+1)=5*cos((2*i+1)*pi/42); end y0=create(x0);
y=Lagtange(x0,y0); output(y,'r');
程序输出函数图像:
将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)
4.分段线性插值Runge( x0,y0 ) 输入插值节点和其函数值组成的两个数组(x0,y0) 。因为这个分段函数相 对复杂, 就将插值过程与作图过程结合起来。在每一个区间里进行线性插值的到 表达式后,直接将绘图所需要的致密的坐标点记录到坐标数组(x1,y1)里,最 后直接用plot函数输出图像。
三,插值函数 1.输出原函数 R(x)的代码:
x0=-5:0.001:5; y0=create(x0); plot(x0,y0,'b');
2.牛顿插值法 newton( x0,y0 )的代码: 输入插值节点和其函数值组成的两个数组(x0,y0)返回插值后多项式表达 式
function [ L] = newton( x0,y0 ) l=length(x0)-1;%求差商系数,在一个二维的数组中,利用递推关系,生成后面的系数 M=zeros(l+1,l+1); M(1:l+1,1)=y0'; for k=2:l+1 for m=2:k M(k,m)=(M(k,m-1)-M(k-1,m-1))/(x0(k)-x0(k-m+1)); end end symsx;%代入系数,生成相应的表达式 L=0; for k=1:l+1 a=M(k,k); for m=1:k-1 a=a*(x-x0(m)); end L=L+a; end L=expand(L); end
2.output(y,c),输出关于 x 的多项式 y 在[-5,-5]上的图像,c 表示图像颜色
function [ ] = output(y,c)
x1=-5:0.01:5; y1=subs(y,'x',x1);%根据多项式生成对应的大量坐标点 plot(x1,y1,c);%根据这些坐标点生成图像,颜色由c决定 end
计算方法第一次上机作业
姓名:gegebao 学院: 学号:
摘要:程序代码基于 MATLAB,包含问题表述、辅助插值的函数、插值函数、表达式、图像 和文字说明、分析讨论几个部分
一、问题表述 对 Runge 函数 R(x)(1/(1+x^2)) ,利用下列条件做插值逼近,并与 R(x)的图 像进行比较。 1.用等距节点������������ = −5 + ������,������ = 0,1,2 … 10,绘出它的 10 次 New 通插值多项式的 图像; 2.用节点������������ = 5 cos 项式的图像; 3.用等距节点������������ = −5 + ������,������ = 0,1,2 … 10,绘出它的分段线性插值函数的图像; 4.用等距节点������������ = −5 + ������,������ = 0,1,2 … 10,,绘出它的分段三次 Hermite 插值 函数的图像; 5.用等距节点������������ = −5 + ������,������ = 0,1,2 … 10,,绘出它的三次自然样条插值函数 的图像。
4.分段线性插值法: 运行代码:
x0=-5:5; y0=createx0);Runge(x0,y0);
程序输出函数图像:
将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)
5.三次Hermite插值函数 运行代码:
x0=-5:5; [y0 c0]=create(x0);
Hermite(x0,y0,c0);
2������ +1 42
������ , ������ = 0,1,2,3 … 20,绘出它的 20 次 Lagrange 插值多
二、辅助插值的函数 1.create(x0)输入一组插值节点,输出函数(1/(1+x0(i)^2))对应的一组函 数值 y0 与导数值 c0
function [ y0 c0] = create(x0) l=length(x0);%获取节点个数 y0=x0; fori=1:l%逐个求出函数值和导数 y0(i)=1/(1+x0(i)^2); c0(i)=-2*x0(i)/(1+x0(i)^2)^2;end end
function [x1,y1] = Runge( x0,y0 ) l=length(x0); symsx; x1=x0(1);y1=y0(1); fori=1:l-1 xc=x0(i)+0.01:0.01:x0(i+1)-0.01;%生成需要的节点 y=y0(i)*(x-x0(i+1))/(x0(i)-x0(i+1))+y0(i+1)*(x-x0(i))/(x0(i+1)-x0(i)) ;%每个区间内的y数表达式 x1=[x1 xc];y1=[y1 subs(y,'x',xc)];%生成相应的坐标点 end plot(x1,y1,'r');%一起输出 end
6.自然样条插值函数 nature( a0,b0) 输入插值节点和其函数值组成的两个数组(x0,y0)和起始与终点处的函数 导数。在这个插值方法中,采用自然边界的假定。
function [ x1,y1] = nature( a0,b0 ) symsx; l=length(a0);%解出各点的导数mi a1(1)=2;d1(1)=3*(b0(2)-b0(1))/(a0(2)-a0(1));h(1)=a0(2)-a0(1);c1(1)=0; a1(l)=2;d1(l)=3*(b0(l)-b0(l-1))/(a0(l)-a0(l-1));b1(l)=1; %采用自然边界条件的假定 fori=2:l-1 a1(i)=2;h(i)=a0(i+1)-a0(i);c1(i)=h(i-1)/(h(i-1)+h(i)); b1(i)=1-c1(i);d1(i)=3*(b1(i)/h(i-1)*(b0(i)-b0(i-1))+c1(i)/h(i)*(b0(i+ 1)-b0(i))); end r(1)=c1(1)/a1(1);a2(1)=a1(1); fori=2:l-1 a2(i)=a1(i)-b1(i)*r(i-1);r(i)=c1(i)/a2(i); end a2(l)=a1(l)-b1(l)*r(l-1); y2(1)=d1(1)/a2(1); fori=2:l y2(i)=(d1(i)-b1(i)*y2(i-1))/a2(i); end c0(l)=y2(l); fori=l-1:-1:1 c0(i)=y2(i)-r(i)*y2(i+1);%解除了各点的导数,存在c0数组中 end x1(1)=a0(1);y1(1)=b0(1);%代入,之后与Hermite算法类似 fori=1:l-1 a=(1+2*(x-a0(i))/(a0(i+1)-a0(i)))*(x-a0(i+1))^2/(a0(i)-a0(i+1))^2;
程序输出函数图像:
将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)
6.自然样条法插值: 运行代码:
x0=-5:5; [y0 c0]=create(x0); nature(x0,y0);
程序输出函数图像:
将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)
五、分析与讨论
与原函数的吻合程度由高到低分别是:三次Hermite插值、自然样条插值、 20次拉格朗日插值、分段线性插值、10次牛顿插值法。而函数的平滑性上讲只有 10次牛顿插值法和分段线性法比较差。下面是我的分析和讨论: 1.在10次牛顿插值法中,插值出来的结果与原函数相差甚远,特别是区间 边界附近误差非常大。 但是在二十次的拉格朗日插值中,虽然在边界上波动仍然 存在, 其结果在很大的区间里却与原函数拟合得比较好。考虑到两种插值方法在 相同插值节点下结果应该是一样的, 那结果的差异就来自选取插值节点的选取有 关。 在拉格朗日插值方法中, 选取的节点在边界处较密,而牛顿方法的选点在区 间上则是均匀分布,所以两种结果的差异就比较大。这样看来,似乎是只要选点 适宜就可以期望得到与原函数比较接近的插值结果。 但在实际操作上这却很困难。 一方面,对于不同函数,所适宜的选点方法是不一样,另一方面,多数情况下原 函数是未知的,而我们所拥有的插值节点的数据也受制于测量条件。 总的来说, 牛顿插值法和拉格朗日插值法在处理插值问题上还是有局限性和 不稳定性的。 2.分段线性插值、Hermite插值、自然样条插值得到的结果与原函数都比较 接近。 相对而言, Hermite吻合得最好, 自然样条插值次之, 分段线性插值最差。 从线条的光滑程度上来讲,Hermite插值和自然样条插值都非常好。 从获得信息量的角度上讲, 分段线性插值和自然样条法都只得到插值节点的 函数值,而Hermite算法则还知道了插值节点的导数, 所以Hermite方法和自然样 条的插值方法的结果不具有可比性。在相对信息量比较少的情况下,采用自然样 条法也是有一种比较好的方法。 3.在自然科学的实地测量中,很难保证观测对象的高阶导数连续,或者高阶 连续但其收敛性不适用于高阶的牛顿插值和拉格朗日, 这个时候采用分段的插值 方法往往更接近真实结果。