根据马丁的要求,这是一个基本问题。有一个函数M(x)应该在区间[lb,ub]上最小化。
M = @(x) (a_1 * x + b_1) * (log((a_1 * x + b_1)/P_1) + X_u)...
+ (a_2 * x + b_2) * (log((a_2 * x + b_2)/P_2) + X_m)...
+ x * (log(x / P_3) + X_d);
lb = max(0, -b_1 / a_1);
ub = -b_2 / a_2;
输入为:
P_1 = 0.6;
P_2 = 0.2;
P_3 = 0.2;
a_1 = 0.7071;
a_2 = -1.7071;
b_1 = 0.0245;
b_2 = 0.9755;
X_u = 44;
X_m = 2.9949;
X_d = 0;
另一种选择是求解m_dash方程的根:
m_dash = @(x) log(((a_1 .* x + b_1).^a_1) .* ((a_2 .* x + b_2).^a_2) .* x)...
- log((P_1.^a_1) .* (P_2.^a_2) .* P_3) + a_1 .* X_u + a_2 .* X_m + X_d;
非常感谢任何帮助。
答案 0 :(得分:2)
如果要在一定时间间隔内最小化某个功能,可以使用优化工具箱中的fminbnd
功能。如果您没有安装该工具箱,则可以尝试free alternative,或者强制内置函数fminsearch
仅返回间隔的结果:
rlv = 1e12; % ridiculously large value
M_hacked= @(x) rlv*((x < lb) + (x > ub)) + M(x);
x_min = fminsearch(M_hacked, (lb + ub)/2)
我引入了一个新函数M_hacked
,它会在区间之外为x
返回可笑的大值。
这不是最优雅的解决方案,但它可以解决您的问题。