我试图在某些数据中加上一个圆圈。这需要在数值上求解一组三个非线性联立方程(参见this document的全最小二乘法)。
对我来说,似乎IDL提供的NEWTON
功能适合解决这个问题。 NEWTON
需要一个函数的名称,该函数将为自变量的特定值计算方程式系统的值:
FUNCTION newtfunction,X
RETURN, [Some function of X, Some other function of X]
END
虽然这很好,但它要求方程系统的所有参数(在这种情况下是数据点集)在newtfunction
中进行硬编码。如果只有一个数据集需要解决,这很好,但是我有数千个数据集,并且手动定义一个新函数不是一个选项。
有解决方法吗?是否可以在IDL中以编程方式定义函数,或者甚至以其他方式传递数据集?
答案 0 :(得分:0)
我不是这方面的专家,但如果我要解决这个问题,我会做以下事情。而不是求解一个由3个非线性方程组成的系统来找到三个未知数(即xc
,yc
和r
),我将使用优化例程通过启动收敛到解决方案初步猜测。对于这种最陡下降,可以使用共轭梯度或任何其他多变量优化方法。
我很快就找出了问题的最小二乘方程(请在使用前检查):
F = (sum_{i=1}^{N} (xc^2 - 2 xi xc + xi^2 + yc^2 - 2 yi yc + yi^2 - r^2)^2)
计算此函数的梯度非常简单,因为它只是求和,因此编写最陡的下降代码将是微不足道的,以计算xc
,yc
和r
我希望它有所帮助。
答案 1 :(得分:0)
通常在这些类型的函数中使用COMMON
块来传递不属于数字例程的调用签名的其他参数,缓存值等。