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