MATLAB上机实验报告
平顶山学院计算机语言类课程实验报告(4)
课程名称院系学号实验日期MATLAB语言及应用电气信息工程学院201*/5/3实验机房专业电气工程及其自动化姓名任课教师王凯实验学时23305班级机器号实验成绩电气二班A4一.实验名称:MATLAB求解线性方程组和矩阵的初等计算二.实验目的和要求1、掌握利用MATLAB程序编辑器编写应用程序的方法;2、掌握MATLAB求解线性方程组的方法;3、掌握MATLAB进行矩阵的初等计算的方法三.实验内容1、给出一个信号t=0:0.001:3,其正弦信号频率响应特性u=sin(300t)+2cos(200t),求其幅频特性曲线。2、已知某系统的闭环传递函数为(s)根,并判别其稳定性。3、已知某系统的开环传递函数为G(s)图,并判断系统的稳定性。4、已知某系统的开环传递函数为G(s)5,计算该系统的相位裕度和幅值裕度。s(s4)(s5)1,画出该系统的开环Nyquist图和Bodes(3s1)(4s1)s4试求该系统的特征5432s10s20s30s40s5025、已知某系统的闭环传递函数为(s)2,设ζ=0.707,ωn=1:1:5,画出该2s2wnsnn系统的单位阶跃响应曲线。
四.实验设计方案(实验步骤或开发过程)1、clearallcloseallclct=0:0.001:3;u=sin(300*t)+2*cos(200*t);y=fft(u);yy=abs(y);plot(t,yy)2、d=[11020304154];r=roots(d)3、clearallcloseallnum=1;den=[12710];bode(num,den)figure(2)nyquist(num,den)w=logspace(0,4,50);bode(sys,w);grid;[Gm,Pm,Wg,Wc]=margin(sys)5、i=0;t=0:0.1:10;forwn=1:5i=i+1;zeta=[0.707];num=[wn^2];den=[1,2*zeta*wn,wn^2];sys=tf(num,den);y(:,i)=step(sys,t);endplot(t,y(:,1),t,y(:,2),t,y(:,3),t,y(:,4),t,y(:,5));gridxlabel("time(s)")ylabel("stepresponse")4、num=5;den=conv([1,0],conv([1,4],[1,5]));sys=tf(num,den);五.实验中存在问题及解决办法这一次上机实验遇到很多问题,首先关于用MATLAB求自动控制相关问题以前接触到一点,但是现在完全不会,相关函数都不清楚,在上网查阅资料,仿照网友给出的程序最终得除了正确结果,但是对于怎么用程序函数判断系统的稳定性还是没有掌握。最大的问题还是对于MATLAB软件不熟悉。
六.实验结果1、5、25001.4201*1.21stepresponse15000.810000.60.45000.201*.511.522.5302、r=-7.8739-1.4201+0.9942i-1.4201-0.9942i0.3570+1.4679i0.3570-1.4679i由此看出系统不稳定3、NyquistDiagram10080Magnitude(dB)012345time(s)678910BodeDiagram506040ImaginaryAxis0-50200-20-100-90-135-180-225-270-60-80-100-7-6-5-4RealAxis-3-2-10Phase(deg)-4010-210-110Frequency(rad/s)01014、Gm=36(幅值裕度)Pm=83.5835(相角裕度)
七.附录(源程序清单)1、clearallcloseallclct=0:0.001:3;u=sin(300*t)+2*cos(200*t);y=fft(u);yy=abs(y);plot(t,yy)2、d=[11020304154];r=roots(d)3、clearallcloseallnum=1;den=[12710];bode(num,den)figure(2)nyquist(num,den)4、num=5;den=conv([1,0],conv([1,4],[1,5]));sys=tf(num,den);w=logspace(0,4,50);bode(sys,w);grid;[Gm,Pm,Wg,Wc]=margin(sys)5、i=0;t=0:0.1:10;forwn=1:5i=i+1;zeta=[0.707];num=[wn^2];den=[1,2*zeta*wn,wn^2];sys=tf(num,den);y(:,i)=step(sys,t);endplot(t,y(:,1),t,y(:,2),t,y(:,3),t,y(:,4),t,y(:,5));gridxlabel("time(s)")ylabel("stepresponse")
扩展阅读:matlab上机实验报告
上海电力学院
数值计算方法上机实习
院系:专业年级:学生姓名:学号:指导教师:报告
能源与机械工程学院动力机械及工程201*级张亚杰ys1210124014黄建雄
201*年12月26日1
数值计算方法上机实习题
xndx,1.设In05x1(1)由递推公式In5In1解:I0=
I=0.1823forn=1:1:20,I=-5*I+1/n;1,从I0的几个近似值出发,计算I20;n105xdx=0.1823
1计算I20编辑matlab命令如下:fprintf("%.1d%.4f\\n",n,I);end结果:
(2)粗糙估计I20,用In111In,计算I0;55nx20d解:I20=05xx1使用复合中点公式进行积分,相应的matlab程序如下:
I=0;forh=0:0.001:1,m=h+0.0005;I=I+0.001*m^20/(5+m);fprintf("%.1d%.4f\\n",m,I);enddisp(I);fork=1:20,n=21-k;I=0.2*(1/n-I);fprintf("%.1d%.4f\\n",n,I);enddisp(I)结果:
程序结束时输出两个I值,第一个表示I20,第二个表示I0;分别为I20=0.0082I0=0.1823
(3)分析结果的可靠性及产生此现象的原因(重点分析原因)。
从上述计算中分析得到如果先得到I0,再从I0由递推公式得到I20,I20结果跟精确值相比误差很大;如果先估算I20,在从I20有递推公式得到I0,I0的结果跟精确值相比近似相等。
原因分析:
如果从I0推I20的近似值,需要用到递推公式In=-5In-1+1/n,I0本身结果是有误差的;经过递推公式计算20次,就等于误差被认为的放大5的20次方倍,所以得到的I20与其精确值相差甚远。
如果从I20推I0的近似值,需要用到In-1=0.2(1/n-In),尽管I20本身有误差,但是经过20次运算,其误差缩小到原来的0.2的20次方倍,所以得到的I0与其精确值比较相近。
2.求方程e10x20的近似根,要求xk1xk5104,并比较计算量。
x(1)在[0,1]上用二分法;
Matlab程序如下:a=0;b=1;c=b-a;n=0whilec>0.0005,x=(a+b)/2;f=exp(x)+10*x-2;iff>0,b=x;c=b-a;elseiff(2)取初值x00,并用迭代xk12ex;
10采用matlab进行迭代的程序如下:
x=0;c=1;n=0;whilec>0.0005,m=x;m=(2-exp(m))/10;c=abs(m-x);x=m;n=n+1;fprintf("%.1d%.4f%.4f\\n",n,x,c);end结果:
解得x=0.0905
(3)加速迭代的结果;
采用matlab进行迭代的程序如下:x=0;n=0;a=0;b=1;whileabs(a-b)>0.0005,n=n+1;a=x;y=(2-exp(x))/10;z=(2-exp(y))/10;x=x-(y-x)^2/(z-2*y+x);b=x;fprintf("%.1d%.4f%.4f\\n",n,x,abs(a-b));end结果如下:
(4)取初值x00,并用牛顿迭代法;Matlab程序如下:
x=0;a=1;n=0;whileabs(a)>0.0005,n=n+1;a=(exp(x)+10*x-2)/(exp(x)+10);x=x-a;fprintf("%.1d%.4f%.4f\\n",n,x,abs(a));end运行结果:
(5)分析绝对误差。迭代次数1234567891011二分法X(k)0.50000.25000.12500.06250.09380.07810.08590.08980.09180.09080.0903Erroe0.50000.25000.12500.06250.03130.01560.00780.00390.00200.00100.0005代数式迭代X(k)0.10000.08950.09060.0905Erroe0.10000.01050.00120.0001加速迭代X(k)0.09050.0905Erroe0.0905牛顿迭代X(k)0.0909Erroe0.09090.00040.00000.0905我们可以看到,在运算要求到同一精度的情况下,采用(1)的二分法运算了11次,采用(2)的方法运算了4次,采用(3)的加速迭代法运算了2次,采用(4)的牛顿迭代法也需运算2次。也就是说牛顿的迭代的收敛速度与加速迭代速度都是超线性收敛的,而简单迭代法是线性收敛的。而二分法收敛速度较慢,所以在工程上不经常使用。3.钢水包使用次数多以后,钢包的容积增大,数据如下:xy10234569.7147101581112131610.4910.5910.6010.810.610.910.76试从中找出使用次数和容积之间的关系,计算均方差。(注:增速减少,用何种模型)解:将使用次数x与体积y的关系用matlab采用如下程序绘制在二维坐标系:x=[2345678910111213141516];y=[6.428.29.589.59.7109.939.9910.4910.5910.6010.810.610.910.76];plot(x,y,"b*-");96.428.29.589.59.939.99结果如下:
由数据点分布图可知,拟合曲线y=f(x)随着x的增加而上升,但上升速度由快到慢,当x趋于无穷大时,y趋于某个常数,故曲线有一水平渐进线。根据上述特征很容易想到用
b/x
Logistic模型来拟合该曲线。设y=f(x)的形式为y=ae(a>0,b
计算均方差s,matlab程序如下:y=[6.428.29.589.59.7109.939.9910.4910.5910.6010.810.610.910.76];s=0;forn=2:1:16,a=abs(11.679*exp(-1.1107*n.^(-1))-y(n-1));s=s+a.^2;ends=(s/15).^(1/2);disp(s);运算结果均方差S=0.2438
小结:根据已给的条件计算函数是十分困难的,但通过对离散点的分析及变化规律找出其中的规律,并通过计算来得到实际的函数是十分有用的方法。本题就是这样做的一个典型,在n=1/x和m=lny的基础上找到了它们之间的关系并通过这种关系来拟合原函数,并最终验证计算结果。
041010014101050141012,b,Axb4.设A101410501014120601014分析下列迭代法的收敛性,并求xk1xk(1)JACOBI迭代;解matlab计算程序如下:A=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];b=[0;5;-2;5;-2;6];error=1;D=diag(diag(A));L=D-tril(A);U=D-triu(A);X=zeros(size(b));whileerror>0.0001,
82104的近似解及相应的迭代次数。X=D\\(b+L*X+U*X);error=norm(b-A*X)/norm(b);enddisp(x);disp(error);解得X=[0.9999;1.9999;0.9998;1.9999;0.9998;1.9999]error=7.0206e-05
(2)GAUSS-SEIDEL迭代;
A=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];b=[0;5;-2;5;-2;6];error=1;D=diag(diag(A));L=D-tril(A);U=D-triu(A);X=zeros(size(b));whileerror>0.0001,X=(D-L)\\(b+U*X);error=norm(b-A*X)/norm(b);enddisp(x);disp(error);解得X=[0.9998;1.9998;0.9998;1.9999;0.9999;1.9999]error=5.5892e-05(3)SOR迭代(1.334,1.95,0.95)。
N=1.334使用matlab求解程序如下:A=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];b=[0;5;-2;5;-2;6];error=1;D=diag(diag(A));L=D-tril(A);U=D-triu(A);X=zeros(size(b));whileerror>0.0001,n=1.334;X=(D-n*L)\\[(1-n)*D+n*U]*X+n*[(D-n*L)\\b];error=norm(b-A*X)/norm(b);disp(X);enddisp(error);此循环得到的X=[0.9999;2.0000;1.0000;1.9999;1.0000;2.0000]error=6.3632e-05
N=1.95使用matlab求解程序如下:A=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];b=[0;5;-2;5;-2;6];error=1;D=diag(diag(A));L=D-tril(A);U=D-triu(A);X=zeros(size(b));whileerror>0.0001,n=1.95;X=(D-n*L)\\[(1-n)*D+n*U]*X+n*[(D-n*L)\\b];error=norm(b-A*X)/norm(b);disp(X);enddisp(error);此循环得到的X=[0.9999;2.0001;0.9999;1.9999;1.0001;1.9999]error=9.0363e-05N=0.95使用matlab求解程序如下:A=[4-10-100;-14-10-10;0-14-10-1;-10-14-10;0-10-14-1;00-10-14];b=[0;5;-2;5;-2;6];error=1;D=diag(diag(A));L=D-tril(A);U=D-triu(A);X=zeros(size(b));whileerror>0.0001,n=0.95;X=(D-n*L)\\[(1-n)*D+n*U]*X+n*[(D-n*L)\\b];error=norm(b-A*X)/norm(b);disp(X);enddisp(error);此循环得到的X=[0.9997;1.9997;0.9997;1.9998;0.9998;1.9999]error=8.6235e-05
6313A3215.用逆幂迭代法求最接近于11的特征值和特征向量,准确到10。
111解:matlab程序如下:a=[631;321;111];I=[100;010;001];b0=a-11*I;v0=[1;1;1];m=max(abs(v0));flab=1;whileflab>0.001,u=v0/m;v0=b0\\u;[tv,ti]=max(abs(v0));n=v0(ti);flab=abs(n-m);m=n;endm=1/m+11;disp(m);运行结果如下:
即离11最近的特征值为7.8745;相应的特征向量u=[1.0000;0.5503;0.2271]。6.用经典R-K方法求解初值问题(1)2y1y22sinxy1,x[0,10],
y2y12y22cosx2sinxy1(0)2;y2(0)3解:采用经典R-K公式计算的MATLAB程序如下:
y1=2;y2=3;forh=0:0.01:10,k1=0.01*(-2*y1+y2+2*sin(h));l1=0.01*(y1-2*y2+2*cos(h)-2*sin(h));k2=0.01*(-2*(y1+0.5*k1)+(y2+0.5*l1)+2*sin(h+0.005));l2=0.01*((y1+0.5*k1)-2*(y2+0.5*l1)+2*cos(h+0.005)-2*sin(h+0.005));k3=0.01*(-2*(y1+0.5*k2)+(y2+0.5*l2)+2*sin(h+0.005));l3=0.01*((y1+0.5*k2)-2*(y2+0.5*l2)+2*cos(h+0.005)-2*sin(h+0.005));k4=0.01*(-2*(y1+k3)+(y2+l3)+2*sin(h+0.01));l4=0.01*((y1+k3)-2*(y2+l3)+2*cos(h+0.01)-2*sin(h+0.01));y1=y1+1/6*(k1+2*k2+2*k3+k4);y2=y2+1/6*(l1+2*l2+2*l3+l4);ifh==fix(h);fprintf("%.1d%.4f%.4f\\n",h,y1,y2);elseendend结果如下所示:
2y1y22sinxy1(2),x[0,10],
y998y999y999cosx999sinx122y1(x)2exsinx和精确解比较,分析结论。xy2(x)2ecosxMatlab程序如下:y1=2;y2=3;forh=0:0.00001:10,k1=0.00001*(-2*y1+y2+2*sin(h));l1=0.00001*(998*y1-999*y2+999*cos(h)-999*sin(h));y1(0)2。y(0)32k2=0.00001*(-2*(y1+0.5*k1)+(y2+0.5*l1)+2*sin(h+0.000005));l2=0.00001*(998*(y1+0.5*k1)-999*(y2+0.5*l1)+999*cos(h+0.000005)-999*sin(h+0.000005));k3=0.00001*(-2*(y1+0.5*k2)+(y2+0.5*l2)+2*sin(h+0.005));l3=0.00001*(998*(y1+0.5*k2)-999*(y2+0.5*l2)+999*cos(h+0.000005)-999*sin(h+0.000005));k4=0.00001*(-2*(y1+k3)+(y2+l3)+2*sin(h+0.00001));l4=0.00001*(998*(y1+k3)-999*(y2+l3)+999*cos(h+0.00001)-999*sin(h+0.00001));y1=y1+1/6*(k1+2*k2+2*k3+k4);y2=y2+1/6*(l1+2*l2+2*l3+l4);ifh==fix(h),fprintf("%.1d%.4f%.4f\\n",h,y1,y2);elseendend结果如下:
精确解:
forx=0:1:10,y1=2*exp(-x)+sin(x);y2=2*exp(-x)+cos(x);fprintf("%.1d%.4f%.4f\\n",x,y1,y2);end结果;
结果分析:
四阶RungeKutta方法得到的结果已很接近精确解,证明这种迭代方法精确度很好,是一种有效的算法。但是要注意龙格-库塔公式的推导基于泰勒展开方法,因而它要求所求的的解具有较好的光滑性质。反之,如果解得光滑性差,那么,使用四阶龙格-库塔求得的数值解精度就不是太高,此种情况可以采用缩小步长来解决,比如上述计算。7.用有限差分法求解边值问题(h=0.1):
y(1x2)y0.y(1)y(1)1y(1x2)y0微分方程式可以变为用有限差分法matlab程序如下:
y(1)y(1)1h=0.1;n=2/0.1-1;g(1)=1/(h.^2);g(n)=1/(h^2);fori=2:1:18,
g(i)=0;endg=[g(1);g(2);g(3);g(4);g(5);g(6);g(7);g(8);g(9);g(10);g(11);g(12);g(13);g(14);g(15);g(16);g(17);g(18);g(19)];disp(g);fori=1:1:19,forj=1:1:19,ifi==1,H(1,1)=2/(h.^2)+(1+(-1+0.1*i).^2);H(1,2)=-1/(h.^2);elseifi==19,H(19,18)=-1/(h.^2);H(19,19)=2/(h.^2)+(1+(-1+0.1*i).^2);elseifj==i,H(i,j)=2/(h.^2)+(1+(-1+0.1*i).^2);elseifj==i-1,H(i,i-1)=-1/(h.^2);elseifj==i+1;H(i,i+1)=-1/(h.^2);elseH(i,j)=0;endendendenddisp(H);y=H\\g;fori=1:1:19,fprintf("%.4f%.4f\\n",-1+0.1*i,y(i,1))end
运算结果为:
g10000000000000000000100
H矩阵为:
Y在各点的近似值为:
XY8.用函数y=asin(bx)拟合数据.
x0.10.20.30.40.50.60.70.8y0.61.11.61.82.01.91.71.3Matlab上机程序为:function[err,a,b]=nlfitb(x,y)ifnarginbeta0=[11]";beta=nlinfit(x,y,@mymodel,beta0);fprintf("Thenonlinearleastsquarefittingy=a*sin(b*x)fordata\\n\\n");fprintf("%6.1f",x);fprintf("%6.1f",y);fprintf("\\n\\nis\\n\\nty=%7.4f*sin(%7.4f*x)\\n\\n",beta);z=linspace(x(1),x(end),100);plot(x,y,"ro",z,beta(1)*sin(beta(2)*z),"b-.");functionyb=mymodel(beta,xb)yb=beta(1)*sin(beta(2)*xb);计算结果:
9.拟合形如f(x)≈(a+bx)/(1+cx)的函数的一种快速方法是将最小二乘法用于下列问题:f(x)(1+cx)≈(a+bx),试用这一方法拟合表4-4给出的中国人口数据。表4-4次序年份人口(亿)a)b)c)d)e)19535.8219646.95198210.08199011.34201*12.66解:把f(x)(1+cx)≈(a+bx)变成f(x)≈a+bx-cxf(x)则近似看成基函数是1,x,-x*f(x)而数据是(xi,f(xi))的最小二乘拟合问题,程序如下:
function[a,b,c]=ex41x=[1953196419821990201*]";y=[5.826.9510.0811.3412.66]";A=[ones(5,1)x-x.*y];Z=A\\y;a=Z(1)b=Z(2)c=Z(3)z=linspace(1953,201*,100);plot(x,y,"ro",z,(a+b*z)./(1+c*z),"b-.");结果:
所以fx
2.94560.0014x。
10.0004956x10.已知20世纪美国人口的统计数字如表5-12(单位:百万):
表5-12美国人口统计数据年份1900191019201930194019501960197019801990人口76.092.0106.5123.2131.7150.7179.3204.0226.5251.4试分别用两点公式和三点公式计算美国人口20世纪的年增长率。
1采用两点公式,设t(i)表示年份,y(i)表示该年份的美国人口;两点公式为:解;○
l(i)两点公式matlab编程;
t=[1900:10:1990];y(i1)y(i)
t(i1)t(i)y=[76.092.0106.5123.2131.7150.7179.3204.0226.5251.4];fori=1:10,ifi2采用三点公式,设t(i)表示年份,y(i)表示该年份的美国人口;三点公式为:○
l(i)三点公式matlab程序如下:t=[1900:10:1990];3y(i)4y(i1)y(i2)
t(i2)t(i)y=[76.092.0106.5123.2131.7150.7179.3204.0226.5251.4];fori=1:10,ifi
友情提示:本文中关于《MATLAB上机实验报告》给出的范例仅供您参考拓展思维使用,MATLAB上机实验报告:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。
《MATLAB上机实验报告》
由互联网用户整理提供,转载分享请保留原作者信息,谢谢!
http://m.bsmz.net/gongwen/712910.html
- 上一篇:matlab上机实验报告
- 下一篇:MATLAB程序设计教程总结