首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确计算一个非线性函数,并绘制出它的八度图?

如何正确计算一个非线性函数,并绘制出它的八度图?
EN

Stack Overflow用户
提问于 2020-11-12 12:09:13
回答 1查看 423关注 0票数 0

目标:使用非线性函数绘制图.函数与图

这是我第一次在八达夫工作。要绘制图形,我需要计算范围为Fx (0.1 . 10)的函数。

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

代码语言:javascript
运行
复制
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);

因此,我得到一个关于数组格式的错误。

代码语言:javascript
运行
复制
>> 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. 如何修复这个错误?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-11 23:18:28

如果我正确地解释了你想要做的事情,下面的工作应该是有效的。首先,您需要使用所有在Fn上操作的算术运算符的逐个术语版本.这些与正常的运算符相同,除非前面有一个圆点。接下来,您需要将Fn设为包含所有想要绘制的点的x值的向量,并将q设为包含要绘制曲线的q值的向量。使用for-循环循环遍历q的值,并在循环的每一次迭代中绘制一条曲线。您不需要一个循环来绘制每条曲线,因为Octave会将您的"test“函数应用到整个Fn向量,并将结果作为相同大小的向量返回。若要在日志轴上绘制曲线,请使用函数"semilogx(x,y)“内嵌" plot (x,y)”。使情节出现在相同的图形上,而不是单独的在循环之前放置“坚持”,然后“暂停”。您在for-循环中使用单元格数组而不是向量,而绘图函数不接受这一点。此外,您不需要在八度函数中显式返回语句。

下面的代码生成一组曲线,这些曲线与您在问题中粘贴的图形中的曲线相似:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64803657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档