Python SymPy中的量纲分析
我正在尝试使用来执行以下任务:Python SymPy中的量纲分析,python,sympy,pint,Python,Sympy,Pint,我正在尝试使用来执行以下任务: 简化一些物理量和物理常数的代数方程 执行量纲分析以确保我的方程式正确无误 通过插入物理量的值来评估方程式 下面是我对这个问题的解答,在这里我想找到与给定能量相等的质量。(我在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
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
的单位,因为它是一个物理常数,我使用的是国际单位制(这似乎是SymPy的默认单位)我想知道1焦耳能量中有多少质量,我想知道这个质量的单位。我将使用Quantity()
定义我的变量,然后在方程中再次设置它们,以便Symphy可以解出它:
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\u solve
中:
m_solve = solve(eq_E,m)[0]
display(m_solve)
现在,我能看看m_solve
有什么单位吗
print(m_solve.dimension)
AttributeError:“Mul”对象没有属性“dimension”
m_solve
的值是多少
print(m_solve.scale_factor)
AttributeError:“Mul”对象没有属性“scale\u factor”
什么是Mul
?如何获得数量
?更一般地说,Symphy中是否有一个很好的工作流程,用于处理符号方程和沿途检查单元,然后最终计算这些方程?如果不是,还有好的选择吗?(我尝试了一些替代方案,最有希望的是,但它似乎缺乏符号支持。)我制作了一个名为SymDim(SymbolicDimensional analysis)的python包,使用symphy和astropy.units来完成这项工作
使用安装SymDim(还将安装SymPy、Astropy和num2tex)
pip安装符号
以下示例可以在Jupyter笔记本中运行。
第一个用例:我知道光速,但我不知道我需要多少能量,只想看看单位m
:
E=S('E',u.J)#以焦耳('J'为单位的能量)
c=S('c',u.m/u.S,3.0e8)#光速:3.0e8 m/S
m=S('m')#我还不知道单位!
E.等于(m*c**2)
m=E.solve_for(m)[0]#solve返回可能的解决方案列表
显示器(米)
m
以千克为单位!现在我想看看有多少质量相当于9000焦耳的能量:
E=S('E',u.J,9000)#能量
m=S('m')#我不知道单位或数值
E.等于(m*c**2)
m=E.solve_表示(m)[0]
显示器(米)
这就是我想要的!你也可以做一些疯狂的事情,比如:
x=S('x',u.m,5.0)
L=S('L',单位m,3.0)
Zw=S('Z_w')
T0= S(‘Ty0’,英国K,300)
T0.equals(Zw**(x/L-S(1)/S(2))#将“1”和“2”括在Sympint中,以便python不会将它们的1/2计算为0.5
显示(T0)
#现在求解Zw,不管是什么
Zw=T0。求(Zw)[0]的_
显示(Zw)#很高兴知道Zw的单位是开尔文^(6/7)!
免责声明:
有些地方很模糊
有时您不能重用变量,而需要在变量执行其equals()
方法后重新定义它
我仍然需要更新GitHub上的文档
请在提交错误/请求。这是否已在
Symphy中实施?这似乎很重要!嘿,我尝试在python2环境中运行您的代码,但出现了一个错误:TypeError:super()至少接受一个参数(给定0)
这已修复为与python2兼容。如果您仍然想使用上次编辑之前发布的旧代码,请将super()
替换为super(Symbol,self)
,然后它应该可以与python2一起使用。看:你做了一个包裹真是太棒了。等我回到Sympy我会试试的。。。