如何解决八度音中的特殊方程

时间:2013-10-05 16:22:55

标签: matlab octave

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

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

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

感谢您的回答

3 个答案:

答案 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)