Python 使用mpmath和sympy模块时由于指数函数而导致的错误

Python 使用mpmath和sympy模块时由于指数函数而导致的错误,python,python-3.x,sympy,mpmath,Python,Python 3.x,Sympy,Mpmath,我有下面的代码,我需要解一个表达式来找到根。需要为ω求解表达式 import numpy as np from sympy import Symbol,lambdify import scipy from mpmath import findroot, exp eta = 1.5 tau = 5 /1000 omega = Symbol("omega") Tf = exp(1j * omega * tau) symFun = 1 + Tf * (eta - 1) deno

我有下面的代码,我需要解一个表达式来找到根。需要为ω求解表达式

import numpy as np
from sympy import Symbol,lambdify
import scipy
from mpmath import findroot, exp
eta = 1.5 
tau = 5 /1000
omega = Symbol("omega")
Tf = exp(1j * omega * tau)
symFun = 1 + Tf * (eta - 1) 
denom = lambdify((omega), symFun, "scipy")
Tf_high = 1j * 2 * np.pi * 1000 * tau
sol = findroot(denom, [0+1j,Tf_high])
程序出错,我无法更正。错误为:TypeError:无法从0.005Iomega创建mpf

编辑1-我尝试根据评论实施不同的方法。第一种方法是使用sympy.solveset模块。第二种方法是使用scipy.optimize中的fsolve。两者都没有给出正确的输出

为清楚起见,我将相关代码复制到每种方法中,并将其输出

方法1-同感 方法2 Scipy
如何更正程序?请给我推荐能给出正确结果的方法。

Symphy是一个计算机代数系统,它能像人类一样解方程。SciPy使用数值优化。如果你想要所有的解决方案,我建议你选择SymPy。如果你想要一个解决方案,我建议你选择SciPy

方法1-同感 作为开发人员,Symphy提供的解决方案将更加“互动”。但它几乎一直都是完全正确的

来自sympy导入的
*
预计到达时间=S(3)/2
tau=S(5)/1000
ω=符号(“ω”)
n=1
Tf=exp(I*omega*tau)
denom=1+Tf*(eta-1)
sol=溶解集(单位:分母,ω)
打印(sol)
给予

ImageSet(Lambda(_n, -200*I*(I*(2*_n*pi + pi) + log(2))), Integers)
这是真正的数学解

注意我是如何在除法整数之前将
S
放在整数周围的。在Python中对整数进行除法时,由于使用浮点数,因此会丢失精度。将其转换为SymPy对象将保持所有准确性

由于我们知道整数上有一个
ImageSet
,我们可以开始列出一些解决方案:

范围(-3,3)内的n的
:
印刷品(复合物(sol.lamda(n)))

(-3141.5926535897934-138.62943611198907j)
(-1884.9555921538758-138.62943611198907j)
(-628.3185307179587-138.62943611198907j)
(628.3185307179587-138.62943611198907j)
(1884.9555921538758-138.62943611198907j)
(3141.5926535897934-138.62943611198907j)
根据一些经验,您可以将其自动化,这样无论
solveset
返回的输出类型如何,整个程序都只返回一个解决方案

方法2-SciPy SciPy提供的解决方案将更加自动化。你永远不会有一个完美的答案,不同的初始条件选择可能不会一直收敛

将numpy导入为np
从scipy.optimize导入根目录
预计到达时间=1.5
tau=5/1000
n=1
def(ω:元组):
omega_real,omega_imag=omega
欧米茄:复数=欧米茄实数+欧米茄图像*1j
结果:复合物=1+(eta-1)*(n*np.exp(1j*omega*tau))
返回result.real,result.imag
sol=根(f,[100100])
打印(sol)
打印(sol.x[0]+sol.x[1]*1j)

(-3141.5926535897934-138.62943611198907j)
(-1884.9555921538758-138.62943611198907j)
(-628.3185307179587-138.62943611198907j)
(628.3185307179587-138.62943611198907j)
(1884.9555921538758-138.62943611198907j)
(3141.5926535897934-138.62943611198907j)
fjac:array([[0.00932264,0.99995654],
[-0.99995654,  0.00932264]])
乐趣:阵列([-2.13074003e-12,-8.86389816e-12])
消息:“解决方案已聚合。”
nfev:30
qtf:数组([2.96274855e-09,-6.82780898e-10])
r:数组([-0.00520194,-0.00085702,-0.00479143])
现状:1
成功:真的
x:数组([628.31853072,-138.62943611])
(628.3185307197314-138.62943611241522j)

看来这是辛普森找到的解决方案之一。所以我们必须做一些正确的事情。请注意,有许多初始值不收敛,例如,
sol=root(f[1,1])
如果使用
mpmath.findroot
为什么要在
lambdify
中使用
scipy/numpy
呢?您谈到了两个不同的错误,
mpf来自'0.005/omega'
,以及
指数函数。我只得到“mpc”对象没有属性“exp”的错误。只需坚持使用sympy或mpmath即可。虽然sympy使用mpmath,但如果您尝试将它们混合在一起,您将很难正确执行。Symphy可以用solve很好地解这个方程/solveset@oscarbenjamin我尝试使用Symphy中的solveset,但如果我在实域中求解,它将返回一个空集。如果我在虚域中求解,我会得到这个错误。“图像集(λ(_n,-200.0*I*(I*(2*_n*pi+pi)+0.693147180559945)),整数)”这不是正确答案吗?请注意,
solve
将返回一个表达式列表(如果您需要的话)。
(-3141.5926535897934-138.62943611198907j)
(-1884.9555921538758-138.62943611198907j)
(-628.3185307179587-138.62943611198907j)
(628.3185307179587-138.62943611198907j)
(1884.9555921538758-138.62943611198907j)
(3141.5926535897934-138.62943611198907j)