matlab数值分析例题
中国科学院大学数值分析MATLAB大作业(计算机学院开设)

7.编程实现题%{在微电机设计计算中需要查磁化曲线表,通常给出的表是磁密B每间隔100高斯磁路每厘米长所需安匝数at的值,下面要解决B从4000至11000区间的查表问题。
为节省计算机存储单元,采用每500高斯存入一个at值,在利用差分公式计算。
从差分表中看到三阶差分近似于0,计算时只需两阶差分。
当4000≤B ≤10500时用牛顿前插公式;当10500≤B≤11000时用牛顿后插公式;试在计算机上编程实现求任一在区间[4000,11000]内的函数值。
%}syms y0y0=[1.38,1.48,1.58,1.69,1.81,1.94,2.10,2.28,2.50,2.76,3.06,3.41,3.83,4.33,4.93];b=input('enter the number of b:');if b>10500&&b<=11000t=(b-11000)/500.0;r=4.93+0.6*t+0.1*t*(t+1)/2;disp(r)elseif b<=10500&&b>=400k=(b-4000)/500;m=floor(k);t=k-m;r=y0(m+1)+(y0(m+2)-y0(m+1))*t+t*(t-1)*(y0(m+3)-2*y0(m+2)+y0(m+1))/2;disp(r)elsedisp('the number is out of consideration')endclear15.用正交多项式(格拉姆-施密特)作最小二乘拟合的程序syms alpha;syms beta;syms a;syms p;x=input('enter the value of x(for example:[1,2,3,4,5]):');y=input('enter the value of y(for example:[1,2,3,4,5]):');w=input('enter the value of weight(for example:[0.1,0.2,0.3,0.4]):');n=input('enter the value of n:');m=length(x);alpha(2)=sum(w*x)/sum(w);a(1)=sum(w*y)/sum(w);p2x= x-alpha(2);alpha(3)=sum(w*x*(subs(p2x,x))^2)/sum(x*( subs(p2x,x))^2);beta(2)=sum(w*( subs(p2x,x))^2)/sum(w);a(2)=sum(w*y*( subs(p2x,x)))/sum(w*( subs(p2x,x))^2);for k=3:m+1alpha(k+1)=sum(w*x*((subs(p,{k,x},[k,x]))^2)/sum(w*( subs(p,{k,x},[k,x]))^2);beta(k)=sum(w*( subs(p,{k,x},[k,x]))^2)/sum(w*( subs(p,{k-1,x},[k-1,x]))^2);a(k)=sum(w*y* subs(p,{k,x},[k,x]))/sum(w*( subs(p,{k,x},[k,x]))^2);p=(x-alpha(k+1))*subs(p,{k,x},[k,x])-beta(k)*subs(p,{k-1,x},[k-1,x]);end,for i=1:n+1F=0;F=F+a(i)* subs(p,{i,t},[i,t]);end。
#数值分析Matlab作业

数值分析编程作业2012年12月第二章14.考虑梯形电阻电路的设计,电路如下:电路中的各个电流{i1,i2,…,i8}须满足下列线性方程组:121232343454565676787822/252025202520252025202520250i i V R i i i i i i i i i i i i i i i i i i i i -=-+-=-+-=-+-=-+-=-+-=-+-=-+=这是一个三对角方程组。
设V=220V ,R=27Ω,运用追赶法,求各段电路的电流量。
Matlab 程序如下:function chase () %追赶法求梯形电路中各段的电流量 a=input('请输入下主对角线向量a='); b=input('请输入主对角线向量b='); c=input('请输入上主对角线向量c='); d=input('请输入右端向量d='); n=input('请输入系数矩阵维数n='); u(1)=b(1); for i=2:nl(i)=a(i)/u(i-1); u(i)=b(i)-c(i-1)*l(i); endy(1)=d(1); for i=2:ny(i)=d(i)-l(i)*y(i-1); endx(n)=y(n)/u(n); i=n-1; while i>0x(i)=(y(i)-c(i)*x(i+1))/u(i); i=i-1;end x输入如下: >> chase请输入下主对角线向量a=[0,-2,-2,-2,-2,-2,-2,-2]; 请输入主对角线向量b=[2,5,5,5,5,5,5,5];请输入上主对角线向量c=[-2,-2,-2,-2,-2,-2,-2,0]; 请输入方程组右端向量d=[220/27,0,0,0,0,0,0,0]; 请输入系数矩阵阶数n=8 运行结果如下:x = 8.1478 4.0737 2.0365 1.0175 0.5073 0.2506 0.1194 0.0477第三章14.试分别用(1)Jacobi 迭代法;(2)Gauss-Seidel 迭代法解线性方程组1234510123412191232721735143231211743511512x x x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=--⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥---⎣⎦⎣⎦⎣⎦ 迭代初始向量(0)(0,0,0,0,0)T x =。
数值分析matlab程序实例

1,秦九韶算法,求出P(x=3)=2+4x+5x^2+2x^3的值clear all;x=3;n=3;a(1)=2;a(2)=4;a(3)=5;a(4)=2v(1)=a(n+1);for k=2:(n+1);v(k)=x*v(k-1)+a(n-k+2);endp=v(n+1)p=,1132,一次线型插值程序:利用100.121.求115的开方。
clear all;x1=100;x2=121;y1=10;y2=11;x=115;l1=(x-x2)/(x1-x2);l2=(x-x1)/(x2-x1);p1=l1*y1+l2*y2p1=10.71433,分段插值程序,已知为S1(x)为(0,0),(1,1),(2,5)(3,8)上的分段一次插值,求S1(1.5).clear allx=[0123];y=[0158];n=length(x);a=1.5;for i=2:nif(x(i-1)<=a<x(i));endendH1=y(i-1)+(y(i)-y(i-1))/(x(i)-x(i-1))*(a-x(i-1))H1=3.50004)曲线拟合:用一个5次多项式在区间[0,2π]内逼近函数sin(x)。
clear allX=linspace(0,2*pi,50);Y=sin(X);[P,S]=polyfit(X,Y,5)plot(X,Y,'k*',X,polyval(P,X),'k-')P=-0.00560.0874-0.39460.26850.87970.0102S=R:[6x6double]df:44normr:0.03375)求有理分式的导数clear allP=[3,5,0,-8,1,-5];Q=[10,5,0,0,6,0,0,7,-1,0,-100];[p,q]=polyder(P,Q)6)将以下数据按从小到大排序:4.3 5.7 5.2 1.89.4a=[4.35.75.21.89.4];b(1:100)=0;n=1;b(a*10)=1;for k=1:100a(n)=k/10;if b(k)>0a(n)=k/10;n=n+1;endendaa=1.8000 4.3000 5.2000 5.70009.400010.00007)用二分法求方程x 3-x-1=0在[1,2]内的近似根,要求误差不超过10-3。
数值分析(hilbert矩阵)病态线性方程组的求解matlab程序

