【问题标题】:how to solve special equations in octave如何求解八度音阶中的特殊方程
【发布时间】:2013-10-05 16:22:55
【问题描述】:

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

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

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

谢谢你的回答

【问题讨论】:

  • 您的描述看起来不太清楚。 k1 和 k2 向量也是吗?
  • 您好,对不起,我没有写...没有 k1 和 k2 是常数,它们是我的方程的根。 k1 和 k2 是我必须找到的数字

标签: matlab octave


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    很容易看出这个问题的约束是:

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

    编辑:我错过了速率是行向量。我已经适当地转置了它

    【讨论】:

      【解决方案3】:

      其实因为只有两个变量,这个可以直接解决。假设 k1 为正(没有理由不让 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)
      

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 2014-01-14
        • 2015-04-16
        • 1970-01-01
        相关资源
        最近更新 更多