MATLAB之所以运算功能强大,重要原因之一就是它含有丰富的内建函数,例如数学函数中的三角函数、复函数、多项式函数、数据分析函数的求平均值、最大最小值、排序等,以及逻辑/选择函数如if-else等,还有用来模拟随机发生事件的随机函数。虽然MATLAB提供了数百种内建函数,但也不是包罗万象,为了解决这个问题,MATLAB提供了十分方便的自定义函数(自建函数)的强大功能。
l)常见数学函数
MATLAB提供了许多内建函数,如对数函数、三角函数、多项式函数等。使用函数需注意,函数名要放在等式的右边,等式左边是计算这个函数的表达式。此外,函数可以嵌套,被当作另一个函数的自变量调用。一些常用的内建函数的格式和功能如下:
round(x)按四舍五入,对x取整
fix(x)将x值近似至最接近0的整数
floor(x)将x值近似至最接近-¥的整数
ceil(x)将x值近似至最接近¥的整数
sign(x)检验x的符号,x<0返回值为-1, x=0 返回值为0,x>0返回值为1
rem(x,y)求x/y的余数
exp(x)指数函数
log(x)以e为底的对数函数即自然对数
log10(x)以10为底的对数函数
至于三角函数和双曲线函数的使用,和一般数学式相似,其语法也很简洁易懂。例如三角函数有:sin(x)、cos(x)、tan(x)、asin(x)、acos(x)、atan(x)、atan2(y,x)。常用到的双曲线函数有:sinh(x)、cosh(x)、tanh(x)、asinh(x)、acosh(x)、atanh(x)。
常见的复数相关函数有real(求实部)、imag(求虚部)、conj(求共轭)、abs(求复数的值)、angle(求复角)等,MATLAB是以i或j来代表虚部,若复数表示为x=a+bi,其共轭复数,复数大小 ,复数向量的夹角 ,复数实部 ,复数虚部 ,复数指数表示法。则这些函数所对应的MATLAB的命令为:a=real(x),b=imag(x),=conj(x),r =abs(x), =angle(x),x=r*exp(i*angle(x))
用极坐标图描述复数往往比一般的卡氏坐标更合适,polar命令专门绘制极坐标图,其命令格式为polar(theta,r)其中(theta, r)分别表示极坐标上的角度 及半径值r。以下例子说明了它的用法:
>>t=0:0.01:2*pi;%给出角度t的变化范围
>>r=sin(2*t).*cos(2*t);%求出相应的半径r的值
>>polar(t,r)%做出极坐标图
>> title('Polar plot ofsin(2t)cos(2t)');% 加上题头
>> grid%加上网格线
令p(x)代表多项式 。MATLAB以p=[1 4 -7-10]来描述这个多项式,其中的数值是多项式的各阶项(从高到低)的系数,然后只要给出一组X的值,就可以用polyval函数来求此多项式的一组值,为了求上式p(x)的值,可执行以下命令:
>> x=linspace(-1,3); %给出100个从-1到3等分的x的值
>> p=[1 4 -7-10];% 给出要求的多项式
>> v=polyval(p,x);% v为所求的与100个x值对应的多项式的值
在MATLAB中,多项式的四则运算也很简单,加减直接用运算符相连,做乘除运算须借助conv和deconv两个函数。它们的格式是:乘法用conv(a,b),其中a、b是两个多项式系数的数组。除法用deconv函数,其格式是[q,r]=deconv(a,b),其中q,r分别代表商多项式及余数多项式。下面用几个范例,来说明两个多项式的加减乘除运算:
>> a=[1 2 3 4];b=[1 4 916]; % 给出两个多项式a和b
>>c=a+b;% 求两个多项式的和的多项式
>>d=a-b;% 求两个多项式的差的多项式
>>e=conv(a,b)% 求两个多项式的积的多项式
>>[q,r]=deconv(a,b)% 求两个多项式的商和余数的多项式
令多项式等于零,则它变成一个方程,MATLAB采用数值法可以很方便地求解高阶方程,求解方程的函数是roots,它的格式是roots(p),若存在有复根,会用i或j来表示虚根。注意在输入方程的系数时,所缺项的系数一定要用零来补足,给出例子如下:
>> p=[1-12 0 25116];% 其中二阶项系数为零说明方程中缺二阶项
>>r=roots(p)% r为所求的解,此例既有实数根也有复数根
roots函数的逆函数是 poly,当已知方程的解r,可用此函数求出原方程,例如:
>> r=[-2-1];% 已知某方程的根分别为-1,-2
>>pp=poly(r)% 用poly函数可求得pp= (x+2)(x+1) = x^2
+3x+2
polyder函数用来求多项式的微分,格式为polyde(p)。polyder(a, b)求多项式a,b乘积的微分;[p,q]= polyder(a,b)求多项式a,b商的微分,分母和分子分别保存在p,q中。residue函数完成两多项式相除,结果用部分分式展开来显示,例如:
>>n=10*[1,2];% 被除的多项式是10*s+20
>> d=poly([-l,-3,-4]);% 作为除数的多项式用根的方式表示,说明要分
解成与根相关的分式
>>[r,p,k]=risidue(n,d)%r为分子数组,P为分母常数项,k为余项
r= -6.6667
5.0000
1.6667
P= -4.0000
-3.0000
-1.0000
k=[ ]
事实上就是完成以下的运算:
上面介绍过用roots来求方程的解,但是如果方程式不是多项式的形态就不能用roots函数。而这类的方程多半是非线性方程式,其函数形态变化很大,此时可以用fzero函数来求解,它的基本原理就是找x的值,将此x值代人时,能使该函数值为零。求非线性方程式的根应按照以下步骤:
(1)先定义方程式。注意必须将方程式转换成f(x)=0的形态,例如某方程式为sin(x)=3,则该方程式应表示为f(x)=sin(x)-3。
(2)代人适当范围的x,求出相应的f(x)值,然后将该函数图画出,以便了解该方程式的函数的走向和趋势。
(3)选取图中可能的f(x)与x轴相交的x0,再调用fzero('function',x0),即可求出在x0附近可能存在的根,其中function是先前已定义的方程名。如果从函数分布图看出根不只一个,则需再代人一个x1,将下一个根求出。
2)常用数据分析函数
MATLAB提供了很多数据处理和分析的函数,常见的有:
max(x)找出数组x中的最大值。
max(x,y)找出数组x及y的最大值,产生一个由两个数组中最大的元素组成的新数组。[y,i]=max(x)将数组x中的最大值赋给y,其所在位置赋给i。
min(x)找出数组x中的最小值。
min(x, y)找出数组x及y的最小值,产生一个由两个数组中最小的元素组成的新数组。
[y,i]=min(x)将数组x中的最小值赋给y,其所在位置赋给i 。
mean(x)求出数组x中的平均值。
median(x)找出数组x的中位数。
sum(x)计算数组x的总和。
prod(x)计算数组x的连乘积。
cumsum(x)产生新的数组,每一项都是原数组x中前项的累加和。
cumprod(x)产生新的数组,每一项都是原数组x中前项的连乘积。
例如:
>> x=[1 2 3 4 5];
>>sum(x)%将x中的各项求和,结果为15
>>prod(x)%将x中的各项连乘,结果是120
>>cumsum(x)%将x的每一项与它的前项累加后生成新的数组[1 3 6 10 15]
>>cumprod(x)%将x的每一项与它的前项连乘后生成新的数组[1 2 6 24 120]
在分析各种工程问题时,常常需要模拟某种不可预见且不规则的现象,这时可以利用随机数(randomnumber)来产生模拟随机特性的一批数据。随机数按其统计分布特性可分为:均匀(uniform)随机数和正态(normal)随机数。均匀随机数是指其数值平均地分布于某一区间,而正态随机数的数值则是呈现高斯(Gaussian)分布,形状像一个中间高两边低的山丘。
用MATLAB函数rand可产生在[0,1]区间平均分布的随机数,产生均匀随机数的函数是rand(n)和rand(m,n),前者产生n个随机数,后者产生mn个随机数。将这些随机数代人数学模型中,可以模拟某种事件出现的概率。其中要注意seed(种子)这个选项,它用来设定随机数产生的起始值,有相同起始值的随机数,其后产生的随机数每次都相同。选择随机数种子函数的格式为rand('seed',n),n规定≥0。其中n=0有特别的意义,此时它第一次产生的随机数的起始值为931316785;其他的n值就是欲使用的起始值。如果使用相同的起始值,则随机数的序列会一样,因为随机数是依据起始值进行计算的。如果所需的随机值不在[0,1]区间,只需对其进行线性处理即可。
用MATLAB函数randn可产生正态随机数,由于正态随机数并非以上下限来定义,而是用数据的平均值和方差来定义,因此在产生正态随机数时,需设定平均值和方差的大小。randn(n)和randn(m,n)是分别产生含n×n和m×n个正态随机数元素的矩阵的函数,其平均值为0,方差为l。如果需要产生的正态随机数值的平均值和方差并非0和1,可以采用以下步骤进行转换。假设要得到一组正态随机数,它的平均值为b方差为a,首先产生一组随机数r,再将其值乘以方差a,接着再加上平均值b,算式为x=a*r+b,则x就是具有所需方差和平均值的随机数的矩阵。
3)矩阵运算函数
MATLAB的运算以数组(array)及矩阵(matrix)方式来进行,但二者运算性质明显不同,数组强调元素对元素的运算,所以在运算符前要加.,而矩阵则采用线性代数的运算方式。请看下表:
数组运算符号 | 矩阵运算符号 | 功能 |
+ | + | 加 |
- | - | 减 |
.* | * | 乘 |
./ | / | 左除 |
. | 右除 | |
.^ | ^ | 次方 |
.’ | ’ | 转置 |
若已有一矩阵A,则求它的逆矩阵和秩的函数分别为inv(A)和rank(A)。计算矩阵行列式的函数为det(A)。用dig(A)可建立对角矩阵或取矩阵的对角向量;rot90(A)可将矩阵旋转90度。