0

我正在尝试用 python 绘制一个 3d 表面,事实上我有这个代码:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from numpy import *

def f(x,y):
    r=x**2 + y**2
    return r

n=4.
b=1.
a=-b
h=(2*b)/n
print h
hx=h ##This line##
fig = plt.figure()
ax = Axes3D(fig)
X = arange(a, b+hx, hx)
Y = arange(a, b+h, h)
n = len(X)
m = len(Y)
Z = zeros([n,m])

for i in arange(n):
    for j in arange(m):
        Z[i,j] = f(X[i],Y[j])
X, Y = meshgrid(X, Y)
ax.plot_surface(Y, X, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
plt.show()

这运行正常并显示我正在查看的图表。但是当我将##This line## 更改为 hx=h/2. 运行它,图表就下地狱了,太可怕了,无法理解。我希望 X 轴上的网格比 Y 轴更近。我怎么能这样做?

当然,这是我正在求解偏微分方程的一个示例,并且我需要在一个轴上比另一个轴更靠近网格以具有数值稳定性。

4

1 回答 1

1

你翻转了你的维度

Z = zeros([m,n])

for i in arange(n):
    for j in arange(m):
        Z[j,i] = f(X[i],Y[j])
X, Y = meshgrid(X, Y)

适用于 的任何n比率m

使用您拥有的功能,您可以使用numpy广播并将整个部分编写为

X, Y = meshgrid(X, Y)
Z = f(X,Y)

这既更容易阅读也更快。

我会将整个代码块重写为:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from numpy import *

def f(x,y):
    r=x**2 + y**2
    return r


n = 5
m = 10
b = 1.
a = -b

fig = plt.figure()
ax = Axes3D(fig)
X = linspace(a,b,n)
Y = linspace(a,b,m)

X, Y = meshgrid(X, Y)
Z = f(X,Y)

ax.plot_surface(Y, X, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
plt.show()
于 2012-12-04T04:49:58.197 回答