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

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

  • 简化一些物理量和物理常数的代数方程
  • 执行量纲分析以确保我的方程式正确无误
  • 通过插入物理量的值来评估方程式
  • 下面是我对这个问题的解答,在这里我想找到与给定能量相等的质量。(我在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
    的单位,因为它是一个物理常数,我使用的是国际单位制(这似乎是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中是否有一个很好的工作流程,用于处理符号方程和沿途检查单元,然后最终计算这些方程?如果不是,还有好的选择吗?(我尝试了一些替代方案,最有希望的是,但它似乎缺乏符号支持。)

    我制作了一个名为SymDimSymbolicDimensional 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我会试试的。。。