在区间内寻找函数的最小值
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
的值大得离谱。
这不是最优雅的解决方案,但它应该可以解决您的问题。
应 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
的值大得离谱。
这不是最优雅的解决方案,但它应该可以解决您的问题。