MATLAB入门教程1简单举例.docx

上传人:b****8 文档编号:10518581 上传时间:2023-02-17 格式:DOCX 页数:21 大小:45.52KB
下载 相关 举报
MATLAB入门教程1简单举例.docx_第1页
第1页 / 共21页
MATLAB入门教程1简单举例.docx_第2页
第2页 / 共21页
MATLAB入门教程1简单举例.docx_第3页
第3页 / 共21页
MATLAB入门教程1简单举例.docx_第4页
第4页 / 共21页
MATLAB入门教程1简单举例.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

MATLAB入门教程1简单举例.docx

《MATLAB入门教程1简单举例.docx》由会员分享,可在线阅读,更多相关《MATLAB入门教程1简单举例.docx(21页珍藏版)》请在冰豆网上搜索。

MATLAB入门教程1简单举例.docx

MATLAB入门教程1简单举例

MATLAB特色举例

考虑两个矩阵A和B的乘积问题,在C语言中要实现两个矩阵的乘积并不仅仅是一组双重循环的问题。

双重循环当然是矩阵乘积所必需的,除此之外要考虑的问题很多。

例如:

A和B有一个是复数矩阵怎么考虑;其中一个是复数矩阵时怎么考虑;全部是实系数矩阵时又怎么管理;这样就要在一个程序中有4个分支,分别考虑这4种情况。

然后还得判断这两个矩阵是否可乘。

而考虑两个矩阵是否可乘也并不仅仅是判断A的列数是否等于B的行数这么简单。

其中一个若为标量,则它们可以无条件地相乘。

其中有标量时又得考虑实数与复数的问题等。

所以说,没有几十分钟的时间,用C语言并不可能编写出考虑各种情况的子程序。

有了MATLAB这样的工具,A和B矩阵的乘积用A*B这样简单的算式就能表示了。

〖例1-1〗矩阵生成与运算。

考虑金庸作品中经常提及的一个“数学问题”,该问题用半数学语言描述就是:

如何生成一个3x3矩阵,并将自然数1,2,...,9分别置成这9个矩阵元素,才能使得每一行、每一列、且主、反对角线上元素相加都等于一个相同的数。

 这样的矩阵称为“魔方矩阵”。

用MATLAB的magic()函数,我们可以由下面的命令立即生成这样的矩阵:

 >> A=magic(3)

 A=

   8  1  6

   3  5  7

   4  9  2

还可以由B=magic(10)一次生成10x10的魔方矩阵。

如果想求出矩阵的行列式和特征值,可以分别由det(B)与eig(B)立即得出结果,而同样的工作在C下并不是很简单就可以得出的,算法选择不好,还可能得出错误的结果。

〖例1-2〗考虑一个二元函数

如何用三维图形的方式表现出这个曲面?

 用C这类语言,绘制图形是一个难点,且从一个机器移植程序到另一个机器,大部分调试程序时间都花在这上。

但使用MATLAB这类高级语言,完成这样的工作就是几个直观语句的事。

且得出的图形美观准确、可以将语句毫不变化地移植到另外的机器上,得出完全一致的结果,如下所示。

 >>[x,y]=meshgrid(-3:

1/8:

3);

   z=3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5)...

     .*exp(-x.^2-y.^2)-1/3*exp(-(x+1).^2-y.^2);

   surf(x,y,z),shadinginterp;colorbar

图!

 

〖例1-3〗微分方程的数值解法是在科学与工程计算中经常遇到的问题。

假设著名的Lorenz模型的状态方程表示为:

若令

且初值为

,ε为一个小常数,假设

则我们可以由下面的几个语句就可以描述微分方程:

functionxdot=lorenzeq(t,x)

xdot=[-8/3*x

(1)+x

(2)*x(3);

     -10*x

(2)+10*x(3);

     -x

(1)*x

(2)+28*x

(2)-x(3)];

这样下面几个语句就能求解该微分方程,绘制出时间曲线与相空间曲线,如下所示。

