如何正确计算非线性函数并在 Octave 中绘制其图形?

How to correctly calculate a nonlinear function and plot its graph in Octave?

目标: 使用非线性函数绘制图形。 函数和图形

这是我第一次在 Octave 工作。要绘制图表,我需要计算 Fx (0.1 ... 10) 范围内的函数。

我尝试通过 for 循环循环函数来实现这一点,将结果写入数组(x 轴 - Fn,y 轴 - 函数值),然后将数组加载到 plot() 函数中.

Fn = 1
Ln = 5
Q  = 0.5

function retval = test (Fn, Ln, Q)
  # Fn squared (for common used)
  Fn = Fn^2
  # Node A + Node B
  nodeA = Fn * (Ln - 1)
  nodeB = (Ln * Fn - 1)^2 + Fn * (Fn - 1)^2 * (Ln - 1)^2 * Q^2
  nodeB = sqrt(nodeB)
  # Result
  result = nodeA / nodeB
  retval = result
  return;
endfunction


frequencyArray = {}
gainArray = {}
fCount = 1
gCount = 1

for i = 0:0.5:5
  # F
  Fn = i
  frequencyArray{fCount} = Fn
  fCount = fCount + 1
  # G
  gainArray{gCount} = test(Fn, Ln, Q)
  gCount = gCount + 1
end

plot(frequencyArray, gainArray);

因此,我收到有关数组格式的错误消息。

>> plot(frequencyArray, gainArray);
error: invalid value for array property "xdata"
error: __go_line__: unable to create graphics handle
error: called from
    __plt__>__plt2vv__ at line 495 column 10
    __plt__>__plt2__ at line 242 column 14
    __plt__ at line 107 column 18
    plot at line 223 column 10

除了错误,我相信这些任务都以更正确的方式解决,但我不太明白要寻找什么。

问题:

  1. 我是否选择了正确的方式来解决问题?有没有更优雅的方式?
  2. 我该如何解决这个错误?

谢谢!

如果我正确地解释了您要执行的操作,那么下面的操作应该可行。首先,您需要使用作用于 Fn 的所有算术运算符的逐项版本。这些与普通运算符相同,只是前面有一个点。接下来,您需要使 Fn 等于一个向量,该向量包含您希望绘制的所有点的 x 值,并使 Q 等于一个向量,该向量包含您要为其绘制曲线的 Q 值。使用 for 循环遍历 Q 的值并在循环的每次迭代中绘制一条曲线。您不需要循环来绘制每条曲线,因为 Octave 会将您的“测试”函数应用于整个 Fn 向量,并且 return 结果作为相同大小的向量。要在对数轴上绘制曲线,请使用函数“semilogx(x, y)”插入“plot(x, y)”。为了使绘图出现在同一个图形上,而不是单独的图形,在循环之前放置“hold on”并在循环之后“hold off”。您在 for 循环中使用了元胞数组而不是向量,绘图函数不接受这种情况。此外,您不需要在 Octave 函数中显式 return 语句。

以下代码生成一组曲线,看起来像您在问题中粘贴的图中的曲线:

Ln = 5

function result = test (Fn, Ln, Q)
    # Fn squared (for common used)
    Fn = Fn.^2;
    # Node A + Node B
    nodeA = Fn .* (Ln - 1);
    nodeB = (Ln .* Fn .- 1).^2 + Fn .* (Fn .- 1).^2 .* (Ln - 1)^2 * Q^2;
    nodeB = sqrt(nodeB);
    # Result
    result = nodeA ./ nodeB;
endfunction

Fn = linspace(0.1, 10, 500);
Q = [0.1 0.2 0.5 0.8 1 2 5 8 10];

hold on
for q = Q
    K = test(Fn, Ln, q);
    semilogx(Fn, K);
endfor
hold off