簡體   English   中英

如何在 Octave 中正確計算非線性 function 和 plot 其圖形?

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

目標: Plot 使用非線性圖 function. Function 和圖

在此處輸入圖像描述

在此處輸入圖像描述

這是我第一次在 Octave 工作。 對於 plot 圖形,我需要計算 Fx (0.1...10) 范圍內的 function。

我嘗試通過 for 循環循環 function 來實現這一點,將結果寫入數組(x 軸 - Fn,y 軸 - function 值),然后將 arrays 加載到 plot() function 中。

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

結果,我收到有關 arrays 格式的錯誤。

>> 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 等於一個向量,其中包含您希望到 plot 的所有點的 x 值,並將 Q 等於一個向量,該向量包含您要為其繪制曲線的 Q 的值。 使用 for 循環在循環的每次迭代中通過 Q 和 plot 的值循環一條曲線。 您不需要循環到 plot 每條曲線,因為 Octave 會將您的“測試” function 應用於整個 Fn 向量,並將結果作為相同大小的向量返回。 要 plot 對數軸上的曲線,請使用 function "semilogx(x, y)" insetad of "plot(x, y)"。 為了使繪圖出現在同一個圖形上,而不是單獨的圖形,在循環之前放置“hold on”並在循環之后“hold off”。 您在 for 循環中使用單元格 arrays 而不是向量,繪圖函數不接受。 此外,您不需要在 Octave function 中顯式返回語句。

以下代碼生成一組曲線,看起來像您在問題中粘貼的圖中的曲線:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM