当前位置:文档之家› 用MATLAB求极值

用MATLAB求极值

用MATLAB求极值灵活的运用MATLAB的计算功能,可以很容易地求得函数的极值。

例3.6.1 求223441x xyx x++=++的极值解首先建立函数关系:s yms sy=(3*x^2+4*x+4)/( x^2+x+1); ↙然后求函数的驻点:dy=diff(y); ↙xz=solve(dy) ↙xz=[0] [-2]知道函数有两个驻点x1=0和x2=-2,考察函数在驻点处二阶导数的正负情况:d2y=diff(y,2); ↙z1=limit(d2y,x,0) ↙z1=-2z2=limit(d2y,x,-2) ↙z2=2/9于是知在x1=0处二阶导数的值为z1=-2,小于0,函数有极大值;在x2=-2处二阶导数的值为z2=2/9,大于0,函数有极小值。

如果需要,可顺便求出极值点处的函数值:y1=limit(y,x,0) ↙y1=4y2=limit(y,x,-2) ↙y2=8/3事实上,如果知道了一个函数的图形,则它的极值情况和许多其它特性是一目了然的。

而借助MA TLAB的作图功能,我们很容易做到这一点。

例3.6.2画出上例中函数的图形解syms x ↙y=(3*x^2+4*x+4)/( x^2+x+1); ↙得到如下图形ezplot(y) ↙如何用MATLAB求函数的极值点和最大值比如说y=x^3+x^2+1,怎样用matlab来算它的极值和最大值?求极值:syms x y>> y=x^3+x^2+1>> diff(y) %求导ans =3*x^2 + 2*x>> solve(ans)%求导函数为零的点ans =-2/3极值有两点。

求最大值,既求-y的最小值:>> f=@(x)(-x^3-x^2-1)f = @(x)(-x^3-x^2-1)>> x=fminunc(f,-3,3)% 在-3;-3范围内找Warning: Gradient must be provided for trust-region method;using line-search method instead.> In fminunc at 354Optimization terminated: relative infinity-norm of gradient less than options.TolFun.x =-0.6667>> f(x)ans =-1.1481在规定范围内的最大值是1.1481由于函数的局限性,求出的极值可能是局部最小(大)值。

求全局最值要用遗传算法。

如何用matlab求多元函数的极值求在0<x<pi/2,0<y< pi/2内的极大值当X=pi/3 y=pi/3 z有极大值 3/8*3^(1/2)%定义二元函数clc;clear;syms x y;z=sin(x)*sin(y)*sin(x+y);ezsurf(x,y,z,[0,pi/2,0,pi/2]);%画三维图见补充部分dzx=diff(z,x) %求解驻点dzy=diff(z,y)dzx =cos(x)*sin(y)*sin(x+y)+sin(x)*sin(y)*cos(x+y)>> dzy=diff(z,y)dzy =sin(x)*cos(y)*sin(x+y)+sin(x)*sin(y)*cos(x+y)>>[xx,yy]=solve('cos(x)*sin(y)*sin(x+y)+sin(x)*sin(y)*cos(x+y)=0',... 'sin(x)*cos(y)*sin(x+y)+sin(x)*sin(y)*cos(x+y)=0','x','y')%%%'x','y'可以不用?A=diff(z,x,2); %对于定义域内的驻点求解二阶偏导函数B=diff(diff(z,x),y);C=diff(z,y,2);D=A*C-B^2;%判别极大值点D1=subs(subs(D,'x',xx(1)),'y',yy(1))%% subs含义见补充部分A1=subs(subs(A,'x',xx(1)),'y',yy(1))D2=subs(subs(D,'x',xx(2)),'y',yy(2))A2=subs(subs(A,'x',xx(2)),'y',yy(2))%极大值点和极大值[xx(2) yy(2)]JDZ=subs(subs(z,'x',xx(2)),'y',yy(2))程序运行结果ans =[ 1/3*pi, 1/3*pi]JDZ =3/8*3^(1/2)补充matlab中的绘图函数很多,三维的有好几个呢,下面我给出两种绘制方法1.使用ezmesh或者ezsurf这两个函数是简易绘图函数,可以直接使用字符串绘图ezmesh('x*y-(1/3)*(x^3)+1/4*((x^2)*(sqrt(2*(x^2-y*2))))-1/2*(y*(sqrt(2*(x^2-y*2))))')2.先计算坐标点数据,再绘图,可以使用mesh和surf函数[x,y]=meshgrid(0:0.1:10);z=x.*y-(1/3)*(x.^3)+1/4*((x.^2).*(sqrt(2*(x.^2-y*2))))-1/2*(y.*(sqrt(2*(x.^2-y*2))));z(imag(z)~=0)=nan;mesh(x,y,z)subs是赋值函数,用数值替代符号变量替换函数例如: 输入subs(a+b,a,4) 意思就是把a用4替换掉,返回4+b也可以替换多个变量,例如:subs(cos(a)+sin(b),{a,b},[sym('alpha'),2])分别用字符alpha替换a和2替换b,返回cos(alpha)+sin(2)用法很灵活,仔细看帮助,会得到你想要的形式的matlab subs如何用悬赏分:0 - 解决时间:2008-12-3 17:36在解一个模型,其中:Qd=(-2*x-2*wd+2*a-a*k+y*k+wf*k+td*k)/(4*b-2*b*k^2)现在求出来x = 1/2*(48*a+32*k+16*wd-16*cdu-4*wf*k-4*td*k-12*a*k-10*a*k^2+td*k^3-8*k^3+4*k^2*cdu-4*k*cfu+cfu*k^3+3*a*k^3-6*wd*k^2+wf*k^3)/(5*k^2-16)y = (-8*a+a*k^2-2*wd*k+10*a*k+8*wf-3*wf*k^2-3*td*k^2+2*cfu*k^2+4*k^2+8*td-8*cfu-2*k*cdu)/(5*k^2-16)要把x和y代回Qd,请教达人,用matlab的subs怎么写啊?万分感谢!问题补充:Qd=(-2*x1-2*wd+2*a-a*k+y1*k+wf*k+td*k)/(4*b-2*b*k^2)x1=1/2*(48*a+32*k+16*wd-16*cdu-4*wf*k-4*td*k-12*a*k-10*a*k^2+td*k^3-8*k^3+4*k^2*c du-4*k*cfu+cfu*k^3+3*a*k^3-6*wd*k^2+wf*k^3)/(5*k^2-16)y1=(-8*a+a*k^2-2*wd*k+10*a*k+8*wf-3*wf*k^2-3*td*k^2+2*cfu*k^2+4*k^2+8*td-8*cfu-2*k *cdu)/(5*k^2-16)subs(Qd,{x1,y1},{x,y})以上输入之后报错为:Undefined function or variable 'x1'.请问是哪里除了问题?提问者:nxdviola - 一级最佳答案syms x1,y1 QdQd=(-2*x1-2*wd+2*a-a*k+y1*k+wf*k+td*k)/(4*b-2*b*k^2)subs(Qd,{x1,y1},{x,y})为何Matlab用subs后给出的结果是个代数式而不是数字?悬赏分:0 - 解决时间:2009-10-8 22:16使用d=subs(f4,{x,y,z},{2,3,1})后,结果给出了一个很长的代数式,里面有pi和atan,但都没有计算,为什么不给出一个最终的数字结果?提问者:再见长江- 二级最佳答案subs函数就是替换符号表达式的函数,要计算需要用eval函数急询:Matlab中subs(S)的应用疑问?悬赏分:5 - 解决时间:2006-6-29 12:57急询:Matlab中subs(S)的应用疑问?1.subs(S)到底是什么函数?其什么作用,谢谢!2.下段绘图程序如下的话就画出不来:syms x t;t=0:pi/60:2*pi;y1=int(sin(x),x,0,t);y2=int(cos(x),x,0,t);plot(y1,y2)而把plot(y1,y2) 改成plot(subs(y1),subs(y2)) 就可以运行成功画出来了。

