【问题标题】:How can I check to see the number of iterations Newton's method takes to run?如何查看牛顿法运行的迭代次数?
【发布时间】:2012-03-10 01:42:46
【问题描述】:

所以基本上我想获取我的牛顿法找到根所需的迭代次数,然后将这个数字应用到我的配色方案中,使迭代次数越长,颜色越深,并且越少,颜色越饱满。

这是我的代码

from numpy import *
import pylab as pl
def myffp(x):
    return x**3 - 1, 3*(x**2)    
def newton( ffp, x, nits):
    for i in range(nits):
        #print i,x
        f,fp = ffp(x)
        x = x - f/fp
    return x    
q = sqrt(3)/2
def leggo(xmin=-1,xmax=1,jmin=-1,jmax=1,pts=1000,nits=30):
    x = linspace(xmin, xmax, pts)
    y = linspace(jmin, jmax, pts)*complex(0,1)
    x1,y1 = meshgrid(x,y)                   
    n = newton(myffp,x1+y1,nits)                  #**here is where i wanna see the number of iterations newton's method takes to find my root** 
    r1 = complex(1,0)  
    r2 = complex(-.5, q)
    r3 = complex(-.5,-q)
    data = zeros((pts,pts,3))   
    data[:,:,0] = abs(n-r1)         #**and apply it here**
    data[:,:,2] = abs(n-r2)
    data[:,:,1] = abs(n-r3)
    pl.show(pl.imshow(data))    
leggo() 

主要问题是找到迭代次数,然后我可以弄清楚如何将其应用于使颜色变暗,但现在它只是找到通过牛顿方法运行的每个值所需的迭代次数。

【问题讨论】:

  • Kevin:您似乎不确定如何接受对您的 SO 问题的回答。当您不熟悉 SO 时,这很简单,但并不那么明显。操作方法如下:如果您发现某个答案对您有帮助,则将鼠标移到该答案的左上角(答案“分数”出现在两个灰色三角形之间)。当您将鼠标悬停在乐谱上时,您将看到“检查”的轮廓。单击该复选标记以“接受”该答案。然后,您将看到答题者的得分为绿色,并且您的得分增加了 +2 分。
  • 我不是很满意?他们都没有真正回答我的问题。它们绝对是可靠的答案,但我正在寻找使用公差的东西,并停止牛顿方法并最终返回停止该方法所需的迭代次数。你道格的一个答案(带有 eps 和旧 x)看起来很有希望,但我无法将它实现到我的代码中。

标签: python numpy matplotlib


【解决方案1】:

也许最简单的方法是重构您的 newton 函数,以便它跟踪总迭代,然后返回它(当然还有结果),例如,

def newton( ffp, x, nits):
    c = 0                   # initialize iteration counter
    for i in range(nits):
        c += 1              # increment counter for each iteration 
        f, fp = ffp(x)
        x = x - f/fp
    return x, c             # return the counter when the function is called

所以在您的代码主体中,更改您对 newton 的调用,如下所示:

res, tot_iter = newton(myffp, x, nits)

最后一次调用 newton 的迭代次数存储在 tot_iter


顺便说一句,您对牛顿法的实现似乎不完整。

例如,它缺少针对某些收敛标准的测试。

这是一个在 python 中有效的简单实现:

def newtons_method(x_init, fn, max_iter=100):
    """
    returns: approx. val of root of the function passed in, fn;
    pass in: x_init, initial value for the root; 
    max_iter, total iteration count not exceeded;
    fn, a function of the form: 
    def f(x): return x**3 - 2*x
    """
    x = x_init
    eps = .0001
    # set initial value different from x_init so at lesat 1 loop
    x_old = x + 10 * eps        
    step = .1
    c = 0
    # (x - x_old) is convergence criterion
    while (abs(x - x_old) > eps) and (c < max_iter):
        c += 1
        fval = fn(x)
        dfdx = (fn(x + step)) - fn(x) / step
        x_old = x
        x = x_old - fval / dfdx
    return x, c

【讨论】:

    【解决方案2】:

    您当前用于newton() 的代码具有固定的迭代次数(nits - 以 30 的形式传入),因此结果会有些琐碎且无趣。

    您似乎正在尝试生成牛顿分形 - 您尝试使用的方法不正确;典型的着色模式是基于函数的输出,而不是迭代次数。完整说明请参见the Wikipedia article

    【讨论】:

    • 好吧,我知道你在说什么。我只是想看看我是否可以获得迭代次数以到达根。示例 我有一个起点 x,或者在我的代码的情况下,x1+y1,我想知道牛顿方法需要多少次迭代才能到达所需的根。无论如何,该程序都会运行 30 次迭代,但我只是想看看我是否能以某种方式获取获得最终结果所需的数字,然后它会再次返回该结果,比如 20 次
    • 除了少数幸运的情况外,它永远不会。每次迭代都会越来越接近(希望如此!)。
    • 这有点晚了,但你是对的 - @duskwuff - 当你说他每次调用都会得到固定数量的迭代时,这很无趣。你说迭代次数不会产生分形是不正确的。它确实会产生可爱的分形!
    • @mrKelley:如果迭代次数始终为 30,并且您绘制每个点的迭代次数……它们都将是 30。正如我所指出的,牛顿分形是通过绘制算法收敛到的值,而不是到达那里需要多长时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2015-04-26
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多