>>t_final=100;x0=[0;0;1e-10];

  [t,x]=ode45('lorenzeq',[0,t_final],x0);

  plot(t,x),

  figure;plot3(x(:

1),x(:

2),x(:

3));axis([1040-2020-2020]);

图!

 

〖例1-5〗(注,这里的编号采用作者书中的序号)设有解析函数

,利用MATLAB的符号运算工具箱可以对该函数进行解析推导,得出诸如高阶导数、积分、Taylor幂级数展开等。

>>symsx;f='x^2*(sin(x))^2';

diff(f);f1=simple(ans)

f1=

  x-x*cos(2*x)+x^2*sin(2*x)

>>diff(f,x,2);f2=simple(ans)

f2=

  1-cos(2*x)+4*x*sin(2*x)+2*x^2*cos(2*x)

>>diff(f,x,3);f3=simple(ans)

f3=

  6*sin(2*x)+12*x*cos(2*x)-4*x^2*sin(2*x)

>>diff(f,x,4);f4=simple(ans)

f4=

  24*cos(2*x)-32*x*sin(2*x)-8*x^2*cos(2*x)

>>int(f4,x)

ans=

 6*sin(2*x)+12*x*cos(2*x)-4*x^2*sin(2*x)

>>taylor(x^2*(sin(x))^2,15,x)

ans=

 x^4-1/3*x^6+2/45*x^8-1/315*x^10+2/14175*x^12-2/467775*x^14

〖例1-6〗MATLAB语言可以编写程序,容易地实现图形用户界面。

例如作者编写的矩阵处理matx_proc.m界面如下。

[本程序可以从作者介绍主页下载]

MATLAB语言的赋值语句有两种:

∙变量名=运算表达式

∙[返回变量列表]=函数名(输入变量列表)

 MATLAB支持变量和常量,其中pi为圆周率π,更重要的,MATLAB支持IEEE标准的运算符号,如Inf表示无穷大,NaN(NotaNumber)为0/0,0*Inf或Inf/Inf等运算结果。

MATLAB变量名应该由字母引导,后面可以跟数字、字母或下划线等符号。

MATLAB是区分变量名字母大小写的。

(1)矩阵

 MATLAB最基本的数据结构是复数矩阵。

输入一个复数矩阵是很简单的事。

例如可以给出下面的语句:

 >>B=[1+9i,2+8i,3+7j;4+6j5+5i,6+4i;7+3i,8+2j1i]

其中>>为MATLAB的提示符。

矩阵各行元素由分号分隔,而同行不同元素由逗号或空格分隔。

给出了上面的命令,则可以给出下面的结果。

B=

  1.0000+9.0000i2.0000+8.0000i3.0000+7.0000i

  4.0000+6.0000i5.0000+5.0000i6.0000+4.0000i

  7.0000+3.0000i8.0000+2.0000i     0+1.0000i

其中,元素1+9i表示复数项。

有这样的表述方法,实矩阵、向量或标量均可以更容易地输入了。

如果赋值表达式末尾有分号,则其结构将不显示,否则将显示出全部结果。

 MATLAB和其他语言不同,它无需事先声明矩阵的维数。

下面的语句可以建立一个更大的矩阵

>> B(2,5)=1

B=

  1.0000+9.0000i2.0000+8.0000i3.0000+7.0000i  0       0

  4.0000+6.0000i5.0000+5.0000i6.0000+4.0000i  0  1.0000  

  7.0000+3.0000i8.0000+2.0000i     0+1.0000i  0       0

 冒号表达式是MATLAB里最具特色的表示方法。

其调用格式为a=s1:

s2:

s3;这一语句可以生成一个行向量,其中s1为向量的起始值,s2为步距,而s3为向量的终止值。

例如S=0:

.1:

2*pi;将产生一个起始于0,步距为0.1,而终止于6.2的向量(pi为MATLAB保留常量π),而不是终止于2π。

如果写成S=0:

-0.1:

2*pi;则不出现错误,而返回一个空向量。

 冒号表达式可以用来提取矩阵元素,例如B(:

1)将提取B矩阵的第1列而B(1:

2,1:

2:

3)将提取B的前2行与1,3,5列组成的子矩阵。

