如何绘制带单位的 sympy 函数

问题描述 投票:0回答:1

我正在尝试使用具有单位的 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

的真值
python sympy units-of-measurement plot3d
1个回答
0
投票

通常,您无法绘制包含单位的符号表达式。这就是原因。

当您使用

F(a,m)
创建表达式时,
a
m
是符号。但是,该表达式还包含其他实体
kilogram, meter, second
,它们是
Quantity
的实例(来自
sympy.physics.units
)。

当您执行

plot3d(F(a,m), (a, 2.,0.), (m, 0.,1.))
时,会发生以下情况:

  1. F(a,m)
    生成符号表达式:
    kilogram*meter*a_*m_/second**2
  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
    是什么。
  3. 绘图模块生成
    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$")

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.