(Hilbert 矩阵)病态线性方程组的求解理论分析表明,数值求解病态线性方程组很困难。
考虑求解如下的线性方程组的求解Hx = b ,期中H 是Hilbert 矩阵,()ij n n Hh ,11ij h i j ,i ,j = 1,2,…,n 1.估计矩阵的2条件数和阶数的关系2.对不同的n ,取(1,1,,1)nx K ?,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭代,SOR 迭代和共轭梯度法求解,比较结果。
3.结合计算结果,试讨论病态线性方程组的求解。
第1小题:condition.m %第1小题程序t1=20;%阶数n=20x1=1:t1;y1=1:t1;for i=1:t1H=hilb(i);y1(i)=log(cond(H));endplot(x1,y1);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(log(cond(H))与阶数n 的关系图');t2=200;%阶数n=200x2=1:t2;y2=1:t2;for i=1:t2H=hilb(i);y2(i)=log(cond(H));endplot(x2,y2);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(log(cond(H))与阶数n 的关系图');画出Hilbert 矩阵2-条件数的对数和阶数的关系n=200时n=20时从图中可以看出,1)在n小于等于13之前,图像近似直线log(cond(H))~1.519n-1.8332)在n大于13之后,图像趋于平缓,并在一定范围内上下波动,同时随着n的增加稍有上升的趋势第2小题:solve.m%m第2小题主程序N=4000;xGauss=zeros(N,1);xJacobi=zeros(N,1);xnJ=zeros(N,1);xGS=zeros(N,1);xnGS=zeros(N,1);xSOR=zeros(N,1);xnSOR=zeros(N,1);xCG=zeros(N,1);xnCG=zeros(N,1);for n=1:N;x=ones(n,1);t=1.1;%初始值偏差x0=t*x;%迭代初始值e=1.0e-8;%给定的误差A=hilb(n);b=A*x;max=100000000000;%可能最大的迭代次数w=0.5;%SOR迭代的松弛因子G=Gauss(A,b);[J,nJ]=Jacobi(A,b,x0,e,max);[GS,nGS]=G_S(A,b,x0,e,max);[S_R,nS_R]=SOR(A,b,x0,e,max,w);[C_G,nC_G]=CG(A,b,x0,e,max);normG=norm(G'-x);xGauss(n)=normG;normJ=norm(J-x);nJ;xJacobi(n)=normJ;xnJ(n)=nJ;normGS=norm(GS-x);nGS;xGS(n)=normGS;xnGS(n)=nGS;normS_R=norm(S_R-x);nS_R;xSOR(n)=normS_R;xnSOR(n)=nS_R;normC_G=norm(C_G-x);nC_G;xCG(n)=normC_G;xnCG(n)=nC_G;endGauss.m%Gauss消去法function x=Gauss(A,b)n=length(b);l=zeros(n,n);x=zeros(1,n);%消去过程for i=1:n-1for j=i+1:nl(j,i)=A(j,i)/A(i,i);for k=i:nA(j,k)=A(j,k)-l(j,i)*A(i,k);endb(j)=b(j)-l(j,i)*b(i);endend%回代过程x(n)=b(n)/A(n,n);for i=n-1:-1:1c=A(i,:).*x;x(i)=(b(i)-sum(c(i+1:n)))/A(i,i);endJacobi.m%Jacobi迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m 可能最大的迭代次数function [x,n]=Jacobi(A,b,x0,e,m)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=D\(L+U);f=D\b;x=B*x0+f;n=1;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('Jacobi迭代次数过多,迭代可能不收敛');break;endendG_S.m%Gauss-Seidel迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function [x,n]=G_S(A,b,x0,e,m)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=(D-L)\U;f=(D-L)\b;x=B*x0+f;n=1;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('Gauss-Seidel迭代次数过多,迭代可能不收敛');break;endendSOR.m%SOR超松弛迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数,w松弛因子function [x,n]=SOR(A,b,x0,e,m,w)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=(D-w*L)\((1-w)*D+w*U);f=(D-w*L)\b*w;x=B*x0+f;n=1;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('SOR超松弛迭代次数过多,迭代可能不收敛');break;endendCG.m%CG共轭梯度法,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function [x,n]=CG(A,b,x0,e,m)r=b-A*x0;p=r;alpha=(r'*r)/(p'*(A*p));x=x0+alpha*p;r1=b-A*x;n=1;while norm(r1)>ebelta=(r1'*r1)/(r'*r);p=r1+belta*p;r=r1;x0=x;alpha=(r'*r)/(p'*(A*p));x=x0+alpha*p;r1=b-A*x;n=n+1;if n>mdisp('CG共轭梯度法迭代次数过多,迭代可能不收敛');break;endend。
牛顿插值法matlab程序例题

牛顿插值法是一种常用的数值分析方法,用于构造一个多项式函数,以便在给定的数据点上进行插值。
这个主题在数学和工程领域中有着广泛的应用,特别是在数据拟合和函数逼近方面。
牛顿插值法的核心思想是通过不断地添加新的数据点来构造一个多项式,并利用已知数据点来确定多项式的系数,从而实现对未知数据点的插值预测。
在Matlab中,实现牛顿插值法并不困难,我们可以利用已有的函数和工具来简化计算过程。
下面,我们将通过一个具体的例题来讲解如何使用Matlab编写牛顿插值法的程序,并分析其结果。
我们需要明确牛顿插值法的数学原理。
给定n个互不相同的节点\(x_0, x_1, ... , x_n\),以及在这些节点上的函数值\(f(x_0), f(x_1), ... , f(x_n)\),我们希望构造一个n次插值多项式p(x),满足p(x_i) = f(x_i),i=0,1,...,n。
牛顿插值多项式的一般形式为:\[p(x) = a_0 + a_1(x - x_0) + a_2(x - x_0)(x - x_1) + ... + a_n(x -x_0)(x - x_1)...(x - x_{n-1})\]其中,\[a_i\]表示插值多项式的系数。
通过牛顿插值法的迭代过程,可以逐步求解出这些系数,进而得到插值多项式的表达式。
接下来,我们将以一个具体的例题来演示如何在Matlab中实现牛顿插值法。
假设我们有如下的数据点和函数值:\(x = [1, 2, 3, 4]\)\(f(x) = [1, 4, 9, 16]\)我们希望利用这些数据点来构造一个插值多项式,并在给定的区间上进行插值计算。
在Matlab中,可以通过interp1函数来进行插值计算,该函数支持多种插值方法,包括牛顿插值法。
下面是一个简单的Matlab程序示例:```matlabx = [1, 2, 3, 4];y = [1, 4, 9, 16];xi = 2.5;yi = interp1(x, y, xi, 'spline');disp(['在x=',num2str(xi),'处的插值结果为:',num2str(yi)]);```在这段代码中,我们首先定义了给定的数据点x和对应的函数值y,然后利用interp1函数对x=2.5处的插值结果进行计算。
数值分析作业

数值分析作业及答案Chap11、写出下列语句的运行结果。
在MA TLAB 上执行它们以验证所得解答。
a=[1 2 3 ;4 5 6 ]’ b=[9;7;5;3;1] c=b(2:4) d=b(4:-1:1) e=sort(b) f=[3,b ’]解:a=635241 b=13579c=357d=9753 e=97531F=[3 9 7 5 3 1] 3、给定一向量:a=[4 -1 2 -8 4 5 -3 -1 6 -7]写一段程序计算a 中正数的和。
运行程序并显示结果。
解:a=[4 -1 2 -8 4 5 -3 -1 6 -7]; s=0;for i=1:length(a) if a(i)>0s=s+a(i); end end s6、编写一个函数M 文件fun_es(x),计算如下函数:230.5sin x y e x x =-其中参数可以为标量,也可以为向量。
在MA TLAB 里键入如下命令检验此函数:fun_es(3) fun_es([1 2 3])解:function y=fun_es(x) y=0.5*exp(x/3)-x.^2.*sin(x);chap21、设0x >,x 的相对误差为δ,求L nx 的误差。
解:Lnx-Lnx*=dLnx=dx/x=δ2、设x 的相对误差为2%,求2x 的相对误差。
解:dLnf(x)=xf ’(x)/f(x)dLnx=4%5、计算球体积要使相对误差限为1%,问度量半径R 时允许的相对误差限是多少?解:dLnf(x)=xf ’(x)/f(x)dLnx=3dLnx=1% dLnx=0.33%9、正方形的边长大约为100cm ,应怎样测量才能使其面积误差不超过1cm 2? 解:s=x 2s-s*=2x(x-x*)=1x-x*=1/(2x)=1/200=0.5*10-2 即测量边的误差不超过0.005cm 10、设212S gt =,假定g 是准确的,而对t 的测量有±0.1秒的误差,证明当t 增加时S 的绝对误差增加,而相对误差却减少。
matLAB经典例题及答案

一.对以下数据分别作二次,三次多项式拟合,并画出图形.x=1:16;y=[4,6.4,8,8.4,9.28,9.5,9.7,9.86,10,10.2,10.32,10.42,10.5, 10.55,10.58,10.6];答:程序如下(1)x=(1:16);y=erf(x);p=polyfit(x,y,2);f=polyval(p,x);plot(x,y,x,f);结果p=-0.00100.02020.9096(2)y=[4,6.4,8,8.4,9.28,9.5,9.7,9.86,10,10.2,10.32,10.42,10.5, 10.55,10.58,10.6];y=erf(x);p=polyfit(x,y,3)f=polyval(p,x);plot(x,y,x,f)结果P=0.0002-0.00710.06280.8404二.在[0,4pi]画sin(x),cos(x)(在同一个图象中);其中cos(x)图象用红色小圆圈画.并在函数图上标注“y=sin(x)”,“y=cos(x)”,x轴,y轴,标题为“正弦余弦函数图象”.答:程序如下x=[0:720]*pi/180;plot(x,sin(x),x,cos(x),'ro');x=[2.5;7];y=[0;0];s=['y=sin(x)';'y=cos(x)'];text(x,y,s);xlabel('正弦余弦函数图象'),ylabel('正弦余弦函数图象')图形如下三.选择一个单自由度线性振动系统模型,自定质量、弹簧刚度、阻尼、激振力等一组参数,分别编程(m 文件)计算自由和强迫振动时的响应,并画出振动曲线图。
(要求画出该单自由度线性振动系统模型图)其中质量为m=1000kg,弹性刚度k=48020N/m,阻尼c=1960N.s/m,激振力f(t)=0.阻尼比ζ的程序p=1960/(2*sqrt(48020*1000))求得p=0.1414而p为阻尼比ζ强迫振动时的响应程序g =tf([-101],[48020048020*1.9848020]);bode(g)图形g =tf([001],[0001]);bode(g)振动曲线图程序:函数文件function dx =rigid(t,x)dx =zeros(2,1);dx(1)=x(2);dx(2)=(-48020*x(1)-1960*x(2))/1000;命令文件options =odeset('RelTol',1e-4,'AbsTol',[1e-41e-4]);[T,X]=ode45(@rigid,[012],[11],options);plot(T,X(:,1),'-')其图形如下024681012-6-5-4-3-2-11234单自由度线性强迫振动系统模型图其中质量为m=1000kg,弹性刚度k=48020N/m,阻尼c=1960N.s/m,f(t)=cos(3*pi*t)振动曲线图程序:函数文件function dx=rigid(t,x)dx=zeros(2,1);dx(1)=x(2);dx(2)=(-48020*x(1)-1960*x(2))/1000+cos(3*pi*t);命令文件options=odeset('RelTol',1e-4,'AbsTol',[1e-41e-4]);[T,X]=ode45(@rigid,[020],[11],options);plot(T,X(:,1),'-')力等一组参数,建立Simulink仿真模型框图进行仿真分析。
习题六(Matlab数值计算)课后习题

习题六(Matlab数值计算)课后习题1、利⽤MATLAB 提供的randn 函数⽣成符合正态分布的10×5随机矩阵A,进⾏如下操作:(1)A 各列元素的均值和标准⽅差。
(2)A 的最⼤元素和最⼩元素。
(3)求A 每⾏元素的和以及全部元素之和。
(4)分别对A 的每列元素按升序、每⾏元素按降序排序。
A=randn(10,5);disp('各列元素的均值:');mean(A)disp('各列元素的标准⽅差:');std(A)disp('A 的最⼤元素:');max(max(A))disp('A 的最⼩元素:');min(min(A))disp('A 每⾏元素之和:');sum(A,2)disp('全部元素之和:');sum(sum(A))disp('每列元素按升序:');Y=sort(A)disp('每⾏元素按降序:');Y=sort(A,2,'descend')各列元素的均值:ans =-0.1095 0.1282 -0.2646 0.3030 -0.2464各列元素的标准⽅差:ans =0.9264 1.2631 0.8129 0.8842 1.3151A 的最⼤元素:ans =2.5855A 的最⼩元素:ans =-1.9330A 每⾏元素之和:ans =-2.29701.25450.06615.0489-0.69881.1002-2.9310-2.0595-1.68780.3112全部元素之和:ans =-1.8932每列元素按升序:Y =-1.2141 -1.4916 -1.4224 -1.1658 -1.9330-1.1135 -1.0891 -1.4023 -0.8045 -1.7947-0.8637 -1.0616 -0.7648 -0.2437 -1.1480-0.7697 -0.7423 -0.6156 0.1978 -0.6669-0.2256 0.0326 -0.1961 0.2157 -0.4390-0.0068 0.0859 -0.1924 0.2916 -0.08250.0774 0.5525 -0.1774 0.6966 0.10490.3714 1.1006 0.4882 0.8351 0.18731.1174 1.5442 0.7481 1.4193 0.72231.53262.3505 0.8886 1.5877 2.5855每⾏元素按降序:Y =1.4193 -0.6156 -0.8637 -1.0891 -1.14800.7481 0.2916 0.1049 0.0774 0.03260.7223 0.5525 0.1978 -0.1924 -1.21412.5855 1.5877 1.1006 0.8886 -1.11351.5442 -0.0068 -0.6669 -0.7648 -0.80451.5326 0.6966 0.1873 0.0859 -1.40230.8351 -0.0825 -0.7697 -1.4224 -1.49160.4882 0.3714 -0.2437 -0.7423 -1.93300.2157 -0.1774 -0.2256 -0.4390 -1.06162.3505 1.1174 -0.1961 -1.1658 -1.79472、按要求对指定函数进⾏插值和拟合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、 在MATLAB 中用Jacobi 迭代法讨论线性方程组,1231231234748212515x x x x x x x x x -+=⎧⎪-+=-⎨⎪-++=⎩(1)给出Jacobi 迭代法的迭代方程,并判定Jacobi 迭代法求解此方程组是否收敛。
(2)若收敛,编程求解该线性方程组。
解(1):A=[4 -1 1;4 -8 1;-2 1 5] %线性方程组系数矩阵 A =4 -1 1 4 -8 1 -2 1 5>> D=diag(diag(A)) D =4 0 0 0 -8 0 0 0 5>> L=-tril(A,-1) % A 的下三角矩阵 L =0 0 0 -4 0 0 2 -1 0>> U=-triu(A,1) % A 的上三角矩阵 U =0 1 -1 0 0 -1 0 0 0B=inv(D)*(L+U) % B 为雅可比迭代矩阵 B =0 0.2500 -0.2500 0.5000 0 0.12500.4000 -0.2000 0>> r=eigs(B,1) %B 的谱半径r =0.3347 < 1Jacobi迭代法收敛。
(2) 在matlab上编写程序如下:A=[4 -1 1;4 -8 1;-2 1 5];>> b=[7 -21 15]';>> x0=[0 0 0]';>> [x,k]=jacobi(A,b,x0,1e-7)x =2.00004.00003.0000k =17附jacobi迭代法的matlab程序如下:function [x,k]=jacobi(A,b,x0,eps)% 采用Jacobi迭代法求Ax=b的解% A为系数矩阵% b为常数向量% x0为迭代初始向量% eps为解的精度控制max1= 300; %默认最多迭代300,超过300次给出警告D=diag(diag(A)); %求A的对角矩阵L=-tril(A,-1); %求A的下三角阵U=-triu(A,1); %求A的上三角阵B=D\(L+U);f=D\b;x=B*x0+f;k=1; %迭代次数while norm(x-x0)>=epsx0=x;x=B*x0+f;k=k+1;if(k>=max1)disp('迭代超过300次,方程组可能不收敛');return;endend2、设有某实验数据如下:(1)在MATLAB中作图观察离散点的结构,用多项式拟合的方法拟合一个合适的多项式函数;(2)在MATLAB中作出离散点和拟合曲线图.解(1):首先观察离散点的结构,matlab中的程序如下,x=[-3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 ];>> y=[-3.99 -3.3011 -2.4161 -1.4293 -0.4597 0.37758 1 1.3776 1.5403 1.5707 1.5839 1.6989 2.01]; >> plot(x,y,'r*')图形如下:离散点近似如抛物线,所以用二次多项式拟合,所以matlab程序如下:x=[-3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 ];>> y=[-3.99 -3.3011 -2.4161 -1.4293 -0.4597 0.37758 1 1.3776 1.5403 1.5707 1.5839 1.6989 2.01]; >> s=polyfit(x,y,2);>> p=poly2str(s,'t')p =-0.22214 t^2 + 1 t + 0.74384(2)做出离散点与拟合曲线的程序如下:x=[-3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 ];>> f=[-3.99 -3.3011 -2.4161 -1.4293 -0.4597 0.37758 1 1.3776 1.5403 1.5707 1.5839 1.6989 2.01]; >> p=polyfit(x,f,2); >> y=polyval(p,x); >> plot(x,f,'r+',x,y,'k'); >> xlabel('x'); >> ylabel('y'); >> title('拟合');>> gtext(datestr(today))得出的离散点与拟合曲线图像如下:3、在MATLAB 中用复合Simpson 公式编程计算 221()I x x dx -=--⎰(要求积分精度为510- )解:matlab 程序如下:[I,step] = jfSimpson('-x-x^2',-1,2,2,1.0e-5) I =-4.5000step =4附复合Simpson 程序如下:function [I,step] = jfSimpson(f,a,b,type,eps) %type = 1 辛普森公式 %type = 2 复合辛普森公式if (type==2 && nargin==4)eps=1.0e-4; %缺省精度为0.0001 endI=0;switch type case 1,I=((b-a)/6)*(subs(sym(f),findsym(sym(f)),a)+... 4*subs(sym(f),findsym(sym(f)),(a+b)/2)+... subs(sym(f),findsym(sym(f)),b)); step=1;case 2, n=2;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)>eps n=n+1;h=(b-a)/n; I1=I2; I2=0;for i=0:n-1 x=a+h*i; x1=x+h;I2=I2+(h/6)*(subs(sym(f),findsym(sym(f)),x)+... 4*subs(sym(f),findsym(sym(f)),(x+x1)/2)+... subs(sym(f),findsym(sym(f)),x1)); end end I=I2; step=n; end4、在MATLAB 中用四阶Runge-Kutta 法编程求解微分方程初值问题()23(03)01dy y x x dx y ⎧=-++≤≤⎪⎨⎪=⎩, 并在MATLAB 中画图比较方程的解析解与R-K 解的结果。
解:第1步:首先先把经典RK4子程序编出来如下,用RK4.m 保存。
RK4.m matlab 程序如下:function [t,y] = RK4(func,t0,tt,y0,N,varagin)% Rk方法计算一阶级微分方程组,% 由微分方程知识可以知道,对于高阶微分方程可以化为一阶微分方程组。
% 初始时刻为t0,结束时为tt,初始时刻函数值为y0% N为步数if nargin<4N=100;end% 如果没有输入N的话,那么默认计算步长为(tt-t0)/100y(1,:) = y0(:)';h = (tt-t0)/N; %步长t = t0+[0:N]'*h;for k = 1:Nf1 = h*feval(func,t(k),y(k,:));f1 = f1(:)';% RK中的k1f2 = h*feval(func,t(k) + h/2,y(k,:) + f1/2);f2 = f2(:)';% RK中的k2f3 = h*feval(func,t(k) + h/2,y(k,:) + f2/2);f3 = f3(:)';% RK中的k3f4 = h*feval(func,t(k) + h,y(k,:) + f3);f4 = f4(:)';% RK中的k4y(k + 1,:) = y(k,:) + (f1 + 2*(f2 + f3) + f4)/6;% 所求结果End第2步:然后把微分方程的表达式用一个调试程序RK_fun表示,用RK_fun.m 保存。
RK_fun.m matlab程序如下:%RK4方法的测试函数function f=RK_fun(t,y)f=-y+t*t+3;第3步:把用RK方法计算的主函数写出,用RK_main.m 保存。
RK_main.m matlab程序如下:%rk方法的主函数x0=0;xt=3;y0=1;%符号计算给出分析解y=dsolve('Dy=-y+t*t+3','y(0)=1','t');%RK4方法给出计算结果[x,yrk] = RK4('RK_fun',x0,xt,y0,10);%对应于真解的离散数据yreal=subs(y,x);tol=yreal-yrk; %RK4方法与分析解的误差plot(x,yreal,x,yrk,'+',x,tol,'*')legend('分析解','RK4计算结果','两者误差')yrk;[x,yrk,tol];%yrk为所要计算的结果第4步matlab中输入y; yrk得:y =t^2 - 4/exp(t) - 2*t + 5>> yrkyrk =1.00001.52671.96472.38372.83523.3575 3.97894.72035.59726.62137.8010最后调用主函数得:>> RK_main得到分析结果如下图:5、在MATLAB 中利用牛顿切线迭代法计算非线性方程 324100x x +-= 在区间[1,2]上的一个根。
解,利用matlab 写如下程序得:root=newtonqxf('x*x*x+4*x*x-10',1,2,1.0e-6) root =1.3652附牛顿切线法程序如下:function root=newtonqxf(f,a,b,eps)% 牛顿法求函数 f在区间[a,b]上的一个零点% f 为函数名% a 为区间左端点% b 为区间右端点% eps 为根的精度% root 为求出的函数零点if(nargin==3)eps=1.0e-6;endf1=subs(sym(f),findsym(sym(f)),a);f2=subs(sym(f),findsym(sym(f)),b);if(f1==0)root=a;endif(f2==0)root=b;endif(f1*f2>0)disp('两端点函数值乘积大于0!');return;elsetol=1;fun=diff(sym(f));fa=subs(sym(f),findsym(sym(f)),a);fb=subs(sym(f),findsym(sym(f)),b);dfa=subs(sym(fun),findsym(sym(fun)),a);dfb=subs(sym(fun),findsym(sym(fun)),b);if(dfa>dfb)root=a-fa/dfa;elseroot=b-fb/dfb;endwhile(tol>eps)r1=root;fx=subs(sym(f),findsym(sym(f)),r1);dfx=subs(sym(fun),findsym(sym(fun)),r1); root=r1-fx/dfx;tol=abs(root-r1);end end。