在矩阵提取时还可以采用end这样的算符。

如B(2:

end,:

)将提取B矩阵的后2列构成的子矩阵。

(2)多维数组

 多维数组是MATLAB在其5.0版本开始提供的。

假设有2个3x3矩阵A1,A23,则可以由下面的命令建立起一个3x3x2的数组:

A=cat(3,A1,A2)。

试验A1=cat(2,A1,A2)和A2=cat(1,A1A2)将得到什么结果。

 对矩阵或多维数组A可以使用size(A)来测其大小,也可以使用reshape()函数重新按列排列。

对向量来说,还可以用length(A)来测其长度。

 不论原数组A是多少维的,A(:

)将返回列向量。

(3)字符串与字符串矩阵

 MATLAB的字符串是由单引号括起来的。

如可以使用下面的命令赋值

 >>strA='Thisisastring.'

 多个字符串可以用str2mat()函数构造出字符串矩阵。

如B=str2mat(strA,'ksasaj','aa');字符串变量可以由下表中的命令进行操作:

命令

意义

命令

意义

strcmp(A,B)

比较A和B字符串是否相同。

findstr(A,B)

测试A是否为B的子字符串,或反过来

strrep(A,s1,s2)

在A中用s2替换s1

length(A)

字符串A的长度

deblank(A)

删除A字符串尾部的空格

double(A)

字符串转换双精度数据

(4)单元数据结构

 用类似矩阵的记号将给复杂的数据结构纳入一个变量之下。

和矩阵中的圆括号表示下标类似,单元数组由大括号表示下标。

>>B={1,'AlanShearer',180,[100,80,75;77,60,92;67,28,90;100,89,78]}

B=

  [1]'AlanShearer'[180][4x3double]

访问单元数组应该由大括号进行,如第4单元中的元素可以由下面的语句得出

>>B{4}

ans=

 100  80   75

 77   60   92

 67   28   90

 100  89   78

(5)结构体

 MATLAB的结构体有点象C语言的结构体数据结构。

每个成员变量用点号表示,如A.p表示A变量的p成员变量。

获得该成员比C更直观,仍用A.p访问,而不用A->p。

用下面的语句可以建立一个小型的数据库。

>>student_rec.number=1;

student_rec.name='AlanShearer';

student_rec.height=180;

student_rec.test=[100,80,75;77,60,92;67,28,90;100,89,78];

>>student_rec

student_rec=

 number:

1

 name:

'AlanShearer'

 height:

180

 test:

[4x3double]

其中test成员为单元型数据。

删除成员变量可以由rmfield()函数进行,添加成员变量可以直接由赋值语句即可。

另外数据读取还可以由setfield和getfield函数完成。

(6)类与对象

 类与对象是MATLAB5.*开始引入的数据结构。

在MATLAB手册中定义了一个很好的类--多项式类。

该例子值得细读,去体会类和对象的定义,重载函数编写等信息。

事实上,在实际工具箱设计中,用到了很多的类,例如在控制系统工具箱中定义了LTI(线性时不变系统)类,并在此基础上定义了其子类:

传递函数类TF,状态方程类SS,零极点类ZPK和频率响应类FR。

举例:

我们将通过一个例子来介绍类的构造。

在MATLAB语言使用手册中给出了一个很有代表性的例子:

多项式类的建立问题。

假设我们想为多项式建立一个单独的类,重新定义加、减、乘及乘方等运算,并定义其显示方式。

那么建立一个类至少应该执行下面的步骤:

(这个例子更详细的情况请参考MATLAB手册)

∙首先应该选定一个恰当的名字,例如这里的多项式类可选择为polynom。

∙以这个名字建立一个子目录,目录的名字前加@。

对本例来说,即应该在当前的工作目录下建立@polynom子目录,而这个目录无需在MATLAB路径下再指定。

∙编写一个引导函数,函数名应该和类同名。

定义类的使用方法:

functionp=polynom(a)

ifnargin==0

p.c=[];p=class(p,'polynom');

elseifisa(a,'polynom'),p=a;

else,

p.c=a(:

).';p=class(p,'polynom');

