牛顿拉夫森方法迭代函数

问题描述

我一直在尝试编写Newton Raphson的代码,但是我遇到了一个可能是微不足道的问题,但是我似乎无法解决这个问题。我的代码如下:

# base packages 
import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
from sympy import *

'''

logL_Vec: empty vector to plot the log-l. function
dervL_vec: to plot the first derv of the log-l. function
x_vec: data points we're summing over'
n: summing over n


'''
logL_vec = []
dervL_vec = []
x_vec = [0.72,5.50,-2.21,-0.35,-0.67,0.16,23.64,1.00,1.06,-495.81,-1.98,37.72]
n= len(x_vec)

def logL(x,n,θ):
    sum_vec = [np.log(1 + (x[i]- θ)**2) for i in range(n)]
    return -n*np.log(np.pi) - np.sum(sum_vec)

def dervL(x,θ):
    sum_vec = [2*(x[i] - θ)/ (1+(x[i] - θ)**2) for i in range(n)]
    return np.sum(sum_vec)

def raphson(df,df2,θ1,tol,maxiter):
    θ_new = θ1
    for i in range(maxiter):
        θ_new = θ1  + df/df2
        if abs(θ_new - θ1) < tol: break
        θ1 = θ_new
    return θ_new,i



我认为代码中的主要问题是如何以thess作为来自raphson函数的输入的方式对df函数进行编码。我正在这样做

raphson(logL(x_vec,θ1),dervL(x_vec,x_vec,-0.6,0.0001,100)


Traceback (most recent call last):

  File "<ipython-input-2-49b17ffc14c6>",line 1,in <module>
    
raphson(logL(x_vec,100)

NameError: name 'θ1' is not defined

我尝试了其他方法,但是我迷失了如何像raphson方法所建议的那样让两个df函数在新的theta上迭代。

当我做这样的事情时:

maxiter = 10000
θ1 = -0.5
tol = 0.0001
for i in range(maxiter):
    θ_new = θ1  + 0.01*dervL(x_vec,θ1)
    if abs(θ_new - θ1) < tol: 
        break
    else:
        θ1 = θ_new


它可以工作,但是如果我可以将其归纳为一个函数,那就太好了。 (请注意,我正在执行梯度上升,但主要思路是我想对此进行概括) / Y

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...