问题描述
我已将函数 newton 定义为牛顿方法的实现,以求实值函数和向量值函数的根。
问题在于,创建的序列在每一步都被包含在一个额外的 [] 中。
为什么会发生这种情况,如何通过更改牛顿函数定义来避免这种情况?
这是我的输出序列:
x_1 = [[4.66097544]]
x_2 = [[[2.76124695]]]
x_3 = [[[[3.14624513]]]]
x_4 = [[[[[3.14159265]]]]]
这是我的代码:
from math import exp
import numpy as np
from numpy import array
from numpy.linalg import norm
from numpy import sin,cos,pi
def newton (F,DF,x0,eps,K):
x = x0 - np.linalg.inv(DF(x0))*F(x0)
k=1
print("x_",end="")
print(k,end="")
print(" = ",end="")
print(x)
print("( ||F(x)|| = ",end="")
print(norm(F(x)),end=" )\n")
while (norm(F(x)) > eps) and (k<=K):
x = x - np.linalg.inv(DF(x))*F(x)
k += 1
print("x_",end="")
print(k,end="")
print(" = ",end="")
print(x)
print("( ||F(x)|| = ",end="")
print(norm(F(x)),end=" )\n")
return x,k
F = lambda y: cos(y/2)
DF = lambda y: array([-sin(y/2)/2])
x,k = newton(F,array([1.]),1e-8,100)
非常感谢任何帮助或评论。谢谢!
解决方法
问题在于 DF 函数,它总是将参数返回到一个数组中。因此,您正在传递数组,它将在另一个数组中返回该数组。如果我理解您的代码,您可以为 DF 函数和 linalg.inv 调用删除该数组,只需操作您的 lambda 函数以接受来自数组的参数:
看看这是否符合您的要求:
from math import exp
import numpy as np
from numpy import array
from numpy.linalg import norm
from numpy import sin,cos,pi
def newton (F,DF,x0,eps,K):
x = x0 - F(x0)/DF(x0)
k=1
print("x_",end="")
print(k,end="")
print(" = ",end="")
print(x)
print("( ||F(x)|| = ",end="")
print(norm(F(x)),end=" )\n")
while (norm(F(x)) > eps) and (k<=K):
x = x - DF(x)*F(x)
k += 1
print("x_",end="")
print(k,end="")
print(" = ",end="")
print(x)
print("( ||F(x)|| = ",end="")
print(norm(F(x)),end=" )\n")
return x,k
F = lambda y: cos(y[0]/2)
DF = lambda y: -sin(y[0]/2)/2
x,k = newton(F,array([1]),1e-8,100)