end

可以看出,本函数分三种情况加以考虑:

①如果不给输入变量,则建立一个空的多项式;

②如果输入变量a已经为多项式类,则将它直接传送给输出变量p;

③如果a为向量,则将此向量变换成行向量,再构造成一个多项式对象。

∙如果想正确地显示新定义的类,则必需首先定义display()函数,并对新定义的类重新定义其基本运算。

对多项式来说,我们可以如下定义有关的函数:

∙要改变显示函数的定义,则需在此目录下重新建立一个新函数display()。

这种重新定义函数的方法又称为函数的重载。

显示函数可以如下地重载定义。

functiondisplay(p)

disp('');disp([inputname

(1),'='])

disp('');disp([''char(p)]);disp('');

注意,这里应该定义的是display()而不是disp()。

∙从上面的定义可见,显示函数要求重载定义char()函数,用于把多项式转换成可显示的字符串。

该函数的定义为

functions=char(p)

ifall(p.c==0),s='0';

else

d=length(p.c)-1;s=[];

fora=p.c;

ifa~=0;

if~isempty(s)

ifa>0,s=[s,'+'];

else,s=[s,'-'];a=-a;end

end

ifa~=1|d==0,s=[s,num2str(a)];

ifd>0,s=[s,'*'];end

end

ifd>=2,s=[s,'x^',int2str(d)];

elseifd==1,s=[s'x'];end

end

d=d-1;

end,end

∙仔细研究此函数,可以发现,该函数能自动地按照多项式显示的格式构造字符串。

比如,多项式各项用加减号连接,系数与算子之间用乘号连接,而算子的指数由^表示。

再配以显示函数,则可以将此多项式以字符串的形式显示出来。

∙双精度处理:

双精度转换函数的重载定义是很简单的。

functionc=double(p)

c=p.c;

∙加运算:

两个多项式相加,只需将其对应项系数相加即可。

这样,加法运算的重载定义

可由下面的函数实现。

注意,这里要对plus()函数进行重载定义。

functionp=plus(a,b)

a=polynom(a);b=polynom(b);

k=length(b.c)-length(a.c);

p=polynom([zeros(1,k)a.c]+[zeros(1,-k)b.c]);

同理,还可以重载定义多项式的减法运算:

functionp=minus(a,b)

a=polynom(a);b=polynom(b);

k=length(b.c)-length(a.c);

p=polynom([zeros(1,k)a.c]-[zeros(1,-k)b.c]);

∙乘法运算:

多项式的乘法实际上可以表示为系数向量的卷积,可以由conv()函数直接获得。

故可以如下重载定义多项式的乘法运算。

functionp=mtimes(a,b)

a=polynom(a);b=polynom(b);p=polynom(conv(a.c,b.c));

∙乘方运算:

多项式的乘方运算只限于正整数乘方的运算,其n次方相当于将该多项式自乘n次。

若n=0,则结果为1。

这样我们就可以重载定义多项式的乘方运算为:

functionp=mpower(a,n)

ifn>=0,n=floor(n);a=polynom(a);p=1;

ifn>=1,

fori=1:

n,p=p*a;end

end

else,error('Powershouldbeanon-negativeinteger.')

end

∙多项式求值问题:

可以对多项式求值函数polyval()进行重载定义。

functiony=polyval(a,x)

a=polynom(a);y=polyval(a.c,x);

定义了此类之后,我们就可以方便地进行多项式处理了。

例如我们可以建立两个多项式对象P(s)=x^3+4x^2-7和Q(s)=5x^4+3x^3-1.5x^2+7x+8其相应的~MATLAB语句为

>>P=polynom([1,4,0,-7]),Q=polynom([5,3,-1.5,7,8])

P=

x^3+4*x^2-7

Q=

5*x^4+3*x^3-1.5*x^2+7*x+8

然后调用下面函数就可以得出相应的计算结果

>>P+Q

ans=

5*x^4+4*x^3+2.5*x^2+7*x+1

>>P-Q

ans=

-5*x^4-2*x^3+5.5*x^2-7*x-15

>>P*Q

ans=

