簡體   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