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
应该代表您的 列 )。
因此,您可以看到您已经用 x
、y
参数调用了 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)
语法可能会好得多。
我想在 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
应该代表您的 列 )。
因此,您可以看到您已经用 x
、y
参数调用了 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)
语法可能会好得多。