0

我有一个问题。我是 Octave 的新手,需要以这种格式求解这些方程:

-397.95 = min(k1*rate + k2); 776.37 = max(k1*rate + k2);

其中 rate 是我的行向量,大小为 10000。我需要的只是 octave 函数,它可以处理其他函数中的根(在我的最大值和最小值中)。我知道,这个问题有点数学,但我无法获得解决这个问题的正确简单函数......

谢谢你的答案

4

3 回答 3

0

看起来您需要使用优化来最小化成本函数,如下所示:

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

于 2013-10-07T09:59:01.457 回答
0

实际上由于只有两个变量,所以可以直接解决。假设 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)
于 2013-10-14T21:06:59.590 回答
0

很容易看出这个问题的约束是:

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);

编辑:我错过了这个比率是一个行向量。我已经适当地转置了

于 2013-10-14T20:42:55.370 回答