0

我的任务是编写一个计算方法收敛速度的程序。我不得不使用牛顿法来近似根。这部分代码没问题,运行良好,但我会加入它。

x0 : start value

F: function

DF: jacobi matrix

tol : tolerance rate of the approximation. If it is reached the loop shall be stopped --> that`s why I calculate with count

maxit: maximum iterations

重要的是我试图为任何 n 维度做这件事。

def konv(x0, F, FD, tol, maxit):

#set counter of the iterations to zero and define an array for the values of x in the iteration 

    count = 0
    x = np.zeros([np.shape(x0)[0], maxit])

    x[:,0] = x0

#fill the array with the values given by the formula x_k+1 = x_k - ((DF(x_k))^(-1)*F(x_k))
#((DF(x_k))^(-1)*F(x_k)) = s

    for i in range(maxit):
        count = 1+i

        s =  np.linalg.solve(DF(x[..., i]), F(x[..., i]))
        x[..., i+1] = x[..., i] - s

        if np.all((np.linalg.norm(x[..., i+1]-x[..., i]) < tol*np.linalg.norm(x[..., i]))):
            break
#define an array which stores the errors
    e = np.zeros(count)

    for i in range(count):
        e[i] = np.linalg.norm(x[..., i] - x[..., count])

#return the rate of convergence

    return lambda e : np.log(e[2:]/e[1:-1]/np.log(e[1:-1])/e[:-2])

主要部分:

if __name__ == "__main__":


    p = konv(x0, F, DF, tol, maxit)
    print(p)

我得到的结果是:

[ 0.39384945  0.03214274] 6
<function konv.<locals>.<lambda> at 0x0000023312A82268>

这是什么意思?它不应该返回一个数字吗?为什么我的返回值中有字母?

4

1 回答 1

1

您正在使用 lambda 函数返回一个函数而不是一个数字。

只需返回:

return np.log(e[2:]/e[1:-1]/np.log(e[1:-1])/e[:-2])
于 2017-06-02T08:23:50.240 回答