如何在 Octave 中使用 for-end 和 if-else 计算值?

How to calculate values using for-end and if-else in Octave?

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

ea_M = (sf/E)*(2*Nfj)^b + ef*(2*Nfj)^c

因此它等于 ea 的 4 个不同值: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

您正在尝试每 10th 个值,从 103 到 1012:这里有 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 = logspace(3,12,1000);
plot(Nfj, ea_M(Nfj))
set(gca, 'xscale', 'log')

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

ea = [5.0900e-04; 4.3626e-04; 3.6358e-04; 2.9084e-04];
results = zeros(size(ea));
for pos = 1:numel(ea)
   results(pos) = fzero(@(Nfj) ea_M(Nfj) - ea(pos), [1e3,1e12]);
end
results

在 MATLAB 中,此代码在几分之一秒内运行并输出:

results =

   1.0e+10 *

    0.0429
    0.1849
    1.0627
    9.1919

ea_M(results) - ea大约为零。


关于我在此处发布的代码的一些注释:

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

  2. 我在对数刻度上绘制了这个函数,因为这个函数需要那个。并非所有功能都如此。

  3. 我预先分配了results数组,你应该避免在循环中增加数组的大小。