matlab常用工具1.docx
《matlab常用工具1.docx》由会员分享,可在线阅读,更多相关《matlab常用工具1.docx(25页珍藏版)》请在冰豆网上搜索。
matlab常用工具1
Matlab工具
一、多项式
1.找出多项式的根,即多项式为零的值。
在MATLAB里,多项式由一个行向量表示,它的系数是按降序排列。
例如,输入多项式x4-12x3+0x2+25x+116
»p=[1-12025116]
p=
1-12025116
注意,必须包括具有零系数的项。
给出这种形式,用函数roots找出一个多项式的根。
»r=roots(p)%matlab中对字母严格区分大分小写
r=
11.7473
2.7028
-1.2251+1.4672i
-1.2251-1.4672i
因为在MATLAB中,无论是一个多项式,还是它的根,都是向量,MATLAB按惯例规定,多项式是行向量,根是列向量。
给出一个多项式的根,也可以构造相应的多项式。
在MATLAB中,命令poly执行这个任务。
»pp=poly(r)
pp=
1.0e+002*
Columns1through4
0.0100-0.12000.00000.2500
Column5
1.1600+0.0000i
»pp=real(pp)%throwawayspuriousimaginarypart
pp=
1.0000-12.00000.000025.0000116.0000
MATLAB当用根重组多项式时,如果一些根有虚部,由于截断误差,则poly的结果有一些小的虚部,这是很普通的。
消除虚假的虚部,只要使用函数real抽取实部。
2.导数
MATLAB为多项式求导提供了函数polyder。
»g
g=
162048697244
»h=polyder(g)
h=
6308014413872
3.估值
根据多项式系数的行向量,可对多项式进行估值。
在MATLAB中,这由函数polyval来完成。
»x=linspace(-1,3);%choose100datapointsbetween-1and3.
»p=[14-7-10];%usespolynomialp(x)=x3+4x2-7x-10
»v=polyval(p,x);%表达式结尾的分号表示结果不显示
计算x值上的p(x),把结果存在v里。
然后用函数plot绘出结果。
»plot(x,v),title('x^3+4x^2-7x-10'),xlabel('x')
%helpplot
4.图像的绘制
plot在线性坐标系中绘制二维数据
plot3绘制三维数据
plot函数调用格式如下:
plot(Y)
plot(X1,Y1,…)
plot(X1,Y1,Linespec,…)
plot(…,‘PropertName’,PropertyValue,…)
h=plot(…)
其中,Plot(Y)中如Y为一个矢量,则绘制连接(i,Y(i))的折线;若Y中的1个元素为复数,则绘制(real(Y(i)),imag(Y(i))的折线;若Y为矩阵,则将每一列都视为一个矢量绘制一条折线.。
5.说到绘图,只要计算函数在某一区间的值,并且画出结果向量,这样就得到了函数的图形。
在大多数情况下,这就足够了。
然而,有时一个函数在某一区间是平坦的并且无激励,而在其它区间却失控。
在这种情况下,运用传统的绘图方法会导致图形与函数真正的特性相去甚远。
MATLAB提供了一个称为fplot的巧妙的绘图函数。
该函数细致地计算要绘图的函数,并且确保在输出的图形中表示出所有的奇异点。
该函数的输入需要知道以字符串表示的被画函数的名称以及2元素数组表示的绘图区间。
>>f='2*exp(-x).*sin(x)';
>>fplot(f,[08]);
>>title(f),xlabel('x')
的曲线
6.极小化
作图除了提供视觉信息外,还常常需要确定一个函数的其它更多的特殊属性。
在许多应用中,特别感兴趣的是确定函数的极值,即最大值(峰值)和最小值(谷值)。
数学上,可通过确定函数导数(斜率)为零的点,解析上求出这些极值点。
显然,如果定义的函数简单,则这种方法常常奏效。
然而,即使很多容易求导的函数,也常常很难找到导数为零的点。
在这种情况下,以及很难或不可能解析上求得导数的情况下,必须数值上寻找函数的极值点。
MATLAB提供了两个完成此功能的函数fmin和fmins。
这两个函数分别寻找一维或n维函数的最小值。
这里仅讨论fmin。
有关fmins的详细信息,参阅《MATLAB参考指南》。
因为f(x)的最大值等于-f(x)的最小值,所以,上述fmin和fmins可用来求最大值和最小值。
如果还不清楚,把上述图形倒过来看,在这个状态下,峰值变成了谷值,而谷值则变成了峰值。
考虑上述例子,从图中可知,在xmax=0.7附近有一个最大值,并且在xmin=4附近有一个最小值。
而这些点的解析值为:
和。
用文本编辑器编写一个脚本M文件,并用fmin寻出数值上极值点,给出函数主体如下:
%ex_fmin.m
fn='2*exp(-x)*sin(x)';%definefunctionformin
xmin=fmin(fn,2,5)%searchoverrange2emin=5*pi/4-xmin%finderror
x=xmin;%needxsincefnhasxasitsvariable
ymin=eval(fn)%evaluateatxmin
fx='-2*exp(-x)*sin(x)';%defineformax:
noteminussign
xmax=fmin(fx,0,3)%searchoverrange0emax=pi/4-xmax%finderror
x=xmax;%needxsincefnhasxasitsvariable
ymax=eval(fn)%evaluateatxmax
下面是M文件的运行结果:
>>ex_fmin
xmin=
3.9270
emin=
1.4523e-006
ymin=
-0.0279
xmax=
0.7854
emax=
-1.3781e-005
ymax=
0.6448
这些结果与上述图形非常吻合。
注意,fmin的工作方式很像fplot。
要计算的函数可用一个函数M文件表达,或者只给出一个x为自变量的字符串。
上述例子就是使用后一种方法。
这个例子也使用了函数eval,它获取一个字符串,并解释它,如同在MATLAB提示符下输入该字符串。
由于要计算的函数以x为自变量的字符串形式给出,那么设置x等于xmin和xmax,允许eval计算该函数,找到ymin和ymax。
最后,特别注意,求数值上的最小值包含一个搜索过程,fmin不断计算函数值,寻求其最小值。
如果计算的函数需要很大的计算量,或者该函数在搜索区间不止一个最小值,则该搜索过程所花的时间比较长。
在有些情况下,搜索过程根本找不到结果。
当fmin找不到最小值时,它会停止运行并提供解释。
与函数fmin一样,函数fmins搜索最小值。
不过,fmins搜索向量的标量函数的最小值。
即fmins寻找
这里x是函数f(.)的向量参数,函数f(.)返回标量值。
函数fmins利用单纯形法求最小值,它不需要精确的梯度计算。
任何一种优化工具箱中具有更多扩展的优化算法
7.求零点
humps函数的图形
函数fzero寻找一维函数的零点。
>>xzero=fzero('humps',1.2)%lookforazeronear1.2
xzero=
1.2995
所以,humps的零点接近于1.3。
寻找零点的过程可能失败。
如果fzero没有找到零点,它将停止运行并提供解释。
当调用函数fzero时,必须给出该函数的名称。
但由于某种原因,它不能接受以x为自变量的字符串来描述的函数。
这样,即使在fplot和fmin中都具有的这个特性,fzero将不工作。
fzero不仅能寻找零点,它还可以寻找函数等于任何常数值的点。
仅仅要求一个简单的再定义。
例如,为了寻找f(x)=c的点,定义函数g(x)=f(x)-c,然后,在fzero中使用g(x),就会找出g(x)为零的x值,它发生在f(x)=c时。
二、曲线拟合
曲线拟合涉及回答两个基本问题:
最佳拟合意味着什么?
应该用什么样的曲线?
可用许多不同的方法定义最佳拟合,并存在无穷数目的曲线。
当最佳拟合被解释为在数据点的最小误差平方和,且所用的曲线限定为多项式时,那么曲线拟合是相当简捷的。
数学上,称为多项式的最小二乘曲线拟合。
上图中,虚线和标志的数据点之间的垂直距离是在该点的误差。
对各数据点距离求平方,并把平方距离全加起来,就是误差平方和。
这条虚线是使误差平方和尽可能小的曲线,即是最佳拟合。
最小二乘这个术语仅仅是使误差平方和最小的省略说法。
在MATLAB中,函数polyfit求解最小二乘曲线拟合问题。
»x=[0.1.2.3.4.5.6.7.8.91];
»y=[-.4471.9783.286.167.087.347.669.569.489.3011.2];
使用polyfit,必须给函数赋予上面的数据和我们希望最佳拟合数据的多项式的阶次或度。
如果我们选择n=1作为阶次,得到最简单的线性近似。
通常称为线性回归。
相反,如果我们选择n=2作为阶次,得到一个2阶多项式。
»n=2;%polynomialorder
»p=polyfit(x,y,n)
p=
-9.810820.1293-0.0317
polyfit的输出是一个多项式系数的行向量。
其解是y=-9.8108x2+20.1293x-0.0317。
为了将曲线拟合解与数据点比较,让我们把二者都绘成图。
»xi=linspace(0,1,100);%x-axisdataforplotting
»z=polyval(p,xi);
调用MATLAB的函数polyval计算在xi数据点的多项式值。
»plot(x,y,'o',x,y,xi,z,':
')
画出了原始数据x和y,用'o'标出该数据点,在数据点之间,再用直线重画原始数据,并用点':
'线,画出多项式数据xi和z。
»xlabel('x'),ylabel('y=f(x)'),title('SecondOrderCurveFitting')
多项式阶次的选择是有点任意的。
两点决定一直线或一阶多项式。
三点决定一个平方或2阶多项式。
按此进行,n+1数据点唯一地确定n阶多项式。
于是,在上面的情况下,有11个数据点,我们可选一个高达10阶的多项式。
然而,高阶多项式给出很差的数值特性,人们不应选择比所需的阶次高的多项式。
此外,随着多项式阶次的提高,近似变得不够光滑,因为较高阶次多项式在变零前,可多次求导。
例如,选一个10阶多项式
»pp=polyfit(x,y,10);
»formatshorte%changedisplayformat
»pp.'%displaypolynomialcoefficientsasaco