5*x^7+23*x^6+10.5*x^5-34*x^4+15*x^3+42.5*x^2-49*x-56

>>X=P^3

X=

x^9+12*x^8+48*x^7+43*x^6-168*x^5-336*x^4+147*x^3+588*x^2-343

>>y=polyval(X,[123456])

y=

-84913175616177********023243986977

由于前面的重载定义,下面的表达式也能得出期望的结果

>>P+[123]

ans=

x^3+5*x^2+2*x-4

∙使用methods()函数可以列出一个新的类已经定义的方法函数名。

>>methods('polynom')

Methodsforclasspolynom:

chardoublempowerpluspolyval

displayminusmtimespolynom

变量的运算

(1)MATLAB变量的代数运算

 如果给定两个矩阵A和B,则我们可以用A+B,A-B,A*B可以立即得出其加、减和乘运算的结果。

若这两个矩阵数学上不可以这样运算,则将得出错误信息,并终止正在运行的程序。

 在MATLAB下,如果A和B中有一个是标量,则可以无条件地进行这样的运算。

MATLAB不介意这些变量是纯实数还是含有虚部的复数。

 矩阵的除法实际上就是线性方程的求解,如Ax=B这一线性方程的解即为x=inv(A)*B,或更简单地x=A\B。

这又称为矩阵的左除,而x=B/A称为矩阵的右除。

 方阵的乘方可以由^算符直接得出,如A^n。

用MATLKAB这样的语言,你可以轻易地算出A^0.1,亦即A矩阵开10次方得出的主根。

 矩阵的点运算也是相当重要的。

所谓点运算即两个矩阵相应元素的元素,如A.*B得出的是A和B对应元素的积,故一般情况下A*B不等于A.*B。

矩阵的点乘又称为其Hadamard积。

点运算的概念又可以容易地用到点乘方上,例如A.^2,A.^A等都是可以接受的运算式子。

 Kronecker乘积是MATLAB在矩阵运算中的另一个有意义的问题,用kron(A,B)立即可以得出两个矩阵的Kronecker乘积。

(2)逻辑运算

 MATLAB并没有单独定义逻辑变量。

在MATLAB中,数值只有0和“非0”的区分。

非0往往被认为是逻辑真,或逻辑1。

除了单独两个数值的逻辑运算外,还支持矩阵的逻辑运算,如A&B,A|B,和~A分别表示逻辑与、或、非的运算。

例如,下面的A和B矩阵与运算将得出如下结果

 >>A=[0234;1350];B=[1053;1505];A&B

 ans=

      0  0  1  1

      1  1  0  0

(3)关系表达式与表达式函数

 MATLAB的大于、小于和等于等关系分别由>、<和==表示。

判定方法不完全等同于C这类只能处理单个标量的语言。

MATLAB关系表达式返回的是整个矩阵。

例如,比较两个矩阵A和B是否相等,则可以给出如下命令,并得出相应的结果

 >>A=[0234;1350];B=[1053;1505];A==B

 ans=

      0  0  0  0

      1  0  0  0

确实使得A和B对应元素相等的位将返回1,否则返回0。

MATLAB还可以用>=和<=这样的符号来比较矩阵对应元素的大小。

 另外,MATLAB还提供了all()和any()两个函数来对矩阵参数作逻辑判定。

all()函数在其中变元全部非0时返回1,而any()函数在变元有非零元素返回1。

find()函数将返回逻辑关系全部满足时的矩阵下标值,这个函数在编程中是相当常用。

还可以使用isnan()类函数来判定矩阵中是否含有NaN型数据。

如果有则返回这样参数的下标。

此类函数还有isfinite(),isclass(),ishandle()等。

(4)其他运算

 MATLAB还支持其他运算,如取整、求余数等。

可以使用rond)_,fix(),rem()等来实现。

 

MATLAB的语句流程与控制

 作为一种常用的编程语言,MATLAB支持各种流程控制结构,如循环结构、条件转移结构、客观结构等另外MATLAB还支持一种新的结构---试探结构。

循环语句有两种结构:

for...end结构和while...e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 图表模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1