问题描述
这是我第一次在Octave工作。要绘制图形,我需要计算Fx(0.1 ... 10)范围内的函数。
我试图通过在for循环中循环功能,将结果写入数组(x轴-Fn,y轴-函数值),然后将数组加载到plot()函数中来实现这一目的。 / p>
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,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
除了错误之外,我相信可以以更正确的方式解决这些任务,但是我不太了解要寻找什么。
问题:
谢谢!
解决方法
如果我正确解释了您要执行的操作,则以下内容应该有效。首先,您需要使用作用于 Fn 的所有算术运算符的逐项版本。除了前面有一个点之外,它们与普通运算符相同。接下来,您需要将 Fn 等于一个向量,该向量包含要绘制的所有点的 x 值,并将 Q 等于一个向量,该向量包含要为其绘制曲线的 Q 值。使用 for 循环遍历 Q 的值并在循环的每次迭代中绘制一条曲线。您不需要循环来绘制每条曲线,因为 Octave 会将您的“测试”函数应用于整个 Fn 向量并将结果作为相同大小的向量返回。要在对数轴上绘制曲线,请使用 "plot(x,y)" 的函数 "semilogx(x,y)" insetad。为了使图出现在同一个图上,而不是分开的图在循环之前“保持”并在循环之后“保持”。您在 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,q);
semilogx(Fn,K);
endfor
hold off