使用鼠尾草数学绘制3D表面

时间:2016-11-01 00:53:53

标签: python matplotlib plot sage

我正在尝试使用SageMath Cloud绘制3D表面,但我遇到了一些麻烦,因为matplotlib的文档似乎并不是非常彻底且缺少示例。无论如何,我写的程序是绘制我从分析方法得到的热方程解决方案。

案例是: Heat Equation

这是我的代码:

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

x = np.linspace(-8, 8, 100)
t = np.linspace(-8, 8, 100)

n = symbols('n', integer=True)
X, T = np.meshgrid(x, t)

an = float(2 / 10) * integrate(50 * sin(radians((2 * n + 1) * pi * x / 20)), (x, 0, 10))
Z = summation(an * e**(2 * n + 1 / 20)**2*pi**2*t * sin(radians((2 * n + 1) * pi * x / 20)), (n, 0, oo))

fig = plt.figure()
ax = fig.gca(projection = '3d')

surf = ax.plot_surface(X, T, Z,
                  rstride = 3,
                  cstride = 3,
                  cmap = cm.coolwarm,
                  linewidth = 0.5,
                  antialiased = True)

fig.colorbar(surf,
         shrink=0.8,
         aspect=16,
         orientation = 'vertical')

ax.view_init(elev=60, azim=50)
ax.dist=8
plt.show()

当我运行代码绘制图形时,我收到此错误:"第7-7行出错 Traceback(最近一次调用最后一次):   文件" /projects/sage/sage-7.3/local/lib/python2.7/site-packages/smc_sagews/sage_server.py" ;,第968行,执行中     exec编译(块+' \ n','','单')在命名空间,本地   文件"",第1行,in   文件" /projects/sage/sage-7.3/local/lib/python2.7/site-packages/numpy/core/function_base.py" ;,第93行,在linspace中     dt = result_type(start,stop,float(num)) TypeError:数据类型未被理解"

请,任何和所有帮助都非常有用。我认为错误出现是因为我定义了x = np.linspace(-8, 8, 100)t = np.linspace(-8, 8, 100)但是必须使原始程序运行。我不确定如何纠正这一点,因此图表正确绘制。谢谢!

1 个答案:

答案 0 :(得分:0)

您的这段代码在这两行中存在问题:

an = float(2 / 10) * integrate(50 * sin(radians((2 * n + 1) * pi * x / 20)), (x, 0, 10))
Z = summation(an * e**(2 * n + 1 / 20)**2*pi**2*t * sin(radians((2 * n + 1) * pi * x / 20)), (n, 0, oo))

我建议您先使用简单的for循环计算Z的其他一些简单值,以确认每个都很好。尝试用以下代码替换2行:

# begin simple calculation for Z
# offered just for example
Z = []
y = symbols('y')  # declare symbol for integration
for ix,ea in enumerate(x):
    ans = integrate(y * sin(ea / 20), (y, 0, x[ix]))  # integrate y from y=0 to y=x(ix)
    Z.append(ans)
Z = np.array(Z, dtype=float)  # convert Z to array
# end of simple calculation for Z

当你运行它时,你应该得到一些情节。对于Z的预期值,您可以通过简单的for循环来更好地计算它们。

My result plot