While 循环在每一步添加额外的 []

问题描述

我已将函数 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)