如何用Python求解复函数根?代码报错问题排查
问题:复函数连分式方程求根报错排查
我正在处理以omega为变量的复函数,已通过以下代码定义alpha、beta、gamma及ContinuedFrac函数:
from sympy import * def alpha(n, rho, l): return n**2 + (2*rho + 2)*n + 2*rho + 1 def beta(n, rho, l): return -(2*n**2 + (8*rho + 2)*n + 8*rho**2 + 4*rho + l*(l+1) -3) def gamma(n, rho, l): return n**2 + 4*rho*n + 4*rho**2 - 4 def ContinuedFrac(n, rho, l): cf = 0 for i in reversed(range(1,n+1)): cf = cf + beta(i, rho, l)/alpha(i, rho, l) cf = (-gamma(i, rho, l)/alpha(i, rho, l)) / cf return cf
我的需求是:找到满足当n=3、rho=i*omega、l=3时,ContinuedFrac等于beta(0, i*omega, 3)/alpha(0, i*omega, 3)的根。尝试使用mpmath库的findroot函数编写了如下代码,但运行报错,期望得到类似(1.198 - 0.185i)的结果:
from sympy import * import mpmath as mp omega = symbols("ω") f = ContinuedFrac(1, i*omega, 3) + beta(0, i*omega, 3)/alpha(0, I*omega, 3) findroot(f, 2-0.5j)
错误原因与修正方案
核心问题点
- 符号与数值函数不兼容:
mpmath.findroot是数值求解工具,需要传入可直接计算数值的函数,但你用Sympy的symbols创建了符号变量ω,导致符号表达式无法被mpmath解析计算。 - 参数与需求不符:需求中n=3,但代码里调用
ContinuedFrac(1, ...),n参数错误。 - 虚数单位混用:Sympy中虚数单位是大写
I,但代码里混用了小写i(会被视为未定义变量),mpmath中虚数单位应为1j。 - 方程逻辑错误:需求是
ContinuedFrac(...) = beta(0,...)/alpha(0,...),对应方程应为ContinuedFrac(...) - beta(0,...)/alpha(0,...) = 0,你写成了加号,符号错误。
修正后的代码
import mpmath as mp def alpha(n, rho, l): return n**2 + (2*rho + 2)*n + 2*rho + 1 def beta(n, rho, l): return -(2*n**2 + (8*rho + 2)*n + 8*rho**2 + 4*rho + l*(l+1) - 3) def gamma(n, rho, l): return n**2 + 4*rho*n + 4*rho**2 - 4 def ContinuedFrac(n, rho, l): cf = 0 for i in reversed(range(1, n+1)): cf = cf + beta(i, rho, l)/alpha(i, rho, l) cf = (-gamma(i, rho, l)/alpha(i, rho, l)) / cf return cf # 定义数值目标函数:输入omega(复数),返回方程差值(等于0时为根) def target_func(omega): rho = 1j * omega # mpmath使用1j表示虚数单位 lhs = ContinuedFrac(3, rho, 3) rhs = beta(0, rho, 3)/alpha(0, rho, 3) return lhs - rhs # 调用findroot求解,初始值2-0.5j result = mp.findroot(target_func, 2 - 0.5j) print(result)
运行后即可得到符合预期的复数根。
内容的提问来源于stack exchange,提问作者Ramos
相关产品推荐
相关产品推荐

