
MATLAB实习题.doc
13页MATLAB实习题1 矩阵运算矩阵建立,转置、加、减、乘、求逆等运算1) 矩阵的建立: >> a=eye(5); b=1*a; b(1,2)=2;b(2,3)=3;b(3,4)=4;b(4,5)=5;b运行结果:b = 1 2 0 0 0 0 1 3 0 0 0 0 1 4 0 0 0 0 1 5 0 0 0 0 1(2) 矩阵的转置:>> a=[1 2 3;4 5 6;7 8 9], b=a'运行结果:a = 1 2 3 4 5 6 7 8 9b = 1 4 7 2 5 8 3 6 9(3)矩阵的逆: >> a=[1 2 0;0 3 4;0 0 5]; inv(a)运行结果:ans = 1.0000 -0.6667 0.5333 0 0.3333 -0.2667 0 0 0.2000(4)矩阵的加:>> A=[1 1;1 1]A = 1 1 1 1>> B=[2 2;2 2]B = 2 2 2 2>> C=A+B运行结果;C = 3 3 3 3(5)矩阵的减:>> A=[1 1;1 1]A = 1 1 1 1>> B=[2 2;2 2]B = 2 2 2 2>> C=A-B运行结果;C = -1 -1 -1 -1(5)矩阵的乘:>> A=[1 1;1 1]A = 1 1 1 1>> B=[2 2;2 2]B = 2 2 2 2>> C=A*B运行结果;C = 4 4 4 42 M文件的编写与运行判断一年是否是闰年function leapyear(year)%使用该程序判断是否是闰年sign=0;if mod(year,4)~=0 sign=0;elseif mod(year,400)==0 sign=1;elseif mod(year,100)==0 sign=0;else sign=1;endif sign==1 fprintf('%4d year is a leap year!\n',year)else fprintf('%4d year is not a leap year!\n',year)end执行结果:>> leapyear(1996)1904 year is a leap year!>> leapyear(1900)1900 year is not a leap year!3 数据文件的建立与读取例:建立班级一门课成绩数据库,编程读取并排序、另存。
>> score=[80,82,81,65,77,67,55,76,90];>> Fid=fopen('test.dat', 'w');>> cnt=fwrite(Fid, score, 'float');>> fclose(Fid);>> Fid=fopen('test.dat', 'r')>> [B,cnt]=fread(Fid, 'float');>> B>> sortScore=sort(B,1)%排序结果:score=[80,82,81,65,77,67,55,76,90];Fid=fopen('test.dat', 'w');cnt=fwrite(Fid, score, 'float');fclose(Fid);Fid=fopen('test.dat', 'r')[B,cnt]=fread(Fid, 'float');BsortScore=sort(B,1)%排序Fid = 3B = 80 82 81 65 77 67 55 76 90sortScore = 55 65 67 76 77 80 81 82 904 绘二维、三维图 (1)画双纽线>> p=-2*pi:0.01:2*pi; r=sqrt(cos(2*p)); x=r.*cos(p); y=r.*sin(p); plot(x,y)运行结果; (2) 画螺线:a=2; t=0:.1:20;r=a*t; polar(t,r)运行结果:(3) 画球面:>> [x,y,z]=sphere(50); surf(x,y,z)运行结果: 5 多项式运算>> p=[2,-1,0,3]p = 2 -1 0 3>> q=[2,1]q = 2 1>> k=conv(p,q)运行结果:k = 4 0 -1 6 36 曲线拟合例:数据的多项式拟合。
多项式拟合x=[0 30 60 90 120 150 180 210 240 270 300 330 360]y=[-0.0167 -1.0927 -1.8725 -2.3586 -2.3061 -1.9576 -0.9574 -0.0080 0.8896 1.3877 1.1139 0.8517 -0.0167]通过y=-0.52-1.90sin(2πt/360-0.079)进行二次多项式拟合>> x=[0 30 60 90 120 150 180 210 240 270 300 330 360];y=[-0.0167 -1.0927 -1.8725 -2.3586 -2.3061 -1.9576 -0.9574 -0.0080 0.8896 1.3877 1.1139 0.8517 -0.0167];fun=@(a,t) a(1)+a(2)*sind(t+a(3)) a0=[-0.5 -1.9 -0.079];a=nlinfit(x,y,fun,a0)t=0:5:360;yf=fun(a,t);plot(x,y,'o',t,yf)fun = @(a,t) a(1)+a(2)*sind(t+a(3))a = -0.5239 -1.8995 -14.2382运行结果: 7 线性规划例:线性规划求解(如教材中)。
minz=>> c=[2;3;1];a=[1,4,2;3,2,0];b=[8,6];[x,y]=linprog(c,-a,-b,[],[],zeros(3,1))Optimization terminated.运行结果:x = 0.8066 1.7900 0.0166y =7.00008 微分方程数值解例:求微分方程的通解>> dsolve('Dy=x+y','x')ans =-x-1+exp(x)*C19 插值问题例:样条插值给定函数 f(x)=1/(1+x^2),取插值节点为 -5:1:5,利用编制的 Matlab 程序求出三次样条函数,并绘制出准确函数 f(x) 以及所求出的三次样条函数图像,进行比较x = -5:0.001:5;f = 1./(1 + x.^2);xi = -5:1:5;fi = interp1(x, f, xi, 'spline');figure; plot(x, f); hold on; plot(xi, fi, 'r.-'); xlabel('x');ylabel('fx');legend('Raw', 'Interp');运行结果:10 综合练习:计算机模拟例1追逐问题: 如图,正方形ABCD的四个顶点各有一人.在某一时刻,四人同时出发以匀速v=1米/秒按顺时针方向追逐下一人,如果他们始终保持对准目标,则最终按螺旋状曲线于中心点O.试求出这种情况下每个人的行进轨迹.OBCDA>> v=1;dt=0.05;x=[0 0 10 10];y=[0 10 10 0];for i=1:4 plot(x(i),y(i),'.'),hold onendd=20;while(d>0.1) x(5)=x(1);y(5)=y(1); for i=1:4 d=sqrt((x(i+1)-x(i))^2+(y(i+1)-y(i))^2); x(i)=x(i)+v*dt*(x(i+1)-x(i))/d; y(i)=y(i)+v*dt*(y(i+1)-y(i))/d; plot(x(i),y(i),'.'),hold on end end运行结果:例2 导弹追踪问题:设位于坐标原点的甲舰向位于x轴上点A(1, 0)处的乙舰发射导弹,导弹头始终对准乙舰.如果乙舰以最大的速度(是常数)沿平行于y轴的直线行驶,导弹的速度是5,模拟导弹运行的轨迹.又乙舰行驶多远时,导弹将它击中?建立M文件eq2.m如下function dy=eq2(t,y)dy=zeros(2,1);% 初始化dy的两个分量dy(1)=5*(1-y(1))/sqrt((1-y(1))^2+(t-y(2))^2);dy(2)=5*(t-y(2))/sqrt((1-y(1))^2+(t-y(2))^2);在MATLAB命令框中输入命令>> t0=0;tf=2; % 确定自变量的初始值和终值>> [t,y]=ode45('eq2',[t0,tf],[0,0]);>> plot(y(:,1),y(:,2),'-')% 画出导弹运动轭迹图>> x=0:0.01:1.5;>> y=0.2:0.2;>> hold on% 在同一个图形座标上继续作图>> plot(x,y,'-')% 画一条经过y值为0.2的横线运行结果:。