当前位置:文档之家› 西南交通大学2018-2019数值分析Matlab上机实习题

西南交通大学2018-2019数值分析Matlab上机实习题

数值分析2018-2019第1学期上机实习题f x,隔根第1题.给出牛顿法求函数零点的程序。

调用条件:输入函数表达式()a b,输出结果:零点的值x和精度e,试取函数f(x)=x^4−1.4∗区间[,]x^3−0.48∗x^2+1.408∗x−0.512,用牛顿法计算x0=1附近的根,判断相应的收敛速度,并给出数学解释。

1.1程序代码:f=input('输入函数表达式:y=','s');a=input('输入迭代初始值:a=');delta=input('输入截止误差:delta=');f=sym(f);f_=diff(f); %求导f=inline(f);f_=inline(f_);c0=a;c=c0-f(c0)/f_(c0);n=1;while abs(c-c0)>deltac0=c;c=c0-f(c0)/f_(c0);n=n+1;enderr=abs(c-c0);yc=f(c);disp(strcat('用牛顿法求得零点为',num2str(c)));disp(strcat('迭代次数为',num2str(n)));disp(strcat('精度为',num2str(err)));1.2运行结果:run('H:\Adocument\matlab\1牛顿迭代法求零点\newtondiedai.m')输入函数表达式:y=x^4-1.4*x^3-0.48*x^2+1.408*x-0.512输入迭代初始值:a=1输入截止误差:delta=0.0005用牛顿法求得零点为0.80072迭代次数为14精度为0.00036062牛顿迭代法通过一系列的迭代操作使得到的结果不断逼近方程的实根,给定一个初值,每经过一次牛顿迭代,曲线上一点的切线与x轴交点就会在区间[a,b]上逐步逼近于根。

上述例子中,通过给定初值x=1,经过14次迭代后,得到根为0.80072,精度为0.00036062。

第2题.利用牛顿插值法计算牛顿插值多项式,并计算该多项式在某一点处的取值。

调用条件:输入n个插值节点x i,与对应的函数值y i;待计算的点x0。

输出结果:插值多项式的系数向量,以及多项式在0x处的取值(注意用适当的算法),给出调用说明和例子。

2.1程序代码x=input('请输入数据点x坐标:x=');y=input('请输入数据点y坐标:y=');x0=input('请输入要插值的x坐标:x0=');%x为数据点的x坐标向量%y为数据点的y坐标向量%x0为插值的x坐标syms t; %定义符号变量s=y(1);h=0; %存放均差a=0;dxs=1;n=length(x); %读取x的长度4for(i=1:n-1) %构造牛顿插值方法for(j=i+1:n)h(j) = (y(j)-y(i))/(x(j)-x(i));enddxs=dxs*(t-x(i));s=s+h(i+1)*dxs;y=h; %为了算二阶均差a(i)=h(i+1); %存放系数向量endsimplify(s);m=length(x0); %读取要插值点向量长度,可以直接对多点插值计算for i=1:mtemp(i)=subs(s,'t',x0(i));y0=temp; %得到的是系列插值点的插值结果enddisp(['系数向量为',num2str(a)]);disp(['插值结果为',num2str(y0)]);2.2运行结果run('H:\Adocument\matlab\2牛顿差值\newtonchazhi.m')请输入数据点x坐标:x=[21,34,44,11]请输入数据点y坐标:y=[4,7,9,1]请输入要插值的x坐标:x0=6系数向量为0.23077 -0.0013378 5.0674e-005插值结果为-0.83217第3题. 给定线性方程组Ax =b ,利用列主元高斯消元法进行求解。

调用条件:输入系数矩阵A 和右端项b 输出结果:方程组的解,试取系数矩阵为A =[1⋯11−1⋯⋱1⋮⋱⋱⋮−1⋯−11]n×n,观察列主元消元过程中绝对值最大的列主元取值,并给出数学解释。

