我正在尝试利用 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)。我尝试将变量限制为真实变量,但这也无济于事。预先感谢!
你能用误差公式的符号传播来求出结果吗?
# 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