目标:使用非线性函数绘制图.函数与图
这是我第一次在八达夫工作。要绘制图形,我需要计算范围为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
除了错误之外,我相信这些任务是以更正确的方式解决的,但我不太明白该寻找什么。
问题:
谢谢!
发布于 2021-01-11 23:18:28
如果我正确地解释了你想要做的事情,下面的工作应该是有效的。首先,您需要使用所有在Fn上操作的算术运算符的逐个术语版本.这些与正常的运算符相同,除非前面有一个圆点。接下来,您需要将Fn设为包含所有想要绘制的点的x值的向量,并将q设为包含要绘制曲线的q值的向量。使用for-循环循环遍历q的值,并在循环的每一次迭代中绘制一条曲线。您不需要一个循环来绘制每条曲线,因为Octave会将您的"test“函数应用到整个Fn向量,并将结果作为相同大小的向量返回。若要在日志轴上绘制曲线,请使用函数"semilogx(x,y)“内嵌" plot (x,y)”。使情节出现在相同的图形上,而不是单独的在循环之前放置“坚持”,然后“暂停”。您在for-循环中使用单元格数组而不是向量,而绘图函数不接受这一点。此外,您不需要在八度函数中显式返回语句。
下面的代码生成一组曲线,这些曲线与您在问题中粘贴的图形中的曲线相似:
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
https://stackoverflow.com/questions/64803657
复制相似问题