[英]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.