使用 Matlab 或 Matlab 符号工具查找约束边界变量的函数的最大值?
Find maximum value of a function for a constrained boundary variable using Matlab or Matlab symbolic tool?
我目前正在求解方程,我需要找到一个函数的最大值。
等式是
v = sqrt(u^2+2*a*s);
其中 0.1 <= a <= 1.5
和
u = 2.75;
s = 3.194;
我必须求解一系列方程,每次我都有一个变量不等式。我想找出v
的最大值和a
对应的值。
方法 1:数值(但天真)
此方法使用带有矢量化的 anonymous function,在可能的 a
范围内对 v
进行数值计算,步长(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
添加到 objective 函数中,以使用 fminsearch
进行数值优化。请注意,fminsearch
需要对 a
进行初始猜测,并且必须对 objective 函数进行向量化。
当 objective 函数是凸函数(超过 a
)时,这很有效。如果 objective 函数不是凸函数,那么一种方法是从不同的起点多次执行此操作,然后将最佳答案作为您的 "best answer found so far."
由于我们在这里最大化而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
你可以看到 objective 函数是凹的(尽管二阶导数也会显示这一点)。所以否定它给出了一个凸函数,这意味着 fminsearch
返回的局部解决方案(最优)也将是全局解决方案。
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
我目前正在求解方程,我需要找到一个函数的最大值。
等式是
v = sqrt(u^2+2*a*s);
其中 0.1 <= a <= 1.5
和
u = 2.75;
s = 3.194;
我必须求解一系列方程,每次我都有一个变量不等式。我想找出v
的最大值和a
对应的值。
方法 1:数值(但天真)
此方法使用带有矢量化的 anonymous function,在可能的 a
范围内对 v
进行数值计算,步长(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
添加到 objective 函数中,以使用 fminsearch
进行数值优化。请注意,fminsearch
需要对 a
进行初始猜测,并且必须对 objective 函数进行向量化。
当 objective 函数是凸函数(超过 a
)时,这很有效。如果 objective 函数不是凸函数,那么一种方法是从不同的起点多次执行此操作,然后将最佳答案作为您的 "best answer found so far."
由于我们在这里最大化而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
你可以看到 objective 函数是凹的(尽管二阶导数也会显示这一点)。所以否定它给出了一个凸函数,这意味着 fminsearch
返回的局部解决方案(最优)也将是全局解决方案。
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