智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2585|回复: 2
打印 上一主题 下一主题

MATLAB常用命令举例

[复制链接]

1

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
威望
239
贡献
20
兑换币
0
注册时间
2010-2-5
在线时间
10 小时
跳转到指定楼层
1#
发表于 2010-3-4 20:48:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设一个一元方程为
如何对其求导数?
>>syms x; 指出以x为变量
>>f=’x^2*(sin(x))^2’; 列出方程式
>>diff(f); 算出一阶导数
>>simple(ans); 化简结果
就可以得到答案:x-x*cos(2*x)+x^2*sin(2*x)
如何求出高阶导数呢?
>>diff(f,x,2); 或者diff(f,2)
>>simple(ans);
就可以求出高(2)阶导数:(2*cos(x)^2-2*sin(x)^2)*x^2+8*x*sin(x)*cos(x)+2*sin(x)^2
如何求出积分呢?
>>int(f,x);
就可求得一阶积分:x^2*(-1/2*cos(x)*sin(x)+1/2*x)-1/2*x*cos(x)^2+1/4*cos(x)*sin(x)+1/4*x-1/3*x^3
如何求泰勒展式呢?
>>taylor(f,15,x); 一直展开到15阶。
就可以得到函数f的泰勒展式: x^4-1/3*x^6+2/45*x^8-1/315*x^10+2/14175*x^12-2/467775*x^14
MATLAB 的语句流程与控制
作为一种常用的编程语言,MATLAB 支持各种流程控制结构,如循环结构、条件转移结构、客观结构等另外 MATLAB 还支持一种新的结构 --- 试探结构。 循环语句有两种结构: for ... end 结构和 while ... end 结构。 这两种语句结构不完全相同,各有各的特色。
for ... end 语句通常的调用格式为: 例如:想由 MATLAB 求出 1+2+...+100 的值,可以作下列的循环:
for 循环变量=s1:s3:s2 >> mysum=0; for i=1:1:100,mysum=mysum+i; end; mysum
循环体语句组
end
同样的问题在 while 循环结构下可以表示为
mysum = 0; i=1; while (i<=100), mysum=mysum+i; i=i+1; end
条件转移语句:和 C 语言相象
if 条件式1
条件块语句组1
elseif 条件式2
条件块语句组2
...
else
条件块语句组n+1
end
开关结构:
switch 开关表达式
case 表达式1
语句段1
case {表达式2,表达式3,..., 表达式m}
语句段2
...
otherwise
语句段n
end
试探结构:MATLAB 从 5.2 版本开始提供了一种新的试探式语句结构,其一般的形式为:
try
语句段1
catch
语句段2
end
本语句结构首先试探性地执行语句段 1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的 lasterr 变量,并放弃这段语句,转而执行语句段 2 中的语句。这种新的语句结构是 C 等语言中所没有的。

M-function的编写:
MATLAB 的 M 函数是由 function 语句引导的,其基本格式如下:
function [返回变量列表] = 函数名 (输入变量列表)
注释说明语句段, 由 % 引导
输入、返回变量格式的检测
函数体语句
这里输入和返回变量的实际个数分别由 nargin 和 nargout 两个 MATLAB 保留变量来给出,只要进入该函数,MATLAB 就将自动生成这两个变量,不论您是否直接使用这两个变量。返回变量如果多于 1 个,则应该用方括号将它们括起来,否则可以省去方括号。输入变量和返回变量之间用逗号来分割。注释语句段的每行语句都应该由百分号 % 引导,百分号后面的内容不执行,只起注释作用。用户采用 help 命令则可以显示出来注释语句段的内容。此外,正规的变量个数检测也是必要的。如果输入或返回变量格式不正确,则应该给出相应的提示。我们将通过下面的例子来演示函数编程的格式与方法。
例子:
假设我们想生成一个 nxm 阶的 Hilbert 矩阵, 它的第 i 行第 j 列的元素值为 1/(i+j-1)。我们想在编写的函数中实现下面几点:
·  如果只给出一个输入参数,则会自动生成一个方阵,即令 m=n
·  在函数中给出合适的帮助信息,包括基本功能、调用方式和参数说明
·  检测输入和返回变量的个数,如果有错误则给出错误信息
如果调用时不要求返回变量,则将显示结果矩阵。其实在编写程序时养成一个好的习惯,无论对程序设计者还是对程序的维护者、使用者都是大有裨益的。
采用 MATLAB 函数编写格式和上述要求,我们可以编写出一个函数
function A=myhilb(n, m)
%MYHILB a demonstrative M-function.
% A=MYHILB(N, M) generates an N by M Hilbert matrix A.
% A=MYHILB(N) generates an N by N square Hilbert matrix.
% MYHILB(N,M) displays ONLY the Hilbert matrix, but do not return any
% matrix back to the calling function.
%
%See also: HILB.

