南昌大学matlab实验报告2.docx
《南昌大学matlab实验报告2.docx》由会员分享,可在线阅读,更多相关《南昌大学matlab实验报告2.docx(19页珍藏版)》请在冰豆网上搜索。
南昌大学matlab实验报告2
MATLAB实验报告
詹如平
5901112154
机制124班
机电工程学院
实验五matlab求解多项式(常微分方程)
一、实验目的
1、了解MATLAB中主要用dsolve求符号解析解,ode45,ode23,ode15s求数值解。
注释:
s=dsolve(‘方程1’,‘方程2’,…,’初始条件1’,’初始条件2’…,’自变量’)
用字符串方程表示,自变量缺省值为t。
导数用D表示,2阶导数用D2表示,以此类推。
S返回解析解。
在方程组情形,s为一个符号结构。
[tout,yout]=ode45(‘yprime’,[t0,tf],y0)采用变步长四阶Runge-Kutta法和五阶Runge-Kutta-Felhberg法求数值解,yprime是用以表示f(t,y)的M文件名,t0表示自变量的初始值,tf表示自变量的终值,y0表示初始向量值。
输出向量tout表示节点(t0,t1,…,tn)T,输出矩阵yout表示数值解,每一列对应y的一个分量。
若无输出参数,则自动作出图形。
ode45是最常用的求解微分方程数值解的命令,对于刚性方程组不宜采用。
ode23与ode45类似,只是精度低一些。
ode12s用来求解刚性方程组,是用格式同ode45。
可以用helpdsolve,helpode45查阅有关这些命令的详细信息.
二、实验要求(选作下列习题)
1.求下列微分方程的解析解
程序:
symsxya;
s1=dsolve('D2y+Dy*2-3*y=exp(-3*x)','x')
s2=dsolve('D2y-3*Dy=2*sin(x)*exp(2*x)','x')
s3=dsolve('D2y+y*a^2=sin(x)','x')
s4=dsolve('D2y*y-Dy*Dy-1=0','x')
s5=dsolve('Dy=y^3./(2*(x*y^2-x^2))','y
(1)=1','x')
s6=dsolve('D2y+Dy+y=cos(x)','y(0)=0,Dy(0)=1.5','x')
s7=dsolve('D2y+y=exp(x)+cos(x)','y(0)=1,Dy(0)=1','x')
s8=dsolve('D3y+2*D2y+Dy=0','y(0)=2,Dy(0)=0,D2y(0)=-1','x')
结果:
s1=
exp(x)*C2+exp(-3*x)*C1-1/4*x*exp(-3*x)
s2=
-1/5*cos(x)*exp(2*x)-3/5*sin(x)*exp(2*x)+1/3*exp(3*x)*C1+C2
s3=
sin(a*x)*C2+cos(a*x)*C1+sin(x)/(a^2-1)
s4=
1/2*C1*(1/exp(1/C1*x)^2/exp(1/C1*C2)^2+1)*exp(1/C1*x)*exp(1/C1*C2)
1/2*C1*(exp(1/C1*x)^2*exp(1/C1*C2)^2+1)/exp(1/C1*x)/exp(1/C1*C2)
s5=
exp(-1/2*lambertw(-exp(-1)/x)-1/2)
s6=
1/3*exp(-1/2*x)*sin(1/2*3^(1/2)*x)*3^(1/2)+sin(x)
s7=
1/2*sin(x)+1/2*exp(x)+1/2*cos(x)+1/2*sin(x)*x
s8=
1+exp(-x)+exp(-x)*x
>>
2.求方程
的解析解和数值解,并进行比较
解方程程序:
symsxy;
y=dsolve('D2y*(1+x^2)=2*x*Dy','y(0)=1,Dy(0)=3','x')
结果:
y=
1+3*x+x^3
a.程序建立函数文件fun.m
functionf=fun(x,y)
f=y-x^3+3*x^2-3*x+2;
b.主程序:
[x,y]=ode45('fun',[0,1],1);
plot(x,y1,'rp')
holdon
x=0:
0.1:
1;
y2=1+x.^3+3*x;
plot(x,y2,'b')
结果;
实验七函数文件
一、实验目的
1、理解函数文件的概念。
2、掌握定义和调用MATLAB函数的方法。
二、实验内容(选作2题)
1、定义一个函数文件,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数文件。
建立函数文件hansu.m
function[a,b,c,d]=hanshu(x)
a=exp(x);
b=log(x);
c=sin(x);
d=cos(x);
%a指数函数值
%b对数函数值
%c正弦函数值
%d余弦函数值
主程序:
x=input('输入x=');
[a,b,c,d]=hanshu(x)
结果:
输入x=1
a=
2.7183
b=
0
c=
0.8415
d=
0.5403
2、一个物理系统可用下列方程组来表示:
从键盘输入m1、m2和
的值,求a1、a2、N1、N2的值。
其中g取’9.8,输入
时以角度为单位。
要求:
定义一个求解线性方程组AX=B的函数文件,然后在命令文件中调用该函数文件。
建立函数文件solve.m
functionx=solve(A,B)
x=A\B;
主程序;
m1=input('输入m1=')
m2=input('输入m2=')
theta1=input('输入theta=')
g=9.8;
theta=theta1*180/pi;
A=[m1*cos(theta),-m1,-sin(theta),0;
m1*sin(theta),0,cos(theta),0;
0,m2,-sin(theta),0;
0,0,-cos(theta),1];
B=[0;m1*g;0;m2*g];
x=solve(A,B);
a1=x
(1)
a2=x
(2)
N1=x(3)
N2=x(4)
结果:
输入m1=2
输入m2=2
输入theta=30
a1=
-6.8768
a2=
3.1365
N1=
-15.3084
N2=
33.5641
3、一个自然数是素数,且它的数字位置经过任意对换后仍为素数,则称是绝对素数。
例如13是绝对素数。
试求所有两位绝对素数。
建立函数文件mat.m
functionflag=mat(x)
flag=1;
fori=2:
sqrt(x)
ifrem(x,i)==0
flag=0;
break;
end
end
主程序:
fori=10:
99
j=10*rem(i,10)+fix(i/10);
ifmat(i)&mat(j)
disp(i)
end
end
结果:
11
13
17
31
37
71
73
79
97
4、设
,编写一个MATLAB函数文件fx.m,使得调用f(x)时,x可用矩阵代入,得出的f(x)为同阶矩阵。
建立函数文件fx.m
functionfx=fx(x)
fx=1./((x-2).^2+0.1)+1./((x-3)^4+0.01);
主程序:
x=input('输入矩阵:
')
fx=fx(x)
结果:
输入矩阵:
[1,2,3;1,2,3;1,2,3]
x=
123
123
123
fx=
0.927610.0370100.9091
0.927610.0370100.9091
0.927610.0370100.9091
5、已知
(1)当f(n)=n+10ln
时,求y的值。
建立函数文件fn.m
functionx=fn(n)
x=n+10*log(n^2+5);
主程序:
y=fn(40)/(fn(30)+fn(20))
结果:
y=
0.6390
(2)当
时,求y的值。
建立函数文件fn.m
functionx=fn(n)
x=0;
forn=1:
n
x=x+n*(n+1);
End
主程序:
y=fn(40)/(fn(30)+fn(20))
结果:
y=
1.7662
实验八,九MATLAB程序设计(循环、选择)
一、实验目的
1、掌握利用if语句实现选择结构的方法;
2、掌握利用switch语句实现多分支选择结构的方法;
3、掌握循环结构的程序书写方法。
二、实验内容
1、硅谷公司员工的工资计算方法如下:
(1)工作时数超过120小时者,超过部分加发15%;
(2)工作时数低于60小时者,扣发700元;
(3)其余按每小时84元计发。
编程按输入的工号和该号员工的工作时数,计算应发工资。
程序:
m=input('输入工号:
');
n=input('工作小时数:
');
ifn>=120
y=84*n+(n-120)*0.15
elseifn<60
y=84*n-700
elseifn>=60&n<120
y=84*n
end
结果:
输入工号:
0001
工作小时数:
50
y=
3500
2、用switch…case语句得出各月份的季节(如3,4,5月输出为春季)。
程序:
x=input('输入月份:
');
switchx
case1
disp([Num2str(x),'月是冬季'])
case2
disp([Num2str(x),'月是冬季'])
case3
disp([Num2str(x),'月是春季'])
case4
disp([Num2str(x),'月是春季'])
case5
disp([Num2str(x),'月是春季'])
case6
disp([Num2str(x),'月是夏季'])
case7
disp([Num2str(x),'月是夏季'])
case8
disp([Num2str(x),'月是夏季'])
case9
disp([Num2str(x),'月是秋季'])
case10
disp([Num2str(x),'月是秋季'])
case11
disp([Num2str(x),'月是秋季'])
case12
disp([Num2str(x),'月是冬季'])
End
结果:
输入月份:
1
1月是冬季
3、计算1+3+5+…+99的值,当和大于1000的时候终止计算,要求显示终止时候的求和结果以及最后一位计算的整数值。
程序:
sum=0;
fori=1:
2:
99
sum=sum+i;
if(sum>1000)break;
end
end
a=sum;
b=i;
disp(['求和结果为:
',num2str(a)])
disp(['最后一位计算的整数值为:
',num2str(b)])
结果:
求和结果为:
1024
最后一位计算的整数值为:
63
4、分别采用循环语句和sum语句实现
的计算。
循环实现:
y=0;
fori=0:
63
y=y+2^i;
i=i+1;
end
a=y
结果:
a=
1.8447e+019
sum求和实现:
i=[1:
63];
b=2.^i;
a=sum(b)
结果:
a=
1.8447e+019
5、编写一个函数文件,实现两个矩阵的乘积和点乘,并在命令文件中调用该函数。
建立函数文件文件cheng.m
function[x,y]=cheng(A,B)
x=A.*B;
y=A*B;
主程序:
A=input('输入矩阵A:
')
B=input('输入能与矩阵A相乘的矩阵B:
')
[x,y]=cheng(A,B)
结果:
输入矩阵A:
[2,3;4,9]
A=
23
49
输入能与矩阵A相乘的矩阵B:
[2,1;7,3]
B=
21
73
x=
43
2827
y=
2511
7131
三、实验要求
1、预习,写出自己设计的实验步骤;
2、按照实验室规范使用计算机;
3、做好实验记录(包括程序和结果)。
四、思考题
1、break语句和continue语句有什么区别?
答:
while循环、do-while循环和for循环中,可以用break语句跳出循环,用continue语句结束本次循环,而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。
continue语句只结束本次循环,而不是终止整个循环的执行。
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立.
continue语句和break语句的区别:
continue语句只结束本次循环,而不是终止整个循环的执行。
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
break语句可以用在循环语句和switch语句中。
在循环语句中用来结束内部循环;在switch语句中用来跳出switch语句。
循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关
2.函数文件和命令文件有何异同?
函数文件是另一种形式的M文件,每一个函数文件都定义一个函数,事实上,matlab提供的标准函数大部分是由函数文件定义的。
函数文件区别于命令文件之处在于命令文件的变量在文件执行完成后保留在工作空间中,而函数文件内定义的变量只在函数文件内起作用,文件执行完后即被清除。
1.函数文件一般都要带参数,都要有返回结果,而命令文件没有参数与返回结果
2.函数文件的变量是局部变量,运行期间有效,运行完毕就自动被清除,而命令文件的变量是全局变量,执行完毕后仍被保存在内存中
3.函数文件要定义函数名,且保存该函数文件的文件名必须是函数名.m。
M函数文件可以有多个因变量和多个自变量,当有多个因变量时用[]括起来。
3.写出书中82页第10题的程序运行结果。
(1)程序:
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
fork=a
forj=1:
4
ifrem(k(j),2)~=0
s=s+k(j);
end
end
end
S
结果:
s=
108
(2)程序:
函数文件sub.m:
functionfun=sub(z)
globalx
z=3*x;
x=x+z;
命令文件:
globalx
x=1:
2:
5;y=2:
2:
6;
sub(y);
x
y
结果:
x=
41220
y=
246
4、*和.*运算有什么区别?
答:
对矩阵进行运算时,*是整个矩阵之间相乘,而.*是维数相同的矩阵中,对应的元素相乘生成新的矩阵。
5.如何产生0~20均匀分布的随机整数?
答:
主要语法:
rand(a)在开区间(0,a)生成均匀分布的伪随机整数