Python:Gauss-Newton方法仅适用于第一次迭代
我试图用高斯-牛顿法在Python中找到n个圆的近交点。这里的目标是,当给定点(x1,y1),(x2,y2),…,(xn,yn)和半径R1,R2,…,Rn时,使用高斯-牛顿法寻找到n个圆的距离平方和最小的点 这是一种迭代方法,我们从初始向量v0=[0,0]开始。第一次迭代完全正确,但随后的迭代是不正确的。我在代码中找不到错误: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,
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
数据类型不会增加精度