用MATLAB求极值
用MATLAB求极值
灵活的运用MATLAB的计算功能,可以很容易地求得函数的极值。
例3.6.1 求
2
2
344
1
x x
y
x x
++
=
++
的极值
解首先建立函数关系:
s yms s
y=(3*x^2+4*x+4)/( x^2+x+1); ↙然后求函数的驻点:
dy=diff(y); ↙
xz=solve(dy) ↙
xz=
[0] [-2]
知道函数有两个驻点x
1=0和x
2
=-2,考察函数在驻点处二阶导数的正负情况:
d2y=diff(y,2); ↙
z1=limit(d2y,x,0) ↙z1=
-2
z2=limit(d2y,x,-2) ↙z2=
2/9
于是知在x
1=0处二阶导数的值为z
1
=-2,小于0,函数有极大值;在x
2
=-2处二阶导数的值
为z
2
=2/9,大于0,函数有极小值。如果需要,可顺便求出极值点处的函数值:
y
1
=limit(y,x,0) ↙
y
1
=
4
y
2
=limit(y,x,-2) ↙
y
2
=
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 354
Optimization terminated: relative infinity-norm of gradient less than options.TolFun.
x =
-0.6667
>> f(x)
ans =
-1.1481
在规定范围内的最大值是1.1481
由于函数的局限性,求出的极值可能是局部最小(大)值。
求全局最值要用遗传算法。
如何用matlab求多元函数的极值
求在0 当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*cf u-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 Qd Qd=(-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 . 第三步 定出2 B A C -的符号,再判定是否是极值. 代码: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 on plot(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*'); 实验五 用matlab 求二元函数的极值 1.计算二元函数的极值 对于二元函数的极值问题,根据二元函数极值的必要和充分条件,可分为以下几个步骤: 步骤1.定义二元函数),(y x f z =. 步骤2.求解方程组0),(,0),(==y x f y x f y x ,得到驻点. 步骤3.对于每一个驻点),(00y x ,求出二阶偏导数 22222,,.z z z A B C x x y y ???===???? 步骤4. 对于每一个驻点),(00y x ,计算判别式2B AC -,如果02>-B AC ,则该驻点是 极值点,当0>A 为极小值, 0>clear; syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans =4*x^3-8*y ans =-8*x+4*y 用MATLAB求极值 灵活的运用MATLAB的计算功能,可以很容易地求得函数的极值。 例3.6.1 求 2 2 344 1 x x y x x ++ = ++ 的极值 解首先建立函数关系: s yms s y=(3*x^2+4*x+4)/( x^2+x+1); ↙然后求函数的驻点: dy=diff(y); ↙ xz=solve(dy) ↙ xz= [0] [-2] 知道函数有两个驻点x 1=0和x 2 =-2,考察函数在驻点处二阶导数的正负情况: d2y=diff(y,2); ↙ z1=limit(d2y,x,0) ↙z1= -2 z2=limit(d2y,x,-2) ↙z2= 2/9 于是知在x 1=0处二阶导数的值为z 1 =-2,小于0,函数有极大值;在x 2 =-2处二阶导数的值 为z 2 =2/9,大于0,函数有极小值。如果需要,可顺便求出极值点处的函数值: y 1 =limit(y,x,0) ↙ y 1 = 4 y 2 =limit(y,x,-2) ↙ y 2 = 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) 实验3 Matlab 符号运算及求函数极值一、实验目的和要求 掌握用Matlab软件进行符号运算以及求函数的极值。 二、实验环境 Windows系列操作系统,Matlab软件。 三、实验内容 1.用MATLAB进行符号运算; 2.编程求函数的极值。 四、实验步骤 3.开启软件平台——Matlab,开启Matlab编辑窗口; 4.根据求解步骤编写M文件; 5.保存文件并运行; 6.观察运行结果(数值或图形); 7.根据观察到的结果和体会写出实验报告。 五、示例 1.计算一元函数的极值 例1求 2 2 344 1 x x y x x ++ = ++ 的极值 解首先建立函数关系: s yms x y=(3*x^2+4*x+4)/( x^2+x+1); 然后求函数的驻点: dy=diff(y); xz=solve(dy) xz= [0] [-2] 知道函数有两个驻点x 1=0和x 2 =-2, 接下来我们通过考察函数的图形,则它的极值情况和许多其它特性是一目了然的。而借助MATLAB的作图功能,我们很容易做到这一点。 例2 画出上例中函数的图形 解 syms x y=(3*x^2+4*x+4)/( x^2+x+1); 得到如下图形 ezplot(y) 2.计算二元函数的极值 MATLAB 中主要用diff 求函数的偏导数,用jacobian 求Jacobian 矩阵。 例1 求函数42823z x xy y =-+-的极值点和极值. 首先用diff 命令求z 关于x,y 的偏导数 >>clear; syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans =4*x^3-8*y ans =-8*x+4*y 即348,84z z x y x y x y ??=-=-+??再求解方程,求得各驻点的坐标。一般方程组的符号解用solve 命令,当方程组不存在符号解时,solve 将给出数值解。求解方程的MA TLAB 代码为: 实验5 matlab 自定义函数与导数应用 实验目的 1.学习matlab 自定义函数. 2.加深理解罗必塔法则、极值、最值、单调性. 实验内容 1.学习matlab 自定义函数及求函数最小值命令. 函数关系是指变量之间的对应法则,这种对应法则需要我们告诉计算机,这样,当我们输入自变量时,计算机才会给出函数值,matlab 软件包含了大量的函数,比如常用的正弦、余弦函数等.matlab 允许用户自定义函数,即允许用户将自己的新函数加到已存在的matlab 函数库中,显然这为matlab 提供了扩展的功能,无庸置疑,这也正是matlab 的精髓所在.因为matlab 的强大功能就源于这种为解决用户特殊问题的需要而创建新函数的能力.matlab 自定义函数是一个指令集合,第一行必须以单词function 作为引导词,存为具有扩展名“.m ”的文件,故称之为函数M -文件. 函数M -文件的定义格式为: function 输出参数=函数名(输入参数) 函数体 …… 函数体 一旦函数被定义,就必须将其存为M -文件,以便今后可随时调用.比如我们希望建立函数12)(2++=x x x f ,在matlab 工作区中输入命令: syms x ;y=x^2+2*x+1; 不能建立函数关系,只建立了一个变量名为y 的符号表达式,当我们调用y 时,将返回这一表达式. y ? y=x^2+2*x+1 当给出x 的值时,matlab 不能给出相应的函数值来. x=3;y ? y=x^2+2*x+1 如果我们先给x 赋值. x=3;y=x^2+2*x+1 得结果:y=16 若希望得出2|=x y 的值,输入: x=2;y ? 得结果:y=16,不是2=x 时的值.读者从这里已经领悟到在matlab 工作区中输入命令:y=x^2+2*x+1不能建立函数关系,如何建立函数关系呢?我们可以点选菜单Fill\New\M-fill 打开matlab 文本编辑器,输入: function y=f1(x) y=x^2+2*x+1; 存为f1.m .调用该函数时,输入: syms x ;y=f1(x)? 实验六多元函数的极值 【实验目的】 1.了解多元函数偏导数的求法。 2.了解多元函数极值的求法。 3.了解多元函数条件极值的求法。 4.学习、掌握MATLAB软件有关的命令。 【实验内容】 求函数42 =-+-的极值点和极值。 823 z x xy y 【实验准备】 1.计算多元函数的极值 2.计算二元函数在区域D内的最大值和最小值 3.求函数偏导数的MATLAB命令 MATLAB中主要用diff求函数的偏导数,用jacobian求Jacobian 矩阵。 diff(f,x,n)求函数f关于自变量x的n阶导数。 jacobian(f,x)求向量函数f关于自变量x(x也为向量)的jacobian 矩阵。 【实验重点】 1、多元函数的偏导数计算 2、多元函数极值的计算 【实验难点】 1、多元函数极值的计算 【实验方法与步骤】 练习1 求函数42823z x xy y =-+-的极值点和极值。首先用diff 命令求z 关于x,y 的偏导数 >>clear;syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans=4*x^3-8*y ans=-8*x+4*y 即348,84z z x y x y x y ??=-=-+??再求解正规方程,得各驻点的坐标。一般方程组的符号解用solve 命令,当方程组不存在符号解时,solve 将给出数值解。求解正规方程的MATLAB 代码为 >>clear; >>[x,y]=solve('4*x^3-8*y=0','-8*x+4*y=0','x','y') 结果有三个驻点,分别是P(-2,-4),Q(0,0),R(2,4)。下面再求判别式中的二阶偏导数: >>clear;syms x y; >>z=x^4-8*x*y+2*y^2-3; >>A=diff(z,x,2) >>B=diff(diff((z,x),y)) >>C=diff(z,y,2) 第七讲 Matlab 优化(求极值) 理论介绍:算法介绍、软件求解. 一.线性规划问题 1.线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小值的问题,Matlab 中规定线性规划的标准形式为 min s.t.T x c x Ax b Aeq x beq lb x ub ≤?? ?=??≤≤? 其中c 和x 为n 维列向量,A 、Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向量。注意:线性规划问题化为Matlab 规定中的标准形式。 求解线性规划问题的Matlab 函数形式为linprog(c,A,b),它返回向量x 的值,它的具体调用形式为: [x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,x0,OPTIONS) 这里fval 返回目标函数的值,LB 、UB 分别是变量x 的下界和上界,x0是x 的初始值,OPTIONS 是控制参数。 例1 求解线性规划问题 1231231 23123123max 23572510s.t.312,,0 z x x x x x x x x x x x x x x x =+-++=??-+≥??++≤??≥? 程序:c=[2;3;5]; >> A=[-2,5,-1;1,3,1];b=[-10;12]; >> Aeq=[1,1,1];beq=[7]; >> LB=[0;0;0];(zeros(3,1)) >> [x,fval]=linprog(c,A,b,Aeq,beq,LB,[]) 练习与思考:求解线性规划问题 12312312123 min 23+428 s.t.3+26,,0z x x x x x x x x x x x =+++≥?? ≥??≥? 注意:若没有不等式:b AX ≤存在,则令A=[ ],b=[ ]. 若没有等式约束, 则令Aeq=[ ], beq=[ ]. 2.可以转化为线性规划的问题 规划问题12min||+||++||s.t.,n x x x Ax b ≤L 其中1=[],T n x x x L ,A b 为相应维数的矩阵和向量。注意到对任意的i x 存在,>0i i u v 满足=-,||=+i i i i i i x u v x u v ,事实上只要取 +||||-= ,=22 i i i i i i x x x x u v 就可以满足上面的条件。 这样,记11=[],=[],T T n n u u u v v v L L 从而可以把问题变成 =1min (+) (-)s.t.,0 n i i i u v A u v b u v ≤?? ≥?∑ 例2 求解规划问题min{max||}i i i x y ε,其中=-.i i i x y ε 对于这个问题,如果取0=lim||i i y x ε,这样,上面的问题就变换成 01100min s.t.-,,-n n x x y x x y x ≤≤L 这是我们通常的线性规划问题。 练习与思考:规划问题 1234123412341234min ||2||+3||+4||--+=0s.t.-+-3=11--2+3=-2 z x x x x x x x x x x x x x x x x =+? ?? ???? 二.非线性一元函数的最小值 对于求一元函数的最小值问题,Matlab 提供了一个命令函数fminbnd , MATLAB 求函數極小(大)值 函數的極值 n函數的極值(極大值或極小值)可從兩個角度來談,一為絕對的極值(absolute or global extreme value),另一為相對的極值(relative or local extreme value) n絕對的極值:在所有定義域內中的極大值或極小值 n相對的極值:在定義域內某一區間中的極大值或極小值 n 單一變數函數 n 多變數函數 n y = f (x 1, x 2, …, x n )為一函數。若f 在x*上有極值,則 函數極值的發生處 0x y = f (x ) 0x y = f (x )極小值 極大值***12()0,()0,,()0n f f f x x x x x x ???===???L 求單變數函數之極小值n 在特定區間尋找單一變數之函數f(x) 之極小值 n 方法一:在區間內取點,計算這些點的函數值,然後利用min 指令找出其極小值 Ex. 求之極小值,其中>> x=linspace(0,8,100);>> y=cos(x).*exp(-2*x);>> [ymin index]=min(y)>> xmin=x(index) ()* min (),=££l u x f x f x x x x 08 ££x 2()cos()-=x f x x e ymin =-0.0076index =26xmin =2.0202f(x) 稱為目標函數(objective function) 求單變數函數之極小值n 方法二:利用MATLAB 內建函數fminbnd Ex.求之極小值,其中*step 1. edit fun.m function F=fun(x) F=cos(x)*exp(-2*x); *step 2. 求解(回到Matlab Command Window )>> [x, fval]=fminbnd(@fun, 0, 8)[x, fval] = fminbnd(@fun, x1, x2) x: 使函數值最小之x 值fval: 函數之極小值fun: 定義目標函數的function m-file 檔名x1: 區間下限, x2: 區間上限 2()cos()-=x f x x e 08 ££x x =2.0344fval =-0.0076 基于MATLAB 可行方向法求极值的实现 姓名:xxx 学号:xxx (北京理工大学机械与车辆学院车辆工程,北京 100081) 摘要:在工程实际的优化设计中,随着设计变量数和约束条件数的增加,随机方向搜索法和复合形法等直接优化解法的求解效率会偏低。可行方向法,顾名思义,一种始终在可行域内寻找下降方向的搜索法,以其收敛速度快、效果好的优点已成为求解约束非线性问题的一种有代表性的直接解法,同时也是求解大型约束优化问题的主要方法之一。本文将简单介绍可行方向法的数学思想,采用线性规划法和约束最优步长法编写MATLAB 程序,最后通过算例完成对优化问题的求解。 关键字:可行方向法;MATLAB ;优化方法。 1. 可行方向法的基本数学思想 1.1可行方向法的搜索策略 可行方向法迭代的第一步都是从可行域的某一初始点(0)X 出发,沿负梯度 (0)()f X -?方向移至某一个或J 个起作用约束面的交集()k X 上。以后的搜索路线和迭代计算可根据约束函数和目标函数的不同性状,分别采用以下三种不同策略继续搜索。 1) 由点()k X 出发,沿可行方向作一维最优化搜索,若所得新点(1)k X +在可行域内,则再沿(1)()k f X +-?方向作一维最优化搜索;若所得的新点不在可行域内,则将它移至约束面上再反复重复上述步骤,若 (1)()k f X ε+?≤,则停止迭代,如图1.1所示。 2) 由点()k X 出发,沿可行方向作一维最优化搜索,若所得新点(1)k X +在可行域外,则沿可行方向以最大步长到达另一个约束面上一点,将该点作为迭代点(1)k X +进行反复搜索,直至满足给出的K-T 条件,如图1.2所示。 遗传算法求函数最大值(matlab实现) 一、题目: 2,,当x在0~31区间的最大值。寻找f(x)=x 二、源程序: %遗传算法求解函数最大值 %本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些 Close all; Clear all; figure(1); fplot('variable*variable',[0,31]); %画出函数曲线 %以下定义遗传算法参数 GTSM=40; %定义个体数目 ZDYCDS=20; %定义最大遗传代数 EJZWS=5; %定义变量的二进制位数 DG=0.9; %定义代沟 最优结果的初始值% trace=zeros(2, ZDYCDS); FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异 Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定规模的二进制种群和结构 gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换 2 f(x)=x计算目标函数值% ObjV=variable*variable; while gen 实验六 多元函数的极值 【实验目的】 1. 多元函数偏导数的求法。 2. 多元函数自由极值的求法 3. 多元函数条件极值的求法、 4. 学习掌握MATLAB 软件有关的命令。 【实验内容】 求函数3282 4-+-=y xy x z 的极值点与极值 【实验准备】 1.计算多元函数的自由极值 对于多元函数的自由极值问题,根据多元函数极值的必要与充分条件,可分为以下几个步骤: 步骤1、定义多元函数),(y x f z = 步骤2、求解正规方程0),(,0),(==y x f y x f y x ,得到驻点 步骤3、对于每一个驻点),(00y x ,求出二阶偏导数,,,22222y z C y x z B x z A ??=???=??= 步骤4、 对于每一个驻点),(00y x ,计算判别式2B AC -,如果02>-B AC ,则该驻点就是极值点,当0>A 为极小值, 0 可以用help diff, help jacobian 查阅有关这些命令的详细信息 【实验方法与步骤】 练习1 求函数3282 4-+-=y xy x z 的极值点与极值、首先用diff 命令求z 关于x,y 的偏导数 >>clear; syms x y; >>z=x^4-8*x*y+2*y^2-3; >>diff(z,x) >>diff(z,y) 结果为 ans =4*x^3-8*y ans =-8*x+4*y 即.48,843y x y z y x x z +-=??-=??再求解正规方程,求得各驻点的坐标。一般方程组的符号解用solve 命令,当方程组不存在符号解时,solve 将给出数值解。求解正规方程的MA TLAB 代码为: >>clear; >>[x,y]=solve('4*x^3-8*y=0','-8*x+4*y=0','x','y') 结果有三个驻点,分别就是P(-2,-4),Q(0,0),R(2,4)、下面再求判别式中的二阶偏导数: >>clear; syms x y; >>z=x^4-8*x*y+2*y^2-3; >>A=diff(z,x,2) >>B=diff(diff(z,x),y) >>C=diff(z,y,2) 结果为 A=2*x^2 B =-8 C =4 由判别法可知)2,4(--P 与)2,4(Q 都就是函数的极小值点,而点Q(0,0)不就是极值点,实际上,)2,4(--P 与)2,4(Q 就是函数的最小值点。当然,我们可以通过画函数图形来观测极值点与鞍点。 >>clear; >>x=-5:0、2:5; y=-5:0、2:5; >>[X,Y]=meshgrid(x,y);实验五 用matlab求二元函数的极值
用MATLAB求极值
实验3 Matlab 符号运算及求函数极值
matlab自定义函数与极值求法
matlab实验六 多元函数的极值
Matlab优化(求极值)
Matlab求函数最值
基于MATLAB的可行方向法求极值问题讲解
遗传算法求函数极大值matlab实现
MATLAB多元函数导数求极值或最优值
MATLAB多元函数极值