我正在尝试制作3d图,因为wolfram不能处理eq。但python似乎也遇到了麻烦。我基本上使用了surf plot示例:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html,但它不起作用。有人知道为什么吗?
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
x = y = np.arange(-10, 10, 0.25)
x,y = np.meshgrid(x,y)
z = (2*x**2 *(np.sqrt(x**2-4 * x+y**2+8)+ np.sqrt(x**2+4 * x+y**2+8))-x*(y**2-4)*
(np.sqrt(x**2-4 * x+y**2+8)-np.sqrt(x**2+4 * x+y**2+8))-2*(y**2+4)+(np.sqrt(x**2-4 * x+y**2+8)+np.sqrt(x**2+4 * x+y**2+8))+x**3 *
(np.sqrt(x**2+4 * x+y**2+8)-np.sqrt(x**2-4 * x+y**2+8)))/((x**2-4 * x+y**2+4) * np.sqrt(x**2-4 * x+y**2+8)*(x**2+4 * x+y**2+4)*np.sqrt(x**2+4 * x+y**2+8))
surf = ax.plot_surface(x,y,z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
ax.set_zlim(-0.1, 0.1)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
发布于 2013-12-16 00:27:57
问题是z
表面是非常尖峰的形状,实际上是z.max( ) = inf
。您可以做的一件事是用有限的最大值替换无限大的值:
z[ np.isinf( z )] = z[ np.isfinite(z)].max( )
这将为您提供下面的图。请注意,我没有设置z限制( ax.set_zlim
),因此整个形状都是可见的。
如果您只对[-.1, .1]
之间的绘图部分感兴趣,则可以通过以下方式截断这些点处的z
:
z[ z > .1 ] = .1
z[ z < -.1 ] = -.1
你将会得到:
发布于 2013-12-16 00:28:42
有几件事--首先,如果你将公共元素赋给变量,你的计算速度会更快。例如,
np.sqrt(x**2 - 4*x + y**2 + 8)
np.sqrt(x**2 + 4*x + y**2 + 8)
在你的mega-z
方程中被多次使用。将这些计算的结果赋给变量,然后在构建z
时使用这些变量。您将能够更容易地发现错误,并节省CPU周期:
a = np.sqrt(x**2 - 4*x + y**2 + 8)
b = np.sqrt(x**2 + 4*x + y**2 + 8)
c = (2*x**2 *(a + b)-x*(y**2 - 4) * (a - b)-2*(y**2+4)+(a + b)+x**3 * (b - a))
d = (x**2-4 * x+y**2+4) * a*(x**2+4 * x+y**2+4)*b
z = c / d
你的程序不工作的原因是因为你的庞大的z =
方程式中的某个地方有一个被零除的错误。我会让你来追踪它,但你可能想要做的一件事是仔细检查你的等式,并确保你在适当的地方有括号。
https://stackoverflow.com/questions/20594207
复制相似问题