我正在尝试使用具有单位的 sympy 创建 3d 图,但根据我尝试输入单位的位置,我会收到不同的错误。下面的单位是在函数本身中内置的,但如果我也收到错误在绘图轴变量中输入单位:(a, 2.*米/秒^2., 0.*米/秒^2.)等。 我翻阅了 Sympy 文档,但找不到任何有关单位绘图的内容。 有没有既定的方法可以做到这一点?
import matplotlib.pyplot as plt
from sympy.physics.units.systems.si import SI
from sympy.physics.units import second, newton, meter, kilogram
from sympy import init_printing
from sympy import *
from IPython.display import display
from sympy.plotting import plot3d
F, m, a = symbols('F_ m_ a_')
def F(a,m):
return a*(meter/second**2.)*m*kilogram
plot3d(F(a,m), (a, 2.,0.), (m, 0.,1.), zlabel=S('F_'))
我尝试在sympy中使用plot3d来绘制带有单位的函数,但它不起作用。我得到 TypeError: Cannot conversion the expression to float 或 TypeError:无法确定 Relational
的真值通常,您无法绘制包含单位的符号表达式。这就是原因。
当您使用
F(a,m)
创建表达式时,a
和 m
是符号。但是,该表达式还包含其他实体 kilogram, meter, second
,它们是 Quantity
的实例(来自 sympy.physics.units
)。
当您执行
plot3d(F(a,m), (a, 2.,0.), (m, 0.,1.))
时,会发生以下情况:
F(a,m)
生成符号表达式:kilogram*meter*a_*m_/second**2
lambdify
将该符号表达式转换为数值函数:f = lambdify([a, m], F(a,m))
。我们来看一下:
help(f)
Help on function _lambdifygenerated:
_lambdifygenerated(a_, m_)
Created with lambdify. Signature:
func(a_, m_)
Expression:
kilogram*meter*a_*m_/second**2
Source code:
def _lambdifygenerated(a_, m_):
return kilogram*meter*a_*m_/second**2
数值函数有两个参数 a_, m_
,但它不知道 kilogram, meter, second
是什么。a_, m_
的数值数组,并将它们提供给数值函数。在评估时,您会遇到这些错误。可能的解决方案:从符号表达式中删除单位。您可以重写不带单位的表达式,也可以通过替换来删除它们。方法如下:
from sympy.physics.units import Quantity
expr_with_units = F(a, m)
# create a substitution dictionary: replace each quantity with number 1
sd = {k: 1 for k in expr_with_units.find(Quantity)}
expr_without_units = expr_with_units.subs(sd)
plot3d(expr_without_units, (a, 0, 2), (m, 0, 1), zlabel=r"$kg \cdot m / s^2$")