【发布时间】:2020-10-06 22:54:13
【问题描述】:
我有以下代码,我需要在其中求解表达式以找到根。需要求解omega的表达式。
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: cannot create mpf from 0.005Iomega
编辑 1 - 我尝试根据 cmets 实施不同的方法。第一种方法是使用 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'
如何更正程序?请向我建议可以产生正确结果的方法。
【问题讨论】:
-
如果使用
mpmath.findroot为什么在lambdify中使用scipy/numpy? -
您谈到了两个不同的错误,
mpf from '0.005/omega'和exponential function。我只收到'mpc' object has no attribute 'exp'错误。 -
坚持使用 sympy 或使用 mpmath。虽然 sympy 使用 mpmath 如果 你 试图混合它们,你将很难正确地做到这一点。 SymPy 可以用solve/solveset很好地求解这个方程
-
@oscar benjamin 我尝试使用 Sympy 的求解集,但如果我在实际域中求解,它会返回一个空集。如果我在虚域中求解,我会收到此错误。 " ImageSet(Lambda(_n, -200.0*I*(I*(2*_n*pi + pi) + 0.693147180559945)), 整数) "
-
这不是正确的答案吗?请注意,
solve将返回一个表达式列表,如果这是您想要的。
标签: python python-3.x sympy mpmath