超出float容量的数据值-在Octave中绘图

3

我有一个非常简单的Octave脚本,我只是想绘制几个值,但是我遇到了错误:

warning: gl-render: data values greater than float capacity.  (1) Scale data, or (2) Use gnuplot

脚本是:
a = 0.2;
z = 160;
L = 8; 
w = 31.12;
x = 0;
g = 9.81;
k = 0.785;
rho = 1025;

  for t = 0:10
      eta_0 = -(1/g)*exp(0)*cos(k*x-w*t);
      u_x = a*w*exp(k*z)*cos(k*x-w*t);
      w_x = a*w*exp(k*z)*sin(k*x-w*t);
      p_d = -rho*a*g*exp(k*z)*cos(k*x-w*t);
  endfor

plot(t,eta_0); hold on
plot(t,u_x); hold on
plot(t, w_x); hold on
plot(t,p_d); 

我在网上搜索了这个错误,但没有找到任何有用的信息。我刚开始使用Octave和Gnuplot,对如何使用Gnuplot还不太清楚。我正在使用Ubuntu 12.04。如果您能提供任何建议或帮助,我将不胜感激。

谢谢!


1
在我的Octave 3.8中它运行良好。尝试在命令提示符下使用graphics_toolkit('gnuplot')来使用gnuplot,然后再次运行代码看看是否效果更好。 - am304
1个回答

1
您可能希望将循环设置如下,否则,您只会得到单个数据点,而不是曲线:
for t = 0:10
      eta_0(t) = -(1/g)*exp(0)*cos(k*x-w*t);
      u_x(t) = a*w*exp(k*z)*cos(k*x-w*t);
      w_x(t) = a*w*exp(k*z)*sin(k*x-w*t);
      p_d(t) = -rho*a*g*exp(k*z)*cos(k*x-w*t);
endfor

甚至更好的方法(不使用for循环,而是使用向量化操作):
t = 0:10;
eta_0 = -(1/g)*exp(0)*cos(k*x-w*t);
u_x = a*w*exp(k*z)*cos(k*x-w*t);
w_x = a*w*exp(k*z)*sin(k*x-w*t);
p_d = -rho*a*g*exp(k*z)*cos(k*x-w*t);

您尝试绘制的值非常大(约为7e57),这可能是错误的源头。尝试在代码开头添加graphics_toolkit('gnuplot')以使用gnuplot图形工具包,并查看是否可以更好地运行。我在Octave 3.8中尝试过,它可以正常工作,给出以下绘图结果:

enter image description here


PS:由于p_d非常巨大,所有的图形在图表上并不真正可见,即使它们实际上并不为零。如果您想在一个图形上看到所有内容,您可能需要对数据进行缩放。 - am304
非常有帮助,谢谢。我也注意到我只得到了一个数据点,所以已经修复了。现在将尝试您的建议。 - user3460758
有点愚蠢的问题,但使用gnuplot时,是用命令“gnuplot”而不是“plot”吗? - user3460758
1
gnuplot 只是另一种绘制图形的工具包,您仍然像平常一样发出 plot 命令。 - am304

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接