【问题标题】:How to do nonlinear complex root finding in Python如何在 Python 中进行非线性复根查找
【发布时间】:2013-02-19 05:23:47
【问题描述】:

我想对以下非线性方程进行根搜索,我在 Python 中进行,但它不起作用。我的代码在下面

from pylab import *
import scipy
import scipy.optimize

def z1(x,y):
    temp=1+1j+x+2*y;
    return temp

def z2(x,y):
    temp=-1j-2*x+sqrt(3)*y;
    return temp

def func(x):
    temp=[z1(x[0],x[1])-1.0/(1-1.0/(z2(x[0],x[1]))),1-2.0/(z2(x[0],x[1])-4.0/z1(x[0],x[1]))]
    return temp

result=scipy.optimize.fsolve(func,[1+1j,1+1j])

print result

当我运行它时,它显示错误:

---> 30 结果=scipy.optimize.fsolve(func,[1+1j,1+1j])

C:\Python27\lib\site-packages\scipy\optimize\minpack.py in fsolve(func, x0, args, fprime, full_output, col_deriv, xtol, maxfev, band, epsfcn, factor, diag)

123             maxfev = 200*(n + 1)

124         retval = _minpack._hybrd(func, x0, args, full_output, xtol,

--> 125 maxfev, ml, mu, epsfcn, factor, diag)

126     else:

127         _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n,n))

【问题讨论】:

  • 是复数单位“j”的原因,看来fsolve只能对实数方程求根并返回实数根??!

标签: python scipy mathematical-optimization


【解决方案1】:

fsolve 从 R^n -> R 中找到函数的零点。类似的函数 root 从 R^n -> R^m 中找到函数的零点。

看起来你正试图从 C^2 -> C^2 中找到函数的零点,据我所知 scipy.optimize 不直接支持 - 但你可以尝试从R^4 -> R^4 然后使用root。例如,类似于以下内容的内容:

def func_as_reals(x):
    r1, c1, r2, c2 = x
    a, b = func([complex(r1, c1), complex(r2, c2)])
    return [a.real, a.imag, b.real, b.imag]

应该可以,尽管直接在实数上执行它可能会快得多,而不是反复包装成复数和展开。

【讨论】:

  • 这只是我真正解决问题的一个极其简化的例子。真正的问题是一个 5000 深度的“类斐波那契”分数,但在 C^2 中,所以似乎没有希望将那个怪物重写为 R^4
  • 对了,为什么 .optimize 下没有 .root 呢?当我“标签”优化时。我可以找到 .fsolve 但没有 .root 。我用的是Python27,学术版
  • 你有什么版本的 scipy?正如链接文档所述,root 是 0.11 中的新功能;因为看起来你可能正在使用 EPD(因为没有 Python 的“学术版本”之类的东西),它可能仍然有一个旧版本。
  • 当然,一个点xf : R^n -> R^m iff || f(x) || = 0 的零。因此,您可以尝试 fsolve 使用类似于 func_as_reals 的函数,但改为返回 a.real**2 + a.imag**2 + b.real**2 + b.imag**2
【解决方案2】:

你可以试试 mpmath 的 findroot(sympy):

from mpmath import findroot

#Your code here

ans = findroot([z1,z2],(0,0))
print(ans)

返回:

[(-0.302169479251962 - 0.651084739625981j)]
[(-0.348915260374019 - 0.174457630187009j)]

这是您系统的解决方案。
Mpmath 是一个多精度库,因此它的例程通常较慢,但您可以尝试一下!

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 2019-09-18
    • 2014-03-17
    • 1970-01-01
    • 2017-11-29
    • 2012-10-14
    • 2011-04-11
    • 2017-02-15
    • 2022-08-04
    相关资源
    最近更新 更多