繁体   English   中英

如何在八度音阶中求解特殊方程

[英]how to solve special equations in octave

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

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

其中rate是大小为10000的行向量。我需要的是倍频程函数,该函数可以处理其他函数中的根(以我的max和min为单位)。 我知道,这个问题有点数学上的问题,但是我无法获得正确的简单函数来解决此问题...

谢谢你的答案

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

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以避免出现负数可能是个好主意。

可以很容易地看到此问题的约束是:

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

编辑:我想念那率是行向量。 我已经适当地调换了

实际上,由于只有两个变量,因此可以直接解决。 假设k1为正(由于使k2可以适当移动,因此没有理由不使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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM