在Sympy中,我可以在符号打印的方程中使用S.Pi,但可以在不使用sub({Pi:3.1415}(的情况下进行评估:
>>> from sympy import pi
>>> from sympy.abc import r
>>> area = pi * r**2; area
πr²
>>> area.evalf(sub={r: 3.})
28.274333...
我想对其他常数做一些类似的事情,比如用西格玛表示的Steffen-Boltzmann常数。例如
>>> from sympy import symbols
>>> sigma, T = symbols('σ T');
>>> radiative_heat = sigma * T**4; radiative_heat
σT⁴
到目前为止一切都很好,但我不能在不将sigma更改为float的情况下为其指定一个永久值,而pi已经有了一个值。
>>> pi.evalf()
3.14159265...
>>> sigma.evalf()
σ
当然,我可以用一个值来代替西格玛,但这读起来不太好。我甚至还没有找到pi的值存储在对象中的位置。
我试过使用sympy.physics.units,但它们似乎不是这样实现的。
>>> import sympy.physics.units as u
>>> sigma = u.stefen
>>> sigma.evalf()
stefan_boltzmann_constant
有什么想法吗?
在pi
这样的情况下处理这类事情的方式如下:
class StefanBoltzmann(NumberSymbol):
def _as_mpf_val(self, prec):
return Float(5.670374419).evalf(prec)._mpf_
sigma = StefanBoltzmann()
print(sigma.evalf())
显然,Stefan-Boltzmann常数并不是真正的无量纲的,所以我认为sympy这样实现它是没有意义的。可能有一种方法可以将其转换为国际单位制的显式表达式,尽管我不确定如何转换。