2017-04-23 50 views
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> 

這是什麼意思?它不應該返回一個數字嗎?爲什麼我的返回值中有字母?

回答

1

您正在使用lambda函數返回函數而不是數字。

簡單的返回:

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