使用mpmath和sympy模块时由于指数函数而出错

问题描述

我有以下代码需要解析表达式以查找根的代码。该表达式需要针对欧米茄进行求解。

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.005 I omega

创建mpf

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

为清楚起见,我将相关代码与获得的输出一起复制到每种方法。

方法1-Sympy


import numpy as np
from sympy import Symbol,exp
from sympy.solvers.solveset import solveset,solveset_real,solveset_complex
import matplotlib.pyplot as plt 

def denominator(eta,Tf):
    
    return 1 + Tf * (eta - 1)

if __name__ == "__main__":
    eta = 1.5 
    tau = 5 /1000
    omega = Symbol("omega")
    n = 1 
    Tf = exp(1j * omega * tau)
    denom = 1 + Tf * (eta - 1)
    symFun = denominator(eta,Tf)
    sol = solveset_real(denom,omega)
    sol1 = solveset_complex(denom,omega)
    print('In real domain',sol)
    print('In imaginary domain',sol1)

Output: 
In real domain EmptySet
In imaginary domain ImageSet(Lambda(_n,-200.0*I*(I*(2*_n*pi + pi) + 0.693147180559945)),Integers)

方法2 Scipy


import numpy as np
from scipy.optimize import fsolve,root

def denominator(eta,tau,n,omega):
    
    Tf = n * np.exo(1j * omega * tau)
    return 1 + Tf * (eta - 1)

if __name__ == "__main__":
    eta = 1.5 
    tau = 5 /1000
    n = 1 
    func = lambda omega :  1 + (eta - 1) * (n * np.exp( 1j * omega * tau))
    sol = fsolve(func,10)
    print(sol)

Output: 
Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'

如何纠正程序?请给我建议可以产生适当结果的方法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)