在区间内寻找函数的最小值

Finding the minimum of a function over an interval

应 Martin 的要求,这是基本问题。有一个函数 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;

如有任何帮助,我们将不胜感激。

如果你想在某个区间内最小化一个函数,你可以使用 fminbnd function from the Optimization Toolbox. If you don't have that toolbox installed, you can either try a free alternative, or instead coerce the built-in function fminsearch 从区间中得到 return 个结果:

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,它 return 在区间之外 x 的值大得离谱。

这不是最优雅的解决方案,但它应该可以解决您的问题。