numpy 为什么牛顿法没有返回我的域中所有可能的根?

ryevplcw  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(163)

sin(x)上运行以下代码:

import numpy as np

def newton(z0,f,fp,MAX_IT):
    cnt = 0
    TOL = 1e-10
    z = z0
    condition = fp(z) != 0
    a = z[condition]
    for i in range(MAX_IT):
        dz = f(a)/fp(a)
        adz = np.absolute(dz)
        if np.all(adz < TOL) :
            return a
        cnt += 1
        a -= dz
    return False

它工作正常,但有时在我的域中不返回任何根。如果我将最小值和最大值限制为(-2,2),它将返回+/-pi,这超出了我的域。但是如果我上升到(-10,10),我将得到+/-3*pi,没有其他的。我的功能有什么问题?我已经去掉了所有的不连续性,所以这不是问题所在。为什么newton不返回我的域中的复数可以收敛到的所有根?
编辑:我正在尝试创建牛顿分形,我看到的唯一一个由sin生成的分形使用了根列表。我试图绕过这个问题,但一位评论者认为这是不可能的,因为当sin是我的函数时,newton不能保证收敛。我需要一个根列表来解决这个问题吗?

rekjcdws

rekjcdws1#

def newton(z0, f, fp, MAX_IT, TOL=1e-10):
    z = z0
    roots = []
    
    for _ in range(MAX_IT):
        dz = f(z) / fp(z)
        z -= dz
        
        if np.all(np.absolute(dz) < TOL):
            roots.append(z)
            # Uncomment the line below if you want to find multiple roots
            # z = z0 + 0.01  # Update the initial guess for finding another root
        
    return roots

这是代码的修改版本。希望这有用。
通过这些修改,您应该能够使用newton函数在指定的域中查找多个根。请记住提供适当的初始猜测(z0),并确保函数f和fp针对您的特定问题正确定义。

相关问题