我有一个问题。我是Octave的新手需要以这种格式解决这些方程:
-397.95 = min(k1*rate + k2);
776.37 = max(k1*rate + k2);
其中rate是我的行向量,大小为10000.我需要的是八度函数,它可以处理其他函数中的根(在我的最大值和最小值)。我知道,这个问题有点数学,但我无法找到解决这个问题的正确功能......
感谢您的回答
答案 0 :(得分: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
包)等优化功能。我们的想法是尝试最小化您的费用函数,即将y
设为0.在您的函数中使用abs
以避免出现负数问题可能是个好主意。
答案 1 :(得分: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);
编辑:我错过了这个速度是一个行向量。我把它恰当地转换了
答案 2 :(得分:0)
实际上因为只有两个变量,所以可以直接解决。假设k1是正的(没有理由不让k1为正,因为翻转符号并没有真正改变问题,因为k2可以适当地移动),那么我们有k1 * max(速率)+ k2 = 776.37和k1 * min(速率)+ 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)