【问题标题】:Plotting 3D Surface with Sage Math用 Sage Math 绘制 3D 曲面
【发布时间】:2016-11-01 00:53:52
【问题描述】:

我正在尝试使用 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 行中的错误 回溯(最近一次通话最后): 文件“/projects/sage/sage-7.3/local/lib/python2.7/site-packages/smc_sagews/sage_server.py”,第 968 行,在执行 exec compile(block+'\n', '', 'single') 在命名空间,locals 文件“”,第 1 行,在 文件“/projects/sage/sage-7.3/local/lib/python2.7/site-packages/numpy/core/function_base.py”,第 93 行,在 linspace dt = result_type(开始,停止,浮动(数字)) TypeError: 数据类型不理解”

非常感谢任何和所有帮助。我认为出现错误是因为我定义了x = np.linspace(-8, 8, 100)t = np.linspace(-8, 8, 100) 但必须让原始程序运行。我不确定如何更正此问题,以便正确绘制图表。谢谢!

【问题讨论】:

  • 您真的在使用 Sage 本身吗?或者只是 SageMathCloud 笔记本/Jupyter 笔记本中的纯 Python?如果是前者,请切换到后者,这可能会解决任何命名空间或预处理冲突。
  • 里面只有一个纯Python。切换到后者是什么意思?
  • 我的意思是,如果您使用的是 Sage 而不是 pure Python,那么有一些内置插件或准备程序可能会搞砸。可能-8 等被解释为 Sage 整数,np 不会理解。尝试将 int 放在所有这些整数周围。

标签: python matplotlib plot sage


【解决方案1】:

你的代码有这两行的问题:

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 循环来计算它们。

【讨论】:

  • 谢谢你的回答,我试过了,我得到了这个错误:Error in lines 31-31 AttributeError: 'Float' object has no attribute 'cos'
  • 对不起,由于评论字符的限制,我使用了 pastebin:pastebin.com/hFNYXrba BTW,非常感谢您的帮助。
  • 尝试将您的代码放在 sagemathcloud 上的 Jupyter notebook 上。在第一个单元格上,使用这个
  • %matplotlib 内联
  • 是的,它有效!我已经尝试过你的建议,这是我的代码:pastebin.com/BiCmtUNb 结果有问题。与真实结果不同。应该是:s22.postimg.org/4kzl6ff1d/image.png,但我的是:s16.postimg.org/rv5zk9ojp/image.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多