我试图通过使用lambdify将函数j0、j1和j10转换为numpy格式来绘制r(0,20)范围内的函数j0、j1和j10。我使用了以下代码:
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
from ipywidgets.widgets import interact
sym.init_printing(use_latex="mathjax")
x, y, z, t = sym.symbols('x y z t')
r = sym.symbols("r", positive=True)
j0 = (sym.diff(((sym.cos(sym.sqrt(r**2-2*r*t)))/r),t)).subs({t:0})
j1 = (sym.diff(((sym.cos(sym.sqrt(r**2-2*r*t)))/r),t,2)).subs({t:0})
j10 = (sym.diff(((sym.cos(sym.sqrt(r**2-2*r*t)))/r),t,11)).subs({t:0})
k = sym.lambdify(r,j0)
l = sym.lambdify(r,j1)
m = sym.lambdify(r,j10)
myr = np.linspace(0,20,1000)
plt.plot(myr,k(myr),label="$j_{0}(r)$")
plt.plot(myr,l(myr),label="$j_{1}(r)$")
plt.plot(myr,m(myr),label="$j_{10}(r)$")
plt.ylim(-1,1)
plt.legend()
plt.xlabel("r")
plt.ylabel("$j_{n}(r)$")
我得到了这个输出:
这看起来至少是部分正确的,但是我也得到了这个错误信息,这是我以前从未见过的:
/anaconda3/lib/python3.6/site-packages/numpy/__init__.py:1: RuntimeWarning: invalid value encountered in true_divide
"""
/anaconda3/lib/python3.6/site-packages/numpy/__init__.py:1: RuntimeWarning: invalid value encountered in true_divide
"""
/anaconda3/lib/python3.6/site-packages/numpy/__init__.py:1: RuntimeWarning: divide by zero encountered in true_divide
"""
/anaconda3/lib/python3.6/site-packages/numpy/__init__.py:1: RuntimeWarning: invalid value encountered in true_divide
"""
/anaconda3/lib/python3.6/site-packages/numpy/__init__.py:1: RuntimeWarning: divide by zero encountered in true_divide
"""
我怀疑这与使用.subs({t:0})有关,但是在对代码进行大量修改和重写之后,我发现如果不使用.subs,我就无法得到我想要的j0、j1和j10的公式。我认为这个错误会产生连锁反应,因为当我试图将j10的公式代入下面的公式(应该是0)时,引用了一个错误“不正确的语法”:
(r**2)*sym.diff(m,r,2) + (2*r)*sym.diff(m,r) + (r**2 - 10*(10+1))*m
其中m是j10的numpy版本。你知道吗
任何帮助都将不胜感激。你知道吗
你的问题是由零除引起的,这在数值上很难处理,即使
r->0
的极限可能是有限的。我有两种(略有不同的)解决方案。你知道吗1)用精确的数学结果替换问题点。在您的示例中,这意味着一些类似的东西(
limit
是您首先在纸上导出的r->0
函数的精确解):2)如果你不能自己计算极限,你可以通过用一个很小的值替换零来解决问题,即:
相关问题 更多 >
编程相关推荐