我有一个问题。我是 Octave 的新手,需要以这种格式求解这些方程:
-397.95 = min(k1*rate + k2);
776.37 = max(k1*rate + k2);
其中 rate 是我的行向量,大小为 10000。我需要的只是 octave 函数,它可以处理其他函数中的根(在我的最大值和最小值中)。我知道,这个问题有点数学,但我无法获得解决这个问题的正确简单函数......
谢谢你的答案
看起来您需要使用优化来最小化成本函数,如下所示:
function y = f(x)
% k1 is x(1), k2 is x(2)
rate = ...
y = [min(x(1)*rate + x(2))+397.95; max(x(1)*rate+x(2))-776.37]
end
然后,您可以使用优化功能,例如fminsearch
或其他(来自optim
包)。这个想法是尝试最小化您的成本函数,即接近 0。在您的函数中使用以避免负数问题y
可能是一个好主意。abs
实际上由于只有两个变量,所以可以直接解决。假设 k1 为正(没有理由不让 k1 为正,因为翻转符号并不能真正改变问题,因为 k2 可以适当地移动),那么我们有 k1*max(rate) + k2 = 776.37 和 k1*min(rate ) + k2 = -397.95
所以
k1*(max(rate) - min(rate)) = 776.37 - (-397.95)
然后我们可以将 k1 求解为
k1 = (776.37 - (-397.95))/(max(rate) - min(rate))
然后 k2 可以找到
k2 = 776.37 - k1 * max(rate)
很容易看出这个问题的约束是:
k1 * rate + k2 >= -397.95
和
k1 * rate + k2 <= 776.37
由于较大的 k1 值会在此等式的结果中产生较大的方差,因此您的目标是在这些约束下最大化 k1(等效于最小化 -k1)。
您现在可以将其作为一个简单的线性程序运行:
height = size(rate,1);
c = [-1;0];
A = [rate',ones(height,1); rate',ones(height,1)];
b = [-397.95*ones(height,1); 766.37*ones(height,1)];
lb = [0;-Inf];
ub = [Inf; Inf];
ctype = [repmat("L",height,1); repmat("U",height,1)];
k = glpk (c,A,b,lb,ub,ctype)
k1 = k(1);
k2 = k(2);
编辑:我错过了这个比率是一个行向量。我已经适当地转置了