MATLAB软件设计上机指南Word文档格式.docx
《MATLAB软件设计上机指南Word文档格式.docx》由会员分享,可在线阅读,更多相关《MATLAB软件设计上机指南Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
v命令文件包括两部分:
注释文件和程序文件
%RANKNumberoflinearlyindependentrowsorcolumns.
%K=RANK(X)isthenumberofsingularvaluesofX
%thatarelargerthanMAX(SIZE(X))*NORM(X)*EPS.
%K=RANK(X,tol)isthenumberofsingularvaluesofXthat
%arelargerthantol.
%Copyright(c)1984-94byTheMathWorks,Inc.
s=svd(x);
if(nargin==1)
tol=max(size(x))*max(s)*eps;
end
r=sum(s>
tol);
(2).matlab内置函数文件
matlab自定义的函数文件称内置函数文件
调用内置函数的方法:
使用函数名并给出相应的入口、出口参数即可。
例如:
sin.m函数——用typesin查不到。
调用格式:
y=sin(2*x)
实际应用中:
x=0:
2*pi/180:
2*pi;
y=sin(2*x)
plot(x,y)
函数m文件的格式:
function返回变量=函数名(输入变量)
注释说明语句段
程序语句段
特定规则:
1.函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:
function<
因变量>
=<
函数名>
(<
自变量>
)
2.m文件的文件名必须是<
.m。
3.程序中的变量均为局部变量,不保存在工作空间中。
其变量只在函数运行期间有效
二、微分方程
一般微分方程式描述系统内部变量的变化率如何受系统内部变量和外部激励,如输入,的影响。
当常微分方程式能够解析求解时,可用MATLAB的符号工具箱中的功能找到精确解。
在本书的后面将介绍该工具箱的一些特点。
在微分方程难以获得解析解的情况下,可以方便地在数值上求解。
为了说明起见,考虑描述振荡器的经典的范得波(VarderPol)微分方程。
与所有的数值求解微分方程组的方法一样,高阶微分方程式必须等价地变换成一阶微分方程组。
对于上述微分方程,通过重新定义两个新的变量,来实现这种变换。
令y1=x且y2=dy/dx
则dy1/dt=y2
根据这个微分方程组,可用MATLAB的函数ode23和ode45求出系统随时间变化的运动情况。
调用这些函数时,需要编写一个函数M文件,给定当前时间及y1和y2的当前值,该函数返回上述导数值。
MATLAB中,这些导数由一个列向量给出。
在本例中,这个列向量为yprime。
同样,y1和y2合并写成列向量y。
所得函数M文件是:
functionyprime=vdpol(t,y);
%VDPOL(t,y)returnsderivativesoftheVanderPolequation:
%
%x‘‘-mu*(1-x^2)*x‘+x=0(‘=d/dx,‘‘=d^2/dx^2)
%lety
(1)=xandy
(2)=x‘
%theny
(1)‘=y
(2)
%y
(2)‘=MU*(1-y
(1)^2)*y
(2)-y
(1)
globalMU%choose0<
MU<
10inCommandworkspace
yprime=[y
(2)MU*(1-y
(1)^2)*y
(2)-y
(1)];
%outputmustbeacolumn
给定这个完整地描述微分方程的函数,计算结果如下:
>
globalMU%defineMUasaglobalvariableintheCommandWorkspace
MU=2;
%setglobalparametertodesiredvalue
[t,y]=ode23(‘vdpol‘,0,30,[1;
0]);
%to=0,tf=30,yo=[1;
0]
y1=y(:
1);
%firstcolumnisy
(1)versustimepointsint
y2=y(:
2);
%secondcolumnisy
(2)
plot(t,y1,t,y2,‘--‘)
xlabel(‘Time,Second‘),ylabel(‘Y
(1)andY
(2)‘)
title(‘VanderPolSolutionformu=2‘)
当mu=2时的范得波方程的运动曲线
第二章流程控制与绘图
一、流程控制
1.For循环
For循环允许一组命令以固定的和预定的次数重复。
For循环的一般形式是:
forx=array
{commands}
end
在for和end语句之间的{commands}按数组中的每一列执行一次。
在每一次迭代中,x被指定为数组的下一列,即在第n次循环中,x=array(:
n)。
例如,
»
forn=1:
10
x(n)=sin(n*pi/10);
end
x
x=
Columns1through7
0.30900.58780.80900.95111.00000.95110.8090
Columns8through10
0.58780.30900.0000
换句话,第一语句是说:
对n等于1到10,求所有语句的值,直至下一个end语句。
第一次通过For循环n=1,第二次,n=2,如此继续,直至n=10。
在n=10以后,For循环结束,然后求end语句后面的任何命令值,在这种情况下显示所计算的x的元素。
For循环的其它重要方面是:
1.For循环不能用For循环内重新赋值循环变量n来终止。
n=10;
2.语句1:
10是一个标准的MATLAB数组创建语句。
在For循环内接受任何有效的MATLAB数组。
»
data=[39456;
716-15]
data=
39456
716-15
forn=data
x=n
(1)-n
(2)
end
x=
-4
-7
46
1
3.For循环可按需要嵌套。
forn=1:
5
form=5:
-1:
1
A(n,m)=n^2+m^2;
end
disp(n)
2
3
4
5
A
A=
25101726
58132029
1013182534
1720253241
2629344150
4.当有一个等效的数组方法来解给定的问题时,应避免用For循环。
例如,上面的第一个例子可被重写为
n=1:
10;
x=sin(n*pi/10)
两种方法得出同样的结果,而后者执行更快,更直观,要求较少的输入。
5.为了得到最大的速度,在For循环(While循环)被执行之前,应预先分配数组。
例如,前面所考虑的第一种情况,在For循环内每执行一次命令,变量x的大小增加1。
迫使MATLAB每通过一次循环要花费时间对x分配更多的内存。
为了消去这个步骤,For循环的例子应重写为
x=zeros(1,10);
%preallocatedmemoryforx
x(n)=sin(n*pi/10);
现在,只有x(n)的值需要改变。
2.While循环
与For循环以固定次数求一组命令的值相反,While循环以不定的次数求一组语句的值。
While循环的一般形式是:
whileexpression
{commands}
只要在表达式里的所有元素为真,就执行while和end语句之间的{commands}。
通常,表达式的求值给出一个标量值,但数组值也同样有效。
在数组情况下,所得到数组的所有元素必须都为真。
考虑下列例子:
num=0;
EPS=1;
while(1+EPS)>
EPS=EPS/2;
num=num+1;
num
num=
53
EPS=2*EPS
EPS=
2.2204e-016
这个例子表明了计算特殊MATLAB值eps的一种方法,它是一个可加到1,而使结果以有限精度大于1的最小数值。
这里我们用大写EPS,因此MATLAB的eps的值不会被覆盖掉。
在这个例子里,EPS以1开始。
只要(1+EPS)>
1为真(非零),就一直求While循环内的命令值。
由于EPS不断地被2除,EPS逐渐变小以致于EPS+1不大于1。
(记住,发生这种情况是因为计算机使用固定数的数值来表示数。
MATLAB用16位,因此,我们只能期望EPS接近10-16。
)在这一点上,(1+EPS)>
1是假(零),于是While循环结束。
最后,EPS与2相乘,因为最后除2使EPS太小。
3.IF-ELSE-END结构
很多情况下,命令的序列必须根据关系的检验有条件地执行。
在编程语言里,这种逻辑由某种If-E