(仅供参考)MATLAB练习作业(已做)2012
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明:如在测试时请将程序中的中文字符改为西文(部分程序为手写,并未经matlab验证)
2012年春《MATLAB基础》第一次上机练习与作业练习1:脚本文件
建立一个文件名为helloWorld的脚本文件,运行该文件时显示出如下文字:
Hello World!
I am going to learn MATLAB
•提示:用disp显示字符串,将要显示的字符号串用单引号引起来。
如'This is a string'
练习2:变量
获取并保存当前的日期与时间
●用函数clock生成一个变量,变量名为start
●用size查看start的维数,它是一个行向量还是一个列向量?
●start包含什么内容?用help clock查看
●用函数datestr将向量start转换成字符串,得到新的变量,名为startString
●将start与startString保存为mat文件,文件名为startTime
●在练习1建立的脚本文件helloWorld.m文件中,用load函数导入变量startTime,并显示如下文字:
I started learning MATLAB on*start date and time*
练习3:标量
你将要以指数增长的速度来学习MATLAB,将如下内容添加到helloWorld.m文件中
●假设你的学习时间是一个常量,为1.5days,将此时间用秒表示,赋给变量tau
●假设课程持续时间为5days.将这个时间单位转换为秒,保存在变量endofClass中?
●将学到的知识描述为t的函数,函数方程为:
●用函数datestr将向量start转换成字符串,得到新的变量startString
●在课程结束时间endofClass,你将学到多少知识?用变量knowledgeAtEnd表示(指数函数exp)
●用变量knowledgeAtEnd,显示如下语句:
At the end of the MATLAB class,I will know X%of MATLAB
提示:将数转换成字符串,用num2str
练习4:向量运算
计算从课程开始到现在经过的时间,用秒表示.
●在helloWorld.m中,建立一系列变量,变量名分别为:secPerMin,secPerHour,
secPerDay,secPerMonth(假设每个月30.5天),以及secPerYear.
●将变量按次序secPerYear,secPerMonth,secPerDay,secPerHour,secPerMin,1排列,构
成一个行向量,命名为secConversion?
●用时钟函数clock生成一个向量currentTime
●计算经过的时间elapsedTime,用currentTime与start相减.
●通过向量secondConversion与elapsedTime的数量积运算计算时间t,
●显示当前的时间水平,用变量currentKnowledge表示.()
●显示如下语句:
At this time,I know X%of MATLAB
练习5:向量函数
计算你的学习轨迹.
●在helloWorld.m中,建立线性时间向量tVec,包含从0到endOfClass的10000个样本点.
●计算在每个时间点处对应的知识值,仍然用函数
练习6:向量寻址
什么时候你将学到50%的MATLAB知识?.
●在向量knowledgeVec中,查找最接近0.5的元素所在的位置.
●用halfTime保存对应的时间
●显示如下语句:
I will know half of MATLAB after X days
要将halfTime用secPerDay转换成天数
练习7:绘图
画出学习的轨迹图?.
●在helloWorld.m中,打开一个新的图形窗口(figure)
●用向量tVec与knowledgeVec画出知识轨迹,画图时,将时间单位转换为天
●用图形窗口中的zoom in查看halfTime,与前面计算结果相比较.
clear,clc;
disp('Hello World!');
disp('I am going to learn MATLAB');
start=clock;
[startx,starty]=size(start);
if startx>starty
disp('一个行向量')
else
disp('一个列向量');
end
startString=datestr(start);
save startTime.mat start startString;
waittime=input('为使程序达到较好的执行效果,请输入程序需要暂停时间(秒):'); state=0;
h=waitbar(0,'请等待...','Name','进度条','CreateCancelBtn',...
'state=1;delete(h);clear h');
h1=findall(h,'style','pushbutton');
set(h1,'string','取消','fontsize',10)
for i=1:100
waitbar(i/100,h,['已暂停时间百分比'num2str(i)'%']);
pause(waittime/100);
if state
break
end
end
if exist('h')==1
delete(h);
end
load startTime
disp('I started learning MATLAB on*start date and time*');
tau=1.5*24*3600;
endofClass=5*24*3600;
knowledgeAtEnd=1-exp(-tau/endofClass);
disp(['At the end of the MATLAB class,I will know',num2str(knowledgeAtEnd*100),'%of MATLAB']);
secPerMin=60;
secPerHour=3600;
secPerDay=24*secPerHour;
secPerMonth=30.5*secPerDay;
secPerYear=12*secPerMonth;
secondConversion=[secPerYear,secPerMonth,secPerDay,secPerHour,secPerMin,1]; currentTime=clock;
elapsedTime=currentTime-start;
elapsedTime=elapsedTime.*secondConversion;
currentknowledge=1-exp(-elapsedTime/endofClass);
disp(['At this time,I know',num2str(sum(currentknowledge)*100),'%of MATLAB']);
tVec=linspace(0,endofClass,1000);
knowledgeVec=1-exp(-tVec./endofClass);
halfTimeindex=find(abs(knowledgeVec-0.5)<1e-3);
halfTime=sum(tVec(halfTimeindex))/length(halfTimeindex)/secPerDay;
disp(['I will know half of MATLAB after',num2str(halfTime),'days']);
plot(tVec/secPerDay,knowledgeVec);
xlabel('Day');
2012年春《MATLAB基础》第二次上机练习与作业练习1:函数文件
建立一个文件名为plotSin的函数文件,要求:
●函数声明为:
functon plotSin(f1)
●该函数用于画出频率为的正弦波在区间上的图像.
●每个周期含有16个数据点
function plotsin(f1)
xnum=16*f1;
x=linspace(0,2*pi,xnum);
plot(x,sin(f1*x));
练习2:条件语句
●修改函数plotSin(f1)使之有两个输入变量,形式为plotSin(f1,f2)
●如果输入的变量个数为1,执行以前写的绘图命令.否则显示文字'Two inputs were given'
●提示:输入变量的数目用内置变量名:nargin
function plotsin(f1,f2)
if nargin==1
xnum=16*f1;
x=linspace(0,2*pi,xnum);
plot(x,sin(f1*x));
else
error('Two inputs were given');
end
练习3:绘图命令
●修改PlotSin中的绘图命令,将数据点类型改为正方形,线形改为红色虚线,线宽为2.设置数据点填充
色为黑色(属性名为:LineWidth,MarkerFaceColor)
●如果有2个输入变量,新开一个绘图窗口,上下排列,并且激活上面图形窗口
plotSin(6)
plotSin(2,3)
function plotsin(f1,f2)
if nargin==1
h1=figure(1);
xnum=16*f1;
x=linspace(0,2*pi,xnum);
plot(x,sin(f1*x),'--rs','MarkerFaceColor','k','LineWidth',2); else
h2=figure(2);
h1=figure(1);
xnum=16*f1;
x=linspace(0,2*pi,xnum);
plot(x,sin(f1*x),'--rs','MarkerFaceColor','k','LineWidth',2); end
练习4:半对数图
在过去5年里,某课程学生人数分别为:15,25,55,115,144.班级规模似乎呈指数增长趋势,用半对数图来验证.要求绘制的图形效果如下
●相关函数:semilogy,xlabel,ylabel,axis,title
●数据点为玫红,正方形,没有折线相连.点的大小为10,点边线的宽度为4.
x=1:5;
y=[15,25,55,115,144];
h=semilogy(x,y,'sr','MarkerSize',10,'Linewidth',4);
xlabel('x');
ylabel('y');
title('My Semilogy plot');
axis([0,6,10,300])
set(h,'Color',[10.30.6]);
练习5:条形图
生成一个有5个随机数构成的向量,画出一幅条形图,条形块为红色.效果如下:
bar(1:5,rand(5,1),'r')
练习6:圆的绘制
●建立一个画圆的函数文件.function[x y]=getCircle(center,r)运行程序得到的是圆上点的坐
标
●调用程序画出同心圆及五环图,效果如下
col=['b','k','r','y','g'];subplot 121r1=1:5;center1=[0,0];for i=1:5[x,y]=getCircle(center1,r1(i));plot(x,y,col(i),'Linewidth',2);
hold on
end axis equal axis([-55-55])subplot 122r2=0.5;center2=[-10;00;10;-0.5-0.5;0.5-0.5];for i=1:5[x,y]=getCircle(center2(i,:),r2);plot(x,y,col(i),'Linewidth',2);
hold on
end axis equal axis([-1.51.5-1.51])
-505-50
5-101
2012年春《MATLAB 基础》第三次上机练习与作业
练习1:演示文件
命令窗口中,键入:demo,出现MATLAB的demo演示窗口,然后选择:MATLAB下的Matrices,依次选取其中的Basic Matrix operation、Matrix manipulation两个示例,进行MATLAB矩阵运算的学习。
练习2:一维数组的创建
要求在闭区间上产生具有10个等距采样点的一维数组。
试用两种不同的指令实现。
(提示:冒号生成法,定点生成法)
X=0:pi/9:2*pi;
X=linspace(0,2*pi,10);
练习3:二维数组的标识与寻访
●先运行clear,A=magic(4),然后根据A写出两个矩阵:一个对角阵B,
其相应元素由A的对角元素构成;另一个矩阵C,其对角元素全为0,而其
余元素与对应的A阵元素相同。
(提示:diag)
Clear
A=magic(4);
B=diag(A);
C=A;
for i=1:4
C(i,i)=0;
end
●由指令A=rand(3,5)生成二维数组A,试求该数组中所有大于0.5的元素的
位置,分别求出它们的“全下标”和“单下标”。
(提示:find和sub2ind)A=rand(3,5);
[B1,B2]=find(A>0.5);
B=[B1;B2];
C=sub2ind(size(A),3,2);
A(3,2)==A(C);
练习4:向量化运算
●在时间区间[0,10]中,绘制曲线。
要求分别采取“标量循
环运算法”和“数组运算法”编写两段程序绘图。
(注意:体验数组运算的简捷。
)
标量循环运算法
t=linspace(0,10);
for i=1:length(t)
y(i)=1-exp(-0.5*t(i))*cos(2*t(i));
end
plot(t,y);
数组运算法
t=linspace(0,10);
y=1-exp(-0.5*t).*cos(2*t);
plot(t,y);
练习5:非数
●先运行指令x=-3*pi:pi/15:3*pi;y=x;[X,Y]=meshgrid(x,y);
warning off;Z=sin(X).*sin(Y)./X./Y;产生矩阵Z。
(1)请问矩阵Z中有多少个“非数”数据?(2)用指令surf(X,Y,Z);shading
interp观察所绘的图形。
(3)请写出绘制相应的“无裂缝”图形的全部
指令。
(提示:isnan,sum,eps)
x=-3*pi:pi/15:3*pi;
y=x;
[X,Y]=meshgrid(x,y);
warning off;
Z=sin(X).*sin(Y)./X./Y;
[Z1,Z2]=find(isnan(Z));
fprintf('矩阵Z中有%d个“非数”数据\n',length(Z1));%length(Z1)==sum(Z1) surf(X,Y,Z);
shading interp
“无裂缝”图形的全部指令
x=-3*pi:pi/15:3*pi;
y=x;
[X,Y]=meshgrid(x,y);
warning off;
Z=sin(X).*sin(Y)./X./Y;
Znan=find(isnan(Z(1,:)));
eps=0.1;
espe=x(Znan-1):eps:x(Znan+1);
x=[x(1:Znan-1),espe,x(Znan+1:end)];
y=x;
[X,Y]=meshgrid(x,y);
warning off;
Z=sin(X).*sin(Y)./X./Y;
surf(X,Y,Z);
shading interp
在图形绘制语句中,或函数值为不定式NaN,则相应的结果不绘制出来,试利用该规律绘制的曲面图,并剪切下的部分(图形效果如下)
t=-4:0.05:4;
x=t;
y=t;
[X,Y]=meshgrid(x,y);
Z=sin(X.*Y);
count=[];
for i=1:length(t)
for j=1:length(t)
if x(i)^2+y(j)^2<=0.5^3
Z(i,j)=nan;
end
end
end
surf(X,Y,Z);
练习6:sum的使用
下面有一段程序,企图用来解决如下计算任务:有矩阵
,当依次取10,9,8,7,6,5,4,3,2,1时,计算矩阵“各列元素的和”,并把此求和结果存放为矩阵Sa的第k行。
例如时,A阵为,此时它各列元素的和是一个行数
组,并把它保存为Sa的第3行。
问题:该段程序的计算结果对吗?假如计算结果不正确,请指出错误发生的根源,并改正之。
for k=10:-1:1;
A=reshape(1:10*k,k,10);
Sa(k,:)=sum(A);
end;
Sa
(提示:本题专为揭示sum对行数组的作用而设计。
仔细观察程序运行后所得到的Sa正确吗?)
sum函数求和方式错误
for k=10:-1:1;
A=reshape(1:10*k,k,10);
Sa(k,:)=sum(A,1);
end;
disp(Sa);
2012年春《MATLAB基础》第四次上机练习与作业练习1:矩阵及线性方程组求解
●将矩阵、和组合成新矩阵:
●若,考虑线性方程组,求出系数矩阵的秩及增广矩阵的秩,判断方程组是否有解
(rank)
若有解,求出一个特解,若无解,求出一个最小二乘解。
(用\)
a=[4,2;5,7];
b=[7,1;8,3];
c=[5,9;6,2];
a=reshape(a,1,4);
b=reshape(b,1,4);
c=reshape(c,1,4);
A=[];
for i=1:4
A=[A;a(i),b(i),c(i)];
end
d=[1,2,3,4];
fprintf('系数矩阵的秩:%d\n',rank(A));
And=[A,d'];
fprintf('增广矩阵的秩:%d\n',rank(And));
%无解rank(A)<rank(And)
C=d'\A;
disp('最小二乘解:');
disp(C);
练习2:一般代数方程的解
先画出函数的图形进行观察,再用fzero求该函数的零点。
fun=@(t)(sin(t).^2).*exp(-0.1*t)-0.5*abs(t);
gu=[-2,-.5,.5,2];for i=1:4zerosindex(i)=fzero(fun,gu(i));
end
disp('零点x=');disp(zerosindex);
t=linspace(-10,10);y=(sin(t).^2).*exp(-0.1*t)-0.5*abs(t);
plot(t,y);hold on
line([-10,10],[0,0]);
练习3:多项式拟合
●假设产生数据的原始模型为
,在[-3,3]中取值,受到噪声
0.3*(rand(n,1)-0.5)的污染。
●对含噪声的数据做3次多项式拟合,画出拟合曲线进行比较。
●如果做2次多项式拟合,结果如何?
x=linspace(-3,3);t=[1-502];y=x.^3-5*x.^2+2;
randy=y+0.3*(rand-0.5);
plot(x,y,x,polyval(polyfit(x,randy,3),x),...
x,polyval(polyfit(x,randy,2),x));
legend('原图','3次插值图','2次插值图','Location','SouthEast');
练习4:数值积分
求积分,其中
syms x ;
y=sin(x)/x;
s=int(y,x,0,z);
练习5:高阶微分方程
在初始条件,情况下,求解著名的van der Pol 微分方程。
在时,该方程是典型的刚性(Stiff)方程。
(ode15s)
tmax=4000;
x0=[10]';
mu=1000;
[t,x]=ode15s('van_de_pol',[0,tmax],x0,[],mu);
plot(t,x(:,1),'o');
=van_de_pol(t,x,flag,mu)
dx2dt2=[x(2);
mu*(1-x(1)^2)*x(2)-x(1)];
练习6:Lornez系统
假设著名的Lorenz模型的状态方程表示为:
其中,设,,,若令初值为,而为机器上可以识别的小常数,如取一个很小的正数,试求解该微分方程组(ode45)
tmax=100;
x0=[0;0;1e-10];
[t,x]=ode45('lorenzeq',[0,tmax],x0);
fig=figure;
subplot121
plot(t,x);
subplot122
plot3(x(:,1),x(:,2),x(:,3));
axis([1042-2020-2025]);
set(0,'CurrentFigure',fig);
set(fig,'Position',[190,200,1000,400]);
function dxdt=lorenzeq(t,x)
dxdt=[-8/3*x(1)+x(2)*x(3);
-10*x(2)+10*x(3);
-x(1)*x(2)+28*x(2)-x(3)];。