3

我正在尝试使用SymPy执行以下任务:

  1. 化简一些物理量和物理常数的代数方程。
  2. 执行尺寸分析以确保我的方程式是正确的
  3. 通过插入物理量的值来评估方程。

下面是我针对此问题的最小可重现示例,我想在其中使用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)

m = \frac{E}{c^2}

伟大的!现在是进行维度分析的时候了。我将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)=\frac{数量(E,E)}{数量(speed_{oflight},c)^2}

它看起来不漂亮,但表达是正确的。现在我想看看的价值m是什么,以及单位m有什么。首先,我将解决方案保存mm_solve

m_solve = solve(eq_E,m)[0]
display(m_solve)

\frac{数量(E,E)}{数量(speed_{oflight},c)^2}

现在,我可以看看有什么单位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,但它似乎缺乏符号支持。)

4

1 回答 1

1

我使用 SymPy 和 astropy.units 制作了一个名为 SymDim(符号维度分析)的python执行此操作。

安装 SymDim(也将安装 SymPy、Astropy 和 num2tex)

pip install SymDim

以下示例可以在 Jupyter 笔记本中运行。 第一个用例:我知道光速但我还不知道我需要多少能量,只是想看看单位m是什么:

E = S('E', u.J) # energy in Joules ('J')
c = S('c', u.m/u.s, 3.0e8) # speed of light: 3.0e8 m/s
m = S('m') # I don't know the units yet!
E.equals(m*c**2)
m = E.solve_for(m)[0]  # solve returns a list of possible solutions
display(m)

在此处输入图像描述

m以公斤为单位!现在我想看看有多少质量相当于 9000 焦耳的能量:

E = S('E', u.J, 9000) # energy
m = S('m') # I don't know the units or the value
E.equals(m*c**2)
m = E.solve_for(m)[0]
display(m)

在此处输入图像描述

这就是我想要的!你也可以做一些疯狂的事情,比如:

x = S('x', u.m, 5.0)
L = S('L', u.m, 3.0)
Zw = S('Z_w')
T0 = S('T_0', u.K, 300.0)
T0.equals(Zw**(x/L-S(1)/S(2))) # enclose '1' and '2' in Sympint so python doesn't evaluate them 1/2 as 0.5
display(T0)
# now solve for Zw, whatever that is
Zw = T0.solve_for(Zw)[0]
display(Zw) # good to know that Zw has units of Kelvin^(6/7)!

在此处输入图像描述

免责声明:

  1. 有些部分很笨拙
  2. 有时你不能重用一个变量,你需要重新定义它,一旦它执行了它的equals()方法。
  3. 我仍然需要更新 GitHub 上的文档。

请在https://github.com/AndrewChap/symdim提交错误/请求

于 2019-01-14T22:31:22.917 回答