使用Matlab或Matlab符号工具查找约束边界变量的函数最大值?

时间:2019-05-24 13:53:16

标签: matlab mathematical-optimization symbolic-math equation-solving

我当前正在求解方程式,因此需要找到函数的最大值。

等式是

v = sqrt(u^2+2*a*s); 

其中0.1 <= a <= 1.5

u = 2.75;
s = 3.194;

我必须解决一系列方程,每当我有一个变量不等式时。我想找出v的最大值和a的对应值。

2 个答案:

答案 0 :(得分:4)

方法1:数字(但天真)
此方法使用具有矢量化功能的anonymous function,对可能的v的范围内的a进行数值计算,以逐步调整大小(a中的精度)为0.01。

根据所需的精度,可以简单地减少stepsize直到答案在公差范围内收敛(停止变化)。

% MATLAB R2017a    
u = 2.75;
s = 3.194;
fh =@(a) sqrt(u.^2 + 2.*a.*s);

aLB = 0.1;
aUB = 1.5;
stepsize = 0.01;       % Reduce until your answer converges (stops changing)
a = aLB:stepsize:aUB;

v = fh(a);
[v_max, ind] = max(v)      % v_max = 4.1406
a(ind)                     % a(ind) = 1.5000

方法2:数字
此方法使用线性惩罚将约束aLB <= a <= aUB添加到目标函数中,以使用fminsearch进行数值优化。请注意,fminsearch需要a的初始开始猜测,并且必须对目标函数进行向量化。

当目标函数是凸的(在a上)时,此方法效果很好。如果目标函数不是凸函数,则一种方法是从不同的起点多次执行此操作,然后选择最佳答案作为“到目前为止找到的最佳答案”。

由于我们在这里最大化,fminsearch仅最小化,因此引入了负号并将其最小化。至于惩罚函数,我们可以使它平方或增加权重,但是我们知道a的可行范围,因此这里不需要这种方法。

f2h =@(a) -fh(a) + abs(a-aLB).*(a < aLB) + abs(a-aUB).*(a > aUB);
[a_best, v_max_neg] = fminsearch(f2h,1)
v_max = -vmax_neg

通过检查,您可以看到目标函数是凹的(尽管二阶导数也会显示出来)。因此,否定它会产生凸函数,这意味着fminsearch返回的局部解(最优)也将是全局解。

Objective function visualization

答案 1 :(得分:1)

  • fminbnd找到函数minimum
  • 因为您正在寻找最大的尝试,请尝试尽量减少与 您的功能
u = 2.75;
s = 3.194;
lb = 0.1;
ub = 1.5;
v =@(a) -1*sqrt(u.^2 + 2.*a.*s);
[maximum_a,maximum_v]  = fminbnd(v,lb,ub);
maximum_v = -1*maximum_v ;
%% maximum_a = 1.5
%% maximum_v =4.1405