(仅供参考)MATLAB练习作业(已做)2012

(仅供参考)MATLAB练习作业(已做)2012
(仅供参考)MATLAB练习作业(已做)2012

说明:如在测试时请将程序中的中文字符改为西文(部分程序为手写,并未经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])

-5

5

-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)

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模型的状态方程表示为:

相关主题
相关文档
最新文档