Octave 如何在八度音程中计算end和if else的值?

Octave 如何在八度音程中计算end和if else的值?,octave,Octave,我需要在以下等式中计算变量Nfj: ea_M = (sf/E)*(2*Nfj)^b + ef*(2*Nfj)^c 因此,它等于4个不同的ea:5.0900e-04、4.3626e-04、3.6358e-04和2.9084e-04。结果应为Nfj的4个值,该值应存储在results中。我之所以舍入,是因为我认为不可能精确计算出ea的相等值,如果不舍入,相等值将始终为假 我为它写了这段代码,但它没有像预期的那样工作:脚本运行了很长时间,没有任何结果。我怎样才能使它正常工作 sf = 882.07;

我需要在以下等式中计算变量
Nfj

ea_M = (sf/E)*(2*Nfj)^b + ef*(2*Nfj)^c
因此,它等于4个不同的
ea
:5.0900e-04、4.3626e-04、3.6358e-04和2.9084e-04。结果应为
Nfj
的4个值,该值应存储在
results
中。我之所以舍入,是因为我认为不可能精确计算出
ea
的相等值,如果不舍入,相等值将始终为假

我为它写了这段代码,但它没有像预期的那样工作:脚本运行了很长时间,没有任何结果。我怎样才能使它正常工作

sf = 882.07;
ef = 0.59;
b = -0.102969;
c = -0.58;
E = 210000;
ea = [5.0900e-04; 4.3626e-04; 3.6358e-04; 2.9084e-04]

for pos = 1:length(ea)
  for Nfj = 1e3:10:1e12
    ea_M = (sf/E)*(2*Nfj)^b + ef*(2*Nfj)^c;
    if  round(ea_M * 10^5)/10^5 == round(ea(pos) * 10^5)/10^5;
      disp(ea_M)
      disp(Nfj)
      results(pos) = Nfj;
    end
  end
end
您正在尝试从103到1012的每10个值:这里有1011个值要尝试!这当然是很多。您将永远进行搜索,您可能会跳过使等式为真的实际值

如果无法手动求解方程,可以使用数值解算器。让我们首先打印函数:

sf=882.07;
ef=0.59;
b=-0.102969;
c=-0.58;
E=210000;
ea_M=@(Nfj)(sf/E)*(2*Nfj)。^b+ef*(2*Nfj)。^c;
Nfj=对数空间(3,121000);
地块(Nfj、ea_M(Nfj))
设置(gca、xscale、log)

看起来这个函数是非常单调的,您要查找的四个值在您要搜索的103到1012之间。要找到它等于一个值的位置,我们可以减去那个值,然后找到它等于零的位置。如果从函数大于零和小于零的点开始搜索,则可以很快缩小搜索范围。每次将间隔减半,保留包含过零的一半间隔。函数就是这样做的

ea=[5.0900e-04;4.3626e-04;3.6358e-04;2.9084e-04];
结果=零(大小(ea));
对于位置=1:努梅尔(ea)
结果(pos)=fzero(@(Nfj)ea_M(Nfj)-ea(pos),[1e3,1e12]);
结束
结果
在MATLAB中,此代码在很短的时间内运行,并输出:

结果=
1.0e+10*
0.0429
0.1849
1.0627
9.1919
ea_M(结果)-ea
近似为零


关于我在这里发布的代码的一些注释:

  • ea_M
    被定义为匿名函数。这使得重用表达式更容易,而不是反复编写表达式。我将
    ^
    替换为
    ^
    ,以允许此函数一次对
    Nfj
    值数组进行计算,而不是仅对单个值进行计算。这对于调用
    fzero
    是必需的

  • 我以对数标度绘制了这个函数,因为这个函数调用它。并非所有函数都是如此

  • 我预先分配了
    结果
    数组,您应该避免增加循环中数组的大小


  • 你没有使用你的
    Nfj
    变量,因此
    ea\u M
    应该始终是一样的。正如我所说的,你不是计算Nfj,而是一步一步地遍历所有可能的Nfj,并将其与实际计算值进行比较,如果Nfj接近你计算的值,则存储该Nfj。它看起来有点低效,因为您要进行10亿次迭代以获得四个值。我看到的一个具体问题是,ea_M行(sf E Ns b ef c)中的任何变量看起来都不会在循环中发生任何变化,因此,如果这些输入没有变化,那么每次出现该行时都会得到相同的ea_M。您好,我已经根据您的注释更正了脚本。原始脚本中的Ns应该是Nfj。不幸的是,脚本运行了很长时间,没有结果,因此欢迎提出任何改进建议。非常感谢你的帮助!所以你不能为
    Nfj
    解方程?试一试数值解算器怎么样?暴力尝试所有可能的
    Nfj
    值将是非常低效的,并且您可能会跳过使相等有效的实际值(您每尝试10个值,并舍入到5位小数,您是否看到您尝试的每个
    Nfj
    都会增加1e-5?),我没有用八度音阶解这类方程的经验。我知道我的方法可能是无效的,但我不知道还有什么更好的方法。你能告诉我如何用八度数值解算器解这个问题吗?