在一个间隔内找到函数的最小值

时间:2015-08-20 13:40:45

标签: matlab mathematical-optimization built-in

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

非常感谢任何帮助。

1 个答案:

答案 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返回可笑的大值。

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