结合 Sympy 和 Uncertainties 包时限制为实际解决方案

问题描述 投票:0回答:1

我正在尝试利用 Sympy 求解方程,并结合不确定性来执行误差传播。然而,由于方程的性质,解的精确形式是复数,这在尝试获取数值解时会出现问题。

这是我的代码的 MWE:

from uncertainties import ufloat
import uncertainties.umath as um 
import sympy as sp
from sympy.utilities.lambdify import lambdify

inc, ratio = sp.symbols('inc ratio')
beta = sp.Symbol("beta")
eqn=sp.Eq(sp.cos(inc+beta)/sp.cos(inc-beta),ratio)
s = sp.solve(eqn,beta)[1]   # unsure if [0] or [1] is the best solution?
sol = lambdify([inc, ratio],s,modules=um) # necessary for integrating ufloat inputs as an option

i = ufloat(0.923, 0.1202)
r = ufloat(4.089, 0.1844)

b = sol(i,r) # here is the problem!!!

返回

TypeError: unsupported operand type(s) for *: 'complex' and 'AffineScalarFunc'

我的 s 和 help(sol) 输出是:

[-I*log(-(ratio*exp(2*I*inc) - 1)/(ratio - exp(2*I*inc)))/2,
 -I*log(-sqrt(-(ratio*exp(2*I*inc) - 1)/(ratio - exp(2*I*inc))))]

Help on function _lambdifygenerated in module uncertainties.umath:

_lambdifygenerated(inc, ratio)
    Created with lambdify. Signature:
    
    func(inc, ratio)
    
    Expression:
    
    [-I*log(-(ratio*exp(2*I*inc) - 1)/(ratio - exp(2*I*inc)))/2,...
    
    Source code:
    
    def _lambdifygenerated(inc, ratio):
        return [-1/2*1j*log(-(ratio*exp(2*1j*inc) - 1)/(ratio - exp(2*1j*inc))), -1j*log(-sqrt(-(ratio*exp(2*1j*inc) - 1)/(ratio - exp(2*1j*inc))))]
    
    
    Imported modules:

这个问题对于让两个包一起合作非常有帮助,但不幸的是并不能帮助解决我的特定问题。我知道方程有一个实数解(可能是模 2pi)。我尝试将变量限制为真实变量,但这也无济于事。预先感谢!

python sympy
1个回答
0
投票

你能用误差公式的符号传播来求出结果吗?

# your code then...
>>> from sympy import Symbol
u2=sum([j**2 for j in [s.diff(v)*Symbol('_'+v.name) for v in s.free_symbols]])
>>> reps = {inc: 0.923, _inc:.1202, ratio:4.089, _ratio:.1844}
>>> u2.subs(reps).n()
0.00905682394648684 + 7.79520792103195e-26*I
>>> sqrt(re(_))  # uncertainty
0.0951673470602540
>>> s.subs(reps).n()  # in this value
2.71100413740592
© www.soinside.com 2019 - 2024. All rights reserved.