Scilab 中的 3D 绘图:奇怪的绘图行为

3D Ploting in Scilab: Weird plot behaviour

我想在 scilab 中绘制一个函数,以便找到数字范围内的最大值:

function y=pr(a,b)
  m=1/(1/270000+1/a);
  n=1/(1/150000+1/a);
  y=5*(b/(n+b)-b/(m+b))
endfunction

x=linspace(10,80000,50)
y=linspace(10,200000,50)
z=feval(x,y,pr)
surf(x,y,z);
disp( max(z))

对于这些值,这是绘图:

很明显,增加 X axis 不会增加最大值 Y axis 会。 然而,从我的测试来看,这两个轴似乎混淆了。增加 X axis 实际上会使最大值加倍 Z value.

例如,这就是我将 Y axis 增加十倍时发生的情况(直观上 应该增加函数值):

似乎增加了另一个轴(在某种意义上,z vector 是针对 y,x 对数字而不是 x,y 计算的)!

我做错了什么?

对于 Scilab 的 surf,如果来自 feval,则必须使用转置 z。如果您在 X 和 Y 方向上使用不同数量的点,这很容易实现,因为 surf 会抱怨第三个参数的大小。所以在你的情况下,使用:

surf(x,y,z')

有关详细信息,请参阅 surf 的帮助页面。

Stephane 的回答是正确的,但我想我会尝试更好地解释为什么/发生了什么。

来自 help surf 页面(强调我的):

X,Y:
two vectors of real numbers, of lengths nx and ny ; or two real matrices of sizes ny x nx: They define the data grid (horizontal coordinates of the grid nodes). All grid cells are quadrangular but not necessarily rectangular. By default, X = 1:size(Z,2) and Y = 1:size(Z,1) are used.

Z:
a real matrix explicitly defining the heights of nodes, of sizes ny x nx.

换句话说,将冲浪视为 surf( Col, Row, Z )

来自 help feval 页面(为方便起见更改了符号):

z=feval(u,v,f):
returns the matrix z such as z(i,j)=f(u(i),v(j))

换句话说,在您的 z 输出中,i 变成行(因此 u 应该代表您的 ), j 成为您的列(因此 v 应该代表您的 )。

因此,您可以看到您已经用 xy 参数调用了 feval。从某种意义上说,你应该设计 pr 以便它应该被称为 pr(y,x) 而不是,这样当作为 feval(y,x,pr) 传递给 feval 时,你会最终得到一个输出,其行增加 y,列增加 x

那么你可以正常调用surf(x, y, z),知道x对应列,y对应行。

但是,如果您不想为此更改整个函数(您可能不想这样做),那么您只需在调用 surf 时转置 z,以确保匹配 x到列或 z'(即 z 的行),以及 y 到 z' 的行(即 z 的列)。

说了这么多,让你的函数 向量化 并直接使用 surf(x, y, pr) 语法可能会好得多。