如何将 Sympy 解决方案转换为可与不确定性包一起使用的形式? [Python]

How to convert a Sympy solution to a form that can be used with the uncertainties package? [Python]

我有以下任务要完成:

因为是德语,这里有一个快速翻译:

我希望以一种方式转换给定的方程式,然后我可以填写给定的常数(以及所有未使用 scipy.constants 给出的内容),同时仅使用来自“不确定性”的 ufloats包裹。我到目前为止是这样的:

import  scipy.constants       as      sc
from    uncertainties         import  ufloat
import  uncertainties.umath   as      um
import  sympy                 as      sp

a, G, m, M, T =sp.symbols("a G m M T")

k3 = sp.Eq(T**2 / a**3 , 4*sp.pi**2/(G*(m+M)))

umlaufzeit = sp.solve(k3, T)[1]

因此变量“umlaufzeit”(抱歉,它是德语...)保存给定方程的解,用于 T 的正表达式。唯一的问题是它的类型为“sympy.core.mul.Mul”这对我没有帮助。我可以使用 Str(umlaufzeit) 方法将它转换为字符串,它以 "2*pi*sqrt(a**3/(G*(M + m)))".

的形式给出

但我还是遇到了问题,我不能按我想要的方式使用它,首先它仍然只是一个字符串,我无法对其进行任何操作,其次,为了能够计算不确定性包,我只需要使用 uncertainties.math 包中的函数,例如“um.sqrt(args)”而不是任何其他包中的常规 sqrt(args)

简而言之:

如何将 sympy.solve(<equation>, <parameter>) 的 return 值转换为可由“不确定性”包处理的形式?

您需要做的是将符号表达式转换为稍后可用于数值计算的 lambda 函数。我们可以使用 lambdify 函数来做到这一点(请阅读它的文档)。

由于需要使用uncertainties.umath模块进行数值评估,我们还需要告知lambdify该模块。以下是您的操作方法:

import uncertainties.umath   as      um
from sympy import *
a, G, m, M, T = symbols("a G m M T")
k3 = Eq(T**2 / a**3 , 4* pi**2/(G*(m+M)))
sol = solve(k3, T)[1]
f = lambdify([a, G, m, M], sol, modules=um)

# numerical values
_M = ufloat(1.990, 0.005) * 1e30
_m = ufloat(5.970, 0.005) * 1e24
_G = ufloat(6.6743, 0.00015) * 1e-11
_a = 149.6e09
# numerical evaluation
f(_a, _G, _m, _M)
# out: 31546211.244203605+/-39632.38513830719