% Designed by Professor Dingyu XUE, Northeastern University, PRC
% 5 April, 1995, Last modified by DYX at 21 March, 2000
if nargout>1, error('Too many output arguments.'); end
if nargin==1, m=n;
elseif nargin==0 | nargin>2
error('Wrong number of iutput arguments.');
end
A1=zeros(n,m);
for i=1: n
for j=1:m
A1(i,j)=1/(i+j-1);
end, end
if nargout==1, A=A1; elseif nargout==0, disp(A1); end 经测试,完全正确的程序。

如何输入复数矩阵?
两种方法 -,直接输入 a+bi ;=,先生成 实数矩阵 A B,然后生成 C=A+Bi
如何生成符号矩阵?
1.用命令sym定义矩阵:
这时的函数sym实际是在定义一个符号表达式,这时的符号矩阵中的元素可以是任何的符号或者是表达式,而且长度没有限制,只是将方括号置于用于创建符号表达式的单引号中。如下例:
>> sym_matrix = sym('[a b c;Jack,Help Me!,NO WAY!]')
sym_matrix =[a b c]
[Jack Help Me! NO WAY!]
2.用命令syms定义矩阵
先定义矩阵中的每一个元素为一个符号变量,而后像普通矩阵一样输入符号矩阵。
>> syms a b c ;
>> M1 = sym('Classical');
>> M2 = sym(' Jazz');
>> M3 = sym('Blues')
>> syms_matrix = [a b c; M1, M2, M3;int2str([2 3 5])]
syms_matrix =[ a b c]
[Classical Jazz Blues]
[ 2 3 5]

如何创建多维数组?
>> A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A1-A2;
>> A4=cat(3,A1,A2,A3) 利用cat函数来生成。
A4(:,:,1) =
1 2 3
4 5 6
7 8 9
A4(:,:,2) =
1 4 7
2 5 8
3 6 9
A4(:,:,3) =
0 -2 -4
2 0 -2
4 2 0
或用另一种原始方式可以定义:
>> A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A1-A2;
>> A5(:,:,1)=A1, A5(:,:,2)=A2, A5(:,:,3)=A3 结果跟上面的相同。

几种特殊的矩阵的生成:
全零矩阵 Zeros([n,m…]) 单位矩阵 Eye([n,m…]) 全一矩阵 Ones([n,m…])
均匀分布随机矩阵: rand 产生一个介于[0,1]的随机数。
产生一个在区间[10, 20]内均匀分布的4阶随机矩阵
>> a=10;b=20;
>> x=a+(b-a)*rand(4) %rand本身产生的数大于零而小于一。
x =
19.2181 19.3547 10.5789 11.3889
17.3821 19.1690 13.5287 12.0277
11.7627 14.1027 18.1317 11.9872
14.0571 18.9365 10.0986 16.0379
正态分布随机矩阵:randn(n,m)
产生均值为0.6,方差为0.1的4阶矩阵
>> mu=0.6; sigma=0.1;
>> x=mu+sqrt(sigma)*randn(4)
x = 0.8311 0.7799 0.1335 1.0565
0.7827 0.5192 0.5260 0.4890
0.6127 0.4806 0.6375 0.7971
0.8141 0.5064 0.6996 0.8527
产生随机排列:p = randperm(n) %产生1~n之间整数的随机排列
如何产生线性等分向量:
y = linspace(a,b) %在(a, b)上产生100个线性等分点
y = linspace(a,b,n) %在(a, b)上产生n个线性等分点
计算矩阵中元素个数: n = numel(a) %返回矩阵A的元素的个数
产生以输入元素为对角线元素的矩阵:
out = blkdiag(a,b,c,d,…) %产生以a,b,c,d,…为对角线元素的矩阵

