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

Plot Scilab中的3D绘图:奇怪的绘图行为,plot,scilab,Plot,Scilab,我想在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轴不会增

我想在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轴
不会增加最大值
,但
Y轴
会增加最大值。 然而,从我的测试来看,这两个轴似乎混淆了。增加
X轴
实际上将使最大
Z值翻倍

例如,当我将
Y轴
增加十倍时(直觉上,应该会增加函数值):

它似乎增加了另一个轴(在这个意义上,
z向量
是为
y,x
对数字而不是
x,y
计算的)


我在这里做错了什么?

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

surf(x,y,z')

有关更多信息,请参阅surf的帮助页。

斯蒂芬的回答是正确的,但我想我应该尝试更好地解释发生的原因/事情

帮助浏览
页面(我的重点):

十、 Y:
两个实数向量,长度为nx和ny;或者两个大小为ny x nx的实矩阵:它们定义数据网格(网格节点的水平坐标)。所有网格单元都是四边形的,但不一定是矩形的默认情况下,使用X=1:size(Z,2)和Y=1:size(Z,1)

Z:
明确定义节点高度的实矩阵,大小为ny x nx

换句话说,把surf看作
surf(Col,Row,Z)

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

z=feval(u,v,f):
返回矩阵z,例如z(i,j)=f(u(i),v(j))

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

因此,您可以看到您使用
x
y
参数调用了
feval
。从某种意义上说,您应该设计
pr
,以便它应该被称为pr(y,x),这样当传递到
feval
as
feval(y,x,pr)
时,您将得到一个输出,其行随着
y
增加,列随着
x
增加

然后您可以正常调用
surf(x,y,z)
,知道
x
对应于列,
y
对应于行

但是,如果您不想仅仅为此更改整个函数(这可能是您不想更改的),那么您只需在对surf的调用中转置z,以确保将x与列或
z'
(即
z
的行)匹配,并将y与
z'
的行(即
z
的列)匹配


话虽如此,将函数矢量化可能会更好,只需直接使用
surf(x,y,pr)
语法。

是的,这是Matlab的惯例,即当你在笛卡尔坐标系上查看z矩阵时,行对应于纵坐标,列对应于横坐标。