Python:Gauss-Newton方法仅适用于第一次迭代

Python:Gauss-Newton方法仅适用于第一次迭代,python,numpy,scipy,numerical-methods,Python,Numpy,Scipy,Numerical Methods,我试图用高斯-牛顿法在Python中找到n个圆的近交点。这里的目标是,当给定点(x1,y1),(x2,y2),…,(xn,yn)和半径R1,R2,…,Rn时,使用高斯-牛顿法寻找到n个圆的距离平方和最小的点 这是一种迭代方法,我们从初始向量v0=[0,0]开始。第一次迭代完全正确,但随后的迭代是不正确的。我在代码中找不到错误: solutions = [] rmse = [] vk = [[0], [0]] # initial is set here x = [0, 1, 0] y = [1,

我试图用高斯-牛顿法在Python中找到n个圆的近交点。这里的目标是,当给定点(x1,y1),(x2,y2),…,(xn,yn)和半径R1,R2,…,Rn时,使用高斯-牛顿法寻找到n个圆的距离平方和最小的点

这是一种迭代方法,我们从初始向量v0=[0,0]开始。第一次迭代完全正确,但随后的迭代是不正确的。我在代码中找不到错误:

solutions = []
rmse = []

vk = [[0], [0]] # initial is set here
x = [0, 1, 0]
y = [1, 1, -1]
radii = [1, 1, 1]

iterations = 3

base_str_x = "(x _xi) / sqrt((x xi)^2 + (y yi)^2)"
base_str_y = "(y _yi) / sqrt((x xi)^2 + (y yi)^2)"
base_str_rk = "sqrt((x xi)^2 + (y yi)^2) Ri K"


it = 0
while it < iterations:
    i = 0
    A = []
    while i < len(x):
        A.append(["", ""])
        A0_str = base_str_x.replace(" xi", "%+f" % (x[i]))
        A0_str = A0_str.replace(" yi", "%+f" % (y[i]))
        A0_str = A0_str.replace("_xi", "%+f" % (x[i] * -1))
        A[i][0] = float(f(vk[0][0], A0_str, vk[1][0]))
        A1_str = base_str_y.replace(" xi", "%+f" % (x[i]))
        A1_str = A1_str.replace(" yi", "%+f" % (y[i]))
        A1_str = A1_str.replace("_yi", "%+f" % (y[i] * -1))
        A[i][1] = float(f(vk[0][0], A1_str, vk[1][0]))
        i += 1

    i = 0
    rk = []
    while i < len(x):
        rk.append([""])
        r0_str = base_str_rk.replace(" xi", "%+f" % (x[i]))
        r0_str = r0_str.replace(" yi", "%+f" % (y[i]))
        r0_str = r0_str.replace("Ri", "%+f" % (radii[i] * -1))
        rk[i][0] = float(f(vk[0][0], r0_str, vk[1][0]))
        i += 1

    lhs = np.matmul(map(list, zip(*A)), A)
    rhs = -np.matmul(map(list, zip(*A)), rk)
    vk = np.matmul(np.linalg.inv(lhs), rhs)
    solutions.append(vk)
solutions=[]
rmse=[]
vk=[[0],[0]]#此处设置初始值
x=[0,1,0]
y=[1,1,-1]
半径=[1,1,1]
迭代次数=3
基本结构=“(x_xi)/sqrt((x xi)^2+(y yi)^2)”
base_str_y=“(y_yi)/sqrt((x xi)^2+(y yi)^2)”
base_str_rk=“sqrt((x xi)^2+(y yi)^2)Ri K”
它=0
虽然它是:
i=0
A=[]
而i
此代码计算A=Dr(x,y),其定义如下:

然后解出方程:

对于
vk


函数
f
是一个“通用函数”,用于计算
a
的每个元素。如果您能找到第一次迭代之后的后续迭代不正确的原因,我们将不胜感激。

出现这种情况的原因有两个:

  • 括号内的符号是错误的。为了说明这一点,在每个术语内将
    x[1]
    乘以
    -1
    。例如
    A0_str=A0_str.replace(“yi”、“%+f”%(y[i]*-1))
  • 错误传播。结果矩阵给出的结果精确到小数位数小于后续迭代中转换为
    float
  • 第一个问题很容易解决,第二个问题却不能。
    matmul
    不支持使用
    Decimal
    ,并给出
    TypeError
    float64
    float128
    数据类型不会增加精度