matlab - 使用 Matlab 或 Matlab 符号工具查找约束边界变量的函数的最大值?
问题描述
我目前正在求解方程,我需要找到函数的最大值。
方程是
v = sqrt(u^2+2*a*s);
在哪里0.1 <= a <= 1.5
和
u = 2.75;
s = 3.194;
我必须求解一系列方程,其中每次我都有一个变量不等式。我想找出 的最大值v
和对应的值a
。
解决方案
方法 1:数值(但幼稚)
这种方法使用带有矢量化的匿名函数v
,数值计算可能的范围,a
步长(精度 in 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
也将是全局解决方案。
推荐阅读
- gitlab - gitlab globbing 表达式不匹配
- swift - Swift 错误:无法从“A”转换为“A?” 使用泛型时
- excel - 只要按下多个键,Vba Excel就会在用户窗体中显示一个按钮
- ios - 如何修改 UIDatePicker 中的“shortWeekdaySymbols”?
- c++ - 使用 ofstream 时崩溃
- git - 如何获取对 Git 推送进行身份验证的用户(到 BitBucket 存储库)
- reactjs - react-i18next 翻译不适用于传递的 Prop 元素
- python - 在 Pycharm 上安装 KIvy。给出窗口错误
- android - Android即使启用也无法获取位置
- ios - “NSMutableDictionary”类型的值在 swift 中没有成员“字符串”