我正在尝试使用SymPy执行以下任务:
- 化简一些物理量和物理常数的代数方程。
- 执行尺寸分析以确保我的方程式是正确的
- 通过插入物理量的值来评估方程。
下面是我针对此问题的最小可重现示例,我想在其中使用mass-energy equivalence找到与给定能量等效的质量量。(我在 Jupyter 中运行它,因为它可以使方程看起来不错。)
盯着E=m*c**2
我想解决m
:
from sympy import *
E, m, c = symbols('E m c') # symbols, for energy, mass, and speed of light
eq_E = Eq(E, m*c**2) # define equation for E in terms of m and c
eq_m = Eq(m,solve(eq_E,m)[0]) # solve equation for m
display(eq_m)
伟大的!现在是进行维度分析的时候了。我将E
用焦耳定义我的能量,我不需要定义单位,c
因为它是一个物理常数,而且我使用的是 SI 单位(这似乎是 SymPy 的默认单位)。 我想知道 1 焦耳能量中有多少质量,我想知道这个质量的单位。 我将使用定义我的变量Quantity()
,然后再次将它们设置为等式,以便 SymPy 可以解决它:
from sympy.physics.units import Quantity, energy, joule, speed_of_light
from sympy import Eq, solve
m = Quantity('m') # Define unknown mass 'm' as a quantity
E = Quantity('E') # Define known energy 'E' as a quantity
E.set_dimension(energy) # E is a quantity of energy
E.set_scale_factor(1.0*joule, 'SI') # set energy to 1.0 Joules
eq_E = Eq(E,m*speed_of_light**2) # define E = mc^2
eq_m = Eq(m,solve(eq_E,m)[0]) # Solve E = mc^2 for m
display(eq_m)
它看起来不漂亮,但表达是正确的。现在我想看看的价值m
是什么,以及单位m
有什么。首先,我将解决方案保存m
在m_solve
:
m_solve = solve(eq_E,m)[0]
display(m_solve)
现在,我可以看看有什么单位m_solve
吗?
print(m_solve.dimension)
AttributeError: 'Mul' object has no attribute 'dimension'
的价值m_solve
呢?
print(m_solve.scale_factor)
AttributeError: 'Mul' object has no attribute 'scale_factor'
什么是Mul
? 我如何得到一个Quantity
?更一般地说,SymPy 中是否有一个很好的工作流程来操作符号方程和检查单位,然后最终评估这些方程?如果不是 SymPy,有没有好的选择?(我尝试了一些替代方案,最有希望pint,但它似乎缺乏符号支持。)