(1)为什么?(2)subs 在此起到什么作用?(3)而不加subs 为什么运行不了,画不出来?????急,多谢!(上次提问时候把y1写成y1=sin(x)了,现在改为int(sin(x),x,0,t); 抱歉)问题补充:(上次提问时候把y1写成y1=sin(x)了,现在改为int(sin(x),x,0,t);抱歉)请具体讲一下subs(S)到底是什么意思?(我知道subs(f,x,t)是什么意思,但我不明白sub(S)在此到底具体是什么意思?请详细一下,谢谢!)提问者:wanglicun - 二级最佳答案subs(S)的意思是:S以前是sym变量,subs(S)为double变量,plot只能对double变量作图。

曲线极值的标注:用matlab 中plot 绘制的曲线时,把曲线上峰值的大小标注在上面你指的是离散点的最大和最小值吧?给你个简单的例子看看:求函数),(y x f z =极值的一般步骤:第一步 解方程组,0),(=y x f x 0),(=y x f y 求出实数解,得驻点.第二步 对于每一个驻点),(00y x ,求出二阶偏导数的值A 、B 、C .第三步 定出2B AC -的符号,再判定是否是极值.代码:x=0:pi/50:2*pi; y=sin(x);y1=max(y);x1=x(find(y==y1));y2=min(y);x2=x(find(y==y2)); plot(x,y);hold onplot(x1,y1,'r*'); plot(x2,y2,'g*');离散数据就极值点%方法一x=0:0.01:20;y=2*sin(x/2)+cos(2*x)/2;% indmax=find(diff(sign(diff(y)))<0)+1;%极大值点% indmin=find(diff(sign(diff(y)))>0)+1;%极小值点ind=find(diff(sign(diff(y)))~=0)+1;%极值点plot(x,y,x(ind),y(ind),'ro')%方法二x=0:0.01:20;y=2*sin(x/2)+cos(2*x)/2;indmax=intersect(find(diff(y)>0)+1,find(diff(y)<0));%极大值点indmin=intersect(find(diff(y)<0)+1,find(diff(y)>0));%极小值点plot(x,y,x(indmax),y(indmax),'ro',x(indmin),y(indmin),'go') %方法三x=0:0.01:20;y=2*sin(x/2)+cos(2*x)/2;yf=y(2:end-1)-y(1:end-2); %前向差分yb=y(2:end-1)-y(3:end); %后向差分I=find(yf.*yb>=0)+1; %寻找极值点(不考虑首尾两点)plot(x,y,'b',x(I),y(I),'r*');。

相关主题