常州大学MATLAB实习报告.docx
《常州大学MATLAB实习报告.docx》由会员分享,可在线阅读,更多相关《常州大学MATLAB实习报告.docx(27页珍藏版)》请在冰豆网上搜索。
常州大学MATLAB实习报告
序号:
41
学号:
11461215
常州大学
实习资料袋
数理学院学院;2013~2014学年第一学期
实习名称MATLAB应用软件实习指导教师张燕新
学生姓名段旭专业班级电科112
实习单位常州大学W3机房
成绩实习时间2013年12月30日2014年1月10日
目录清单
序号
材料名称
有“√”
备注
1
实习日记
2
实习报告
√
3
4
5
指导教师(签字):
序号:
41
学号:
11461215
实习报告
实习课程名称:
Matlab应用软件实习
实习题目:
Matlab综合应用
学生姓名:
段旭
学院(系):
数理学院专业班级:
电科112
校内指导教师:
张燕新专业技术职务:
讲师
实习时间:
2013年12月30日2014年1月10
Matlab应用软件实习
摘要:
MATLAB(矩阵实验室)是MATrixLABoratory的缩写,是一款由美国TheMathWorks公司出品的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++和FORTRAN)编写的程序。
本次实习,针对MATLAB的一些计算功能进行了一些浅显的实验与研究,主使用了MATLAB的函数计算、数值模拟和一些常用的画图功能。
最后,用MATLAB进行了几个简单的数学建模实验。
关键词:
Matlab;实习;应用;
目录
摘要I
目录II
1背景1
1.1MATLAB简介1
1.2MATLAB历史1
2详细求解2
2.1必做题2
2.2选做题11
3总结15
参考文献16
1背景
1.1MATLAB简介
MATLAB是由美国MathWorks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
1.2MATLAB历史
1970年代末到80年代初,时任美国新墨西哥大学教授的克里夫·莫勒尔为了让学生更方便地使用LINPACK及EISPACK(需要通过FORTRAN编程来实现,但当时学生们并无相关知识),独立编写了第一个版本的MATLAB。
这个版本的MATLAB只能进行简单的矩阵运算,例如矩阵转置、计算行列式和本征值,此版本软件分发出大约两三百份。
1984年,杰克·李特、克里夫·莫勒尔和斯蒂夫·班格尔特(SteveBangert)合作成立了MathWorks公司,正式把MATLAB推向市场。
MATLAB最初是由莫勒尔用FORTRAN编写的,李特和班格尔特花了约一年半的时间用C重新编写了MATLAB并增加了一些新功能,同时,李特还开发了第一个系统控制工具箱,其中一些代码到现在仍然在使用。
C语言版的面向MS-DOS系统的MATLAB1.0在拉斯维加斯举行的IEEE决策与控制会议(IEEEConferenceonDecisionandControl)正式推出,它的第一份订单只售出了10份拷贝,而到了现在,根据MathWorks自己的数据,目前世界上100多个国家的超过一百万工程师和科学家在使用MATLAB和Simulink。
1992年,学生版MATLAB推出;1993年,MicrosoftWindows版MATLAB面世;1995年,推出Linux版。
2详细求解
2.1必做题
2.1.2求解常微分方程x’’=-x’+x+1,x’(0)=1,x(0)=0(使用函数dsolve)
>>dsolve('D2x=-Dx+x+1','Dx(0)=1','x(0)=0')
ans=
exp(t*(5^(1/2)/2-1/2))*((3*5^(1/2))/10+1/2)+(5^(1/2)*exp(-t*(5^(1/2)/2+1/2))*(5^(1/2)-3))/10-1
2.1.3已知t=an2+bn,测得对应数据如下:
(多项式插值interp1)
t=[0,20,40,60,80,100,120,140,160,183.5];
n=[0,1153,2045,2800,3466,4068,4621,5135,5619,6152];
试求a和b的值。
>>t0=[0,20,40,60,80,100,120,140,160,183.5];
n0=[0,1153,2045,2800,3466,4068,4621,5135,5619,6152];
n=0:
0.001:
6152;
t=interp1(n0,t0,n,'spline');
p=polyfit(n,t,2)
p=
0.00000.01440.0631
2.1.4请用梯形法、辛普森法分别计算积分值(trapz、quad)
>>dblquad('x.^2+y.^2+x*y+2*x+y+1',0,1,0,2)
ans=
10.3333
>>f=inline('sqrt(x.^2+x+1)','x');
>>quad(f,0,1)
ans=
1.3369
>>x=0:
0.01:
1;y=sqrt(x.^2+x+1);trapz(x,y)
ans=
1.3369
2.1.5计算二重积分
(使用函数dblquad)
2.1.6矩阵M=[1,2,6;4,2,7;8,9,3],求M的LU分解,QR分解,对角阵,特征值分解。
(使用函数lu、qr、shol、eig)
>>symsabcABC
eq1='a=3';
eq2='A=4';
eq3='b=a^2';
eq4='B=b^2-1';
eq5='c=a+A-2*B';
eq6='C=a+B+2*c';
x=solve(eq1,eq2,eq3,eq4,eq5,eq6);
>>x.C
ans=
-223
>>diag(M)
ans=
1
2
3
>>M=[1,2,6;4,2,7;8,9,3];lu(M)
ans=
8.00009.00003.0000
0.5000-2.50005.5000
0.1250-0.35007.5500
>>qr(M)
ans=
9.00009.11116.4444
-0.50002.4470-2.3360
-1.0000-0.47196.8566
>>[D,X]=eig(M)
D=
-0.4111-0.7719-0.4992
-0.54840.6237-0.3914
-0.72820.12290.7730
X=
14.294400
0-1.57120
00-6.7232
2.1.7a=3,A=4,b=a2,B=b2-1,c=a+A-2B,C=a+B+2c,求C。
(使用函数solve)
2.1.8用两种方法求解Ax=b的解。
(A为四阶随机矩阵,b为四阶向量,自己创建)。
>>B=[1;2;3;4];x=inv(A)*B
x=
-6.4970
1.9163
10.9584
-3.8362
>>A=rand(4)
A=
0.95010.89130.82140.9218
0.23110.76210.44470.7382
0.60680.45650.61540.1763
0.48600.01850.79190.4057
方法一:
方法二:
>>A(:
5)=B;rref(A)
ans=
1.0000000-6.4970
01.0000001.9163
001.0000010.9584
0001.0000-3.8362
2.1.9
,用两种方法求函数的根,并求其极值与零点。
方法一:
>>solve('x^3+(x-0.8)^2/(x+1.25)^3-5*x-5/x');x=double(ans);
>>fori=1:
length(x)
xx(i)=isreal(x(i));
end
>>x=x(xx)
x=
2.4156
方法二:
>>fzero('x.^3+(x-0.8).^2/(x+1.25).^3-5*(x+1/x)',3)
ans=
2.4156
>>x=t
(1);y1=subs(y)
y1=
16.2832
>>x=t
(2);y2=subs(y)
y2=
-6.4732
>>z=diff(diff(y));
>>x=t
(1);z1=subs(z)
z1=
205.8164
>>x=t
(2);z2=subs(z)
z2=
-53.5382
>>symsxy
>>y=x.^3+(x-0.8).^2/(x+1.25).^3-5*(x+1/x);
>>dydx=diff(y);
>>solve(dydx);x=double(ans);
>>fori=1:
length(x)
xx(i)=isreal(x(i));
end
>>t=x(xx)
t=
-0.4694
-2.4039
求极值:
所以函数f(x)存在一个极大值点x1=-2.4039,极大值为-6.4732;一个极小值点x2=-2.4039,极小值为16.2832
2.1.10f(x)的定义如下:
,写一个matlab函数func1实现该函数。
2.1.11写一个MATLAB小程序,求出最小的n值,使得n!
>realmax。
functionfunc1(x)
ifx<0&&x==-4
y=x^2+x-6;
elseifx>=0&x<10&x~=2&x~=3
y=x^2-5*x+6;
else
y=x^2-x-1;
end
fprintf('%d\n',y);
functionf=realmax()
s=1;n=1;
while
(1)
n=n+1;
s=s*n;
ifs>realmax
break;
end
end
fprintf('最小的整数为:
%d\n',n)
2.1.12写一个MATLAB函式myfun.m来计算下列方程式:
y=0.5*exp(x/3)-x*x*sin(x)
其中x是函式的输入,y是函式的输出。
你的函式必须能够处理当x是纯量或是向量的两种情况。
functionf=myfun(x)
n=length(x);
fori=1:
n
f(i)=0.5*exp(x(i)/3)-x(i)*x(i)*sin(x(i));
end
2.1.13写一个MATLAB函式pifun.m来计算下列级数:
f(n)=4*(1-1/3+1/5-1/7+1/9-1/11+...)
其中n为函式的输入,级数和f(n)则是函式的输出。
此外,你必须进行下列事项:
(1)使用tic和toc指令来测量pifun(100000)的计算时间。
如果你不知道如何使用这两个指令,请使用helptic及helptoc来查出它们的用法。
我的计算机是Pentium-450,所得的计算时间约为2秒。
请说明你的计算机规格以及其计算时间。
(2)使用flops指令来测量pifun(100000)所用到floatingpointoperations的计算次数。
如果你不知道如何使用这个指令,请使用helpflops来查出它的用法。
function[sum,time,flop]=pifun(n)
%f(n)=4*(1-1/3+1/5-1/7+1/9-1/11+...)
tic
sum=0;
i=0;
flag=1;
fori=0:
1:
n
sum=sum+4*(flag/(2*i+1));
flag=-flag;
end
time=toc
2.1.15求下列函数的极小点:
>>f='x
(1)^2+4*x
(2)^2+9*x(3)^2-2*x
(1)+18*x
(2)';
[x,fm]=fminsearch(f,[0,0,0])
x=
1.0000-2.25000.0000
fm=
-21.2500
1)
2)
>>f='x
(1)^2+3/2*x
(2)^2-2*x
(1)*x
(2)+x
(1)-2*x
(2)';
[x,fm]=fminsearch(f,[0,0])
x=
0.4999771936726811.000008683829168
fm=
-0.749999998970666
3)
>>f='(x
(1)-1)^4+x
(2)^2';
>>[x,fm]=fminsearch(f,[0;1])
x=
0.999965270122533
-0.000000006400016
fm=
4.241503967641482e-017
4.241503967641482e-017
2.1.17设f(x,y)=4sin(x3y),求
2.1.19对于迭代模型
x
(1)=0;
y
(1)=0;
fori=1:
1:
3000;%开始先从1到3000
x(i+1)=1+y(i)-1.4*x(i)^2;
y(i+1)=0.3*x(i);
holdon
plot(x(i),y(i),'*b')
end
取初值x0=0,y0=0,进行3000次迭代,对于k>1000,在(xk,yk)处亮一点(注意不要连线)可得所谓Henon引力线图。
>>symsfsy;
symsfxy;
f=4*sin(x.^3*y);
z=diff(diff(f,x),y);
x=2;y=3;subs(z)
ans=
1.0636e+003
2.1.20请设计一个程序,程序完成下列功能:
(1)让用户输入一个矩阵A;
(2)在A中找出小于0的矩阵元素的位置;
(3)在A中统计出等于0的元素的个数;
(4)显示A的行数和列数;
(5)找出矩阵A各元素中的最大值(显示值,不显示元素位置)。
2.11.21请设计一个程序,程序完成下列功能:
(1)让用户依次输入两个字符串s1和s2;
(2)比较两个字符串的长度并显示比较结果;
functionf=title21()
s1=input('请输入字符串s1:
','s');
s2=input('请输入字符串s2:
','s');
m=length(s1);n=length(s2);
t=m;kk=0;
ifm>n
t=n;disp('s1大于s2.');
elseifmelsedisp('字符串相等.');
end
fori=4:
t
forj=1:
m-i+1
fork=1:
n-i+1
ifstrcmp(s1(j:
j+i-1),s2(k:
k+i-1))==1
l=0;
forr=1:
kk
ifstrcmp(s1(j:
j+i-1),b{r})==1
l=1;
break;
end
end
ifl==0
kk=kk+1;
b{kk}=s1(j:
j+i-1);
end
end
end
end
end
fori=1:
kk
fprintf('有%d个相同字符串',i);
disp(b{i});
end
functionf=title20()
a=input('请输入矩阵A:
');
[m,n]=size(a);
t=0;p=0;
fori=1:
m
forj=1:
n
ifa(i,j)<0
p=p+1;
fprintf('0序号%d¸位置(%d,%d)\n',p,i,j);
end
ifa(i,j)==0
t=t+1;
end
end
end
B=a(:
);max=B
(1);
fori=2:
m*n
ifB(i)>max
max=B(i);
end
end
ifp==0
disp('小于0.');
end
fprintf('A中0的个数为%d\n',t);
fprintf('A的行数为%d列数为%d\n',m,n);
fprintf('A中元素最大值为%d\n',max);
(3)判断s1与s2有没有长度在3个字符以上的相同子串,显示判断结果。
2.1.22编写程序模拟杨氏双缝干涉
两相干光源到接收屏上P点距离r1=(D2+(y-a/2)2)1/2,r2=(D2+(y+a/2)2)1/2,相位差
Φ=2π(r2-r1)/λ,光强I=4I0cos2(Φ/2)编写程序
clear
lam=500e-9;
a=2e-3;D=1;
ym=5*lam*D/a;xs=ym;
n=101;ys=linspace(-ym,ym,n);
fori=1:
n
r1=sqrt((ys(i)-a/2).^2+D^2);
r2=sqrt((ys(i)+a/2).^2+D^2);
phi=2*pi*(r2-r1)./lam;
B(i,:
)=sum(4*cos(phi/2).^2);
end
N=255;
Br=(B/4.0)*N;
subplot(1,2,1);
image(xs,ys,Br);
colormap(gray(N));
subplot(1,2,2);
plot(B,ys);
2.1.24绘制三元函数
的可视化图形
x=-5:
0.05:
5;y=-5:
0.05:
5;z=-5:
0.05:
5;
[x,y,z]=meshgrid(x,y,z);
v=x.^2+y.^2+z.^2;
isosurface(x,y,z,v,10);
axisequal
[x,y,z,v]=flow;
q=1./sqrt(1-x).*log(x-y)-z;
p=patch(isosurface(x,y,z,v,0));
isonormals(x,y,z,q,p)
set(p,'FaceColor','blue','EdgeColor','none');
view(3)
camlight;lighting
2.1.25绘制
的图象
2.2选做题
2.2.28某公司投资2000万元建成一条生产线。
投产后,在时刻t的追加成本和追加收益分别为G(t)=
(百万元/年),H(t)=
(百万元/年)。
试确定该生产线在合适何时停产可获最大利润?
最大利润是多少?
要求:
写出数学模型、M函数(如果需要的话)、运算命令和计算结果。
解:
利润函数
(百万元)
f(t)=H(t)-G(t)=175-t-3t2/3,f(t)单调递减,则当f(t)=0时利润最大
f='175-t-3*t^(2/3)';
t=double(solve(f))
f=inline('175-t-3*t.^(2./3)');
r=quad(f,0,107.2708)-20
t=
1.0e+002*
1.9536-1.0860i
1.9536+1.0860i
1.0727
r=
8.6397e+003
即在第108年停产可获最大利润,最大利润为8639.7百万元。
2.2.29一幢楼房的后面是一个很大的花园。
在花园中紧靠着楼房建有一个温室,温室高10英尺,延伸进花园7尺。
清洁工要打扫温室上方的楼房的窗户。
他只有借助于梯子,一头放在花园中,一头靠在楼房的墙上,攀援上去进行工作。
他只有一架20米长的梯子,你认为他能否成功?
能满足要求的梯子的最小长度是多少?
步骤:
1.先进行问题分析,明确问题;
2.建立模型,并运用Matlab函数求解;
3.对结果进行分析说明;
4.设计程序画出图形,对问题进行直观的分析和了解(主要用画线函数plot,line)
。
若梯子能恰好放置,则梯子的长度f与倾角x关系如下:
(其中a=
m,b=3.048m,0)
接下来用Matlab求该函数的最小值:
L=inline('3.048/sin(x)+2.333/cos(x)','x');
x=fminbnd(L,0.01,pi/2-0.01)
l=subs(L)
ezplot('3.048/sin(x)+2.333/cos(x)',[0,pi/2])
由以上可知梯子的最小长度为7.59m。
所以他能成功。
2.2.30某大学青年教师从31岁开始建立自己的养老基金,他把已有的积蓄10000元也一次性地存入,已知月利率为0.001(以复利计),每月存入700元,试问当他60岁退休时,他的退休基金有多少?
又若,他退休后每月要从银行提取1000元,试问多少年后他的基金将用完?
functionf=title30()
s=10000;t=0;
fori=1:
1:
360
s=s*(1+0.001)+700;
end
fprintf('60岁时退休金为:
%s.\n',s);
whiles>0
s=(s-10