3.1 程序代码A=input('请输入A :A='); b=input('请输入b :b='); n=size(A,1); X=zeros(n,1); for j=1:n-1 T=[];a=A(j:n,j); %选中第一列m=find(abs(a)==max(abs(a))); %寻找列主元最大值,将位置存储在数组m 内 h(j)=A(m(1)+j-1,j); %记录列主元最大值 temp=A(j,:); %交换行 A(j,:)=A(m(1)+j-1,:); A(m(1)+j-1,:)=temp; for i=1:n-j %消元T(i)=-A(i+j,j)/A(j,j);A(i+j,:)=A(i+j,:)+A(j,:)*T(i); b(i+j)= b(i+j)+b(j)*T(i); end endfor i=n:-1:1 %回代 sum=0;for j=n:-1:i+1sum=sum+X(j)*A(i,j); endX(i)=(b(i)-sum)/A(i,i); enddisp(['列主元最大值为',num2str(h)]); x=X3.2 运行结果 ○1 4x4矩阵方程 run('H:\Adocument\matlab\3高斯消元\Guass.m')请输入A :A=[2.1,3.4,8,4.5;1,2.4,3.3,5;2.2,4,1,10;0.3,2.5,6,10] 请输入b :b=[2,5,7,10]列主元最大值为2.2 1.9545 8.3x =-23.9967 25.3593 -1.0382 -4.5606 ○2题示矩阵方程 run('H:\Adocument\matlab\3高斯消元\Guass.m')请输入A :A=[1,1,1,1,1;-1,1,1,1,1;-1,-1,1,1,1;-1,-1,-1,1,1;-1,-1,-1,-1,1] 请输入b :b=[1,2,3,4,5]列主元最大值为1 2 2 2 x =-0.5000 -0.5000 -0.5000 -0.50003.0000由上述特殊矩阵的例子可以看出,在第一次列主消元时,对角线以下的数都为-1,与第一行的1直接相加变为0,而对角线上的元素都变为2,于是列主元后续每次消元的列主元都为2。

第4题. 给定函数)()(a x x b f ≤≤,将区间[,]a b 取n 等分,每个子区间分别用一次多项式、二次多项式进行插值,生成的多项式分别记为()1n P ,()2n P ,计算()12||()||n f x P -,()22||()||n f x P -。

(这里涉及到的积分运算需采用适当的数值求积算法)调用条件:输入函数表达式()f x ,隔根区间[,]a b ,等分区间数n输出结果:误差值()12||()||n f x P -,()22||()||n f x P -(可以分别写程序计算)试取不同的函数和隔根区间(比如()sin f x x =,[,][0,1]a b =),n 为2,4,8,16,…,观察误差变化,并给出数学解释。

4.1 程序代码p=input('输入函数表达式:y=','s'); a=input('输入区间左端值:a='); b=input('输入区间右端值:b='); N=input('输入等分数:N='); syms x; y=inline(p); y1=char(y); y1=sym(y1);xi=linspace(a,b,N+1);for k=1:NL1(k)=((x-xi(k+1))/(xi(k)-xi(k+1)))*y(k)+((x-xi(k))/(xi(k+1)-xi(k)))*y(k+1); %线性插值(三等分有三段)f1=(y1-L1(k))^2;f1=char(f1);f1=inline(f1); %线性插值余项h=(xi(k+1)-xi(k))/(2*5); %复合辛普森数值积分s1=0; s2=0;for i=1:5d=a+h*(2*i-1);s1=s1+feval(f1,d);endfor j=1:4d=a+h*2*j;s2=s2+feval(f1,d);endss1(k)=h*(feval(f1,xi(k))+feval(f1,xi(k+1))+4*s1+2*s2)/3;w1(k)=sqrt(ss1(k)); %线性插值的误差endfor k=2:NL2(k-1)=((x-xi(k))*(x-(xi(k+1)))/((xi(k-1)-xi(k))*(xi(k-1)-xi(k+1))))*y(k-1)+ ...((x-xi(k-1))*(x-(xi(k+1)))/((xi(k)-xi(k-1))*(xi(k)-xi(k+1))))*y(k)+ ...((x-xi(k-1))*(x-(xi(k)))/((xi(k+1)-xi(k-1))*(xi(k+1)-xi(k))))*y(k+1); %二次插值(三等分有两段)f2=(y1-L2(k-1))^2;f2=char(f2);f2=inline(f2); %二次插值余项h=(xi(k+1)-xi(k-1))/(2*5); %复合辛普森数值积分s1=0; s2=0;for i=1:5d=a+h*(2*i-1);s1=s1+feval(f2,d);endfor j=1:4d=a+h*2*j;s2=s2+feval(f2,d);endss2(k-1)=h*(feval(f2,xi(k-1))+feval(f2,xi(k+1))+4*s1+2*s2)/3;w2(k-1)=sqrt(ss2(k-1)); %二次插值的误差endw1=max(w1) %线性插值的最大误差w2=max(w2) %二次插值的最大误差4.2运行结果输入函数表达式:y=sin(x)输入区间左端值:a=0 输入区间右端值:b=1 ○1输入等分数:N=2 w1 = 0.7590 w2 = 0.5564 ○2输入等分数:N=4 w1 = 0.6884 w2 = 1.3686 ○3输入等分数:N=8 w1 = 1.5998 w2 = 7.3240○4输入等分数:N=16 w1 = 3.2096 w2 = 22.6859由上述结果可知:随着等分区间数的增加,二次插值的误差增加率比线性插值的大,等分数越多,误差相对于线性插值越大。

相关主题