几种比较特殊的矩阵:
多项式系数的友矩阵:
例1-14 求多项式 的友矩阵和根
>> u=[1 0 -7 6];
>> A=compan(u) %求多项式的友矩阵
A =
0 7 -6
1 0 0
0 1 0
>> eig(A) %A的特征值就是多项式的根
ans =
-3.0000 2.0000 1.0000 。
hadamard矩阵
>> h=hadamard(4)
h = 1 1 1 1
1 -1 1 -1
1 1 -1 -1
1 -1 -1 1
Hankel方阵
H = hankel(c) %第1列元素为c,反三角以下元素为0。
H = hankel(c,r) %第1列元素为c,最后一行元素为r,如果c的最后一个元素与r的第一个元素不同,交叉位置元素取为c的最后一个元素。
>> c=1:3,r=7:10
>> h=hankel(c,r)
h =
1 2 3 8
2 3 8 9
3 8 9 10
Hilbert矩阵
H = hilb(n) %返回n阶Hilbert矩阵,其元素为H(i,j)=1/(i+j-1)。
>> format rat %以有理形式输出
>> H=hilb(3)
H =
1 1/2 1/3
1/2 1/3 1/4
1/3 1/4 1/5
逆Hilbert矩阵
H = invhilb(n) %产生n阶逆Hilbert矩阵
Magic(魔方)矩阵
Pascal矩阵
A = pascal(n) %产生n阶Pascal矩阵,它是对称、正定矩阵,它的元素由Pascal三角组成,它的逆矩阵的所有元素都是整数。
A = pascal(n,1) %返回由下三角的Cholesky系数组成的Pascal矩阵
A = pascal(n,2) %返回Pascal(n,1)的转置和交换的形式
>> A=pascal(4)
A =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
>> A=pascal(3,1)
A =
1 0 0
1 -1 0
1 -2 1
>> A=pascal(3,2)
A =
1 1 1
-2 -1 0
1 0 0
托普利兹矩阵
T = toeplitz(c,r) %生成一个非对称的托普利兹矩阵,将c作为第1列,将r作为第1 行,其余元素与左上角相邻元素相等。
T = toeplitz(r) %用向量r生成一个对称的托普利兹矩阵
>> c=[1 2 3 4 5];
>> r=[1.5 2.5 3.5 4.5 5.5];
>> T=toeplitz(c,r)
T =
1 5/2 7/2 9/2 11/2
2 1 5/2 7/2 9/2
3 2 1 5/2 7/2
4 3 2 1 5/2
5 4 3 2 1
Wilkinson特征值测试阵
W = wilkinson(n) %返回n阶Wilkinson特征值测试阵
例1-21
>> W=wilkinson(4)
W =
3/2 1 0 0
1 1/2 1 0
0 1 1/2 1
0 0 1 3/2

关于向量的点乘和叉乘:
向量点积
C = dot(A,B) %若A、B为向量,则返回向量A与B的点积,A与B长度相同;若为矩阵,则A与B有相同的维数。
C = dot(A,B,dim) %在dim维数中给出A与B的点积
  >>X=[-1 0 2];
>>Y=[-2 -1 1];
>>Z=dot(X, Y)
则显示:Z =
4
相当于向量的点乘(。*)所以还可用另一种算法:
sum(X.*Y)
ans= 4
向量叉乘
在数学上,两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。C = cross(A,B) %若A、B为向量,则返回A与B的叉乘,即C=A×B,A、B必须是3个元素的向量;若A、B为矩阵,则返回一个3×n矩阵,其中的列是A与B对应列的叉积,A、B都是3×n矩阵。
C = cross(A,B,dim) %在dim维数中给出向量A与B的叉积。A和B必须具有相同的维数,size(A,dim)和size(B,dim)必须是3。
>>a=[1 2 3];
>>b=[4 5 6];
>>c=cross(a,b)
c=
-3 6 -3
混合积
计算向量a=(1, 2, 3)、b=(4, 5, 6)和c=(-3, 6, -3) 的混合积
>>a=[1 2 3]; b=[4 5 6]; c=[-3 6 -3];
>>x=dot(a, cross(b, c))
x = 54

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
威望
222
贡献
37
兑换币
0
注册时间
2010-3-4
在线时间
0 小时
2#
发表于 2010-3-4 21:47:52 | 只看该作者
看不懂耶
回复 支持 反对

使用道具 举报

20

主题

187

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2478
威望
412
贡献
1638
兑换币
4
注册时间
2009-9-10
在线时间
214 小时
3#
发表于 2010-10-12 21:19:08 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-23 01:26 , Processed in 0.135840 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表