[x, fval]= fminbnd (f,x1,x2)其中fun为目标函数,支持字符串,inline函数,句柄函数,[x1,x2]为优化区间。输出x为最优解,fval为最优值。
例1 求函数在区间【0,8】上的最大值、最小值。
代码 如下
y='2*exp(-x)*sin(x)'
[xmin,fmin]=fminbnd(y,0,8)
%fplot(y,[0,8])
答案是
y =
'2*exp(-x)*sin(x)'
xmin =
3.9270
fmin =
-0.0279
也可以画图来看看最大值最小值的位置
求最大值的时候可以这样
y_1='-2*exp(-x)*sin(x)'
[xmax,ymax]=fminbnd(y_1,0,8)
ymax=-ymax
y_1 =
'-2*exp(-x)*sin(x)'
xmax =
0.7854
ymax =
-0.6448
ymax =
0.6448
也可以运用inline函数求解
y_2=inline('2*exp(-x)*sin(x)')
[xmax_1,ymax_1]=fminbnd(y_2,0,8)
y_2 =
内联函数:
y_2(x) = 2*exp(-x)*sin(x)
xmax_1 =
3.9270
ymax_1 =
-0.0279
答案有几分不一样,这是由各种函数的内置算法不同影响的。
当然 ,我们也可以运用句柄函数。
先写一个m文件
function f=fun1(x)
f=2*exp(-x)*sin(x);
函数也有几种调用形式
[x1,y1]=fminbnd('f',0,8)
[x2,y2]=fminbnd('f(x)',0,8)
[x3,y3]=fminbnd(@f,0,8)
运行结果是相同的
[x, fval]= fminunc(fun,x0)
[x, fval]= fminsearch(fun,x0)
其中:输入参数fun为目标函数,支持字符串,inline函数、句柄函数,x0为初值,必须得有
注意:fminunc,fminsearch只支持函数fun自变量单变量符号,如x(1),x(2)等
例2 求解的最小值
f='100*(x(1)-x(2)^2)^2+(1-x(2))^2'
[x,fval]=fminunc(f,[0,0])
[x_1,fval_1]=fminsearch(f,[0,0])
答案为
x =
1.0000 1.0000
fval
1.9474e-11
x_1 =
1.0000 1.0000
fval_1 =
3.6862e-10
[x, fval]= fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
参数解释
fun为目标函数,支持字符串、inline函数,句柄函数,x0初值,A线性不等式约束系数、b线性不等式约束常数项、Aeq线性等式约束系数,线性beq等式约束常数,nonlcon非线性约束,支持句柄函数。
先创建两个句柄函数
function f1=fun(x)
f1=x(1)^2+4*x(2)^2;
function [c,ceq]=fun(x)
c=x(1)^2+x(2)^2-10;
ceq=0;
x0=[10,10];
A=[-3,-4];b=-13;
lb=[0,0];
[x,f]=fmincon(@f1,x0,A,b,[],[],lb,[],@f3)
答案如下
x =
2.9991 1.0007
f =
13.0000
再看一个例子
例 4
先构造两个句柄函数
function f2=f(x)
f2=x(1)^2+4*x(2)^2+x(3)^2;
function [c,ceq]=fun(x)
c=[x(1)^2+x(2)^2-x(3)-100,-3*x(1)^3-x(2)^2+10*x(3)^0.5+20];
ceq=3*x(1)-x(2)^2+x(3)-50;%当非线性不等式约束有多个的时候,就要用矩阵写出约束条件。
代码
x0=[1,1,1];
A=[-3,-4,-1];b=13;
lb=[0,0,0];
[x,f]=fmincon(@f2,x0,A,b,[],[],lb,[],@f4)
x =
10.8390 0.0005 17.4831
f =
423.1423