我正在尝试对一些数据拟合一个圆圈。这需要数值求解一组三个非线性联立方程组(参见this document的完全最小二乘法)。
在我看来,IDL提供的NEWTON
函数很适合解决这个问题。NEWTON
需要一个函数的名称,该函数将为自变量的特定值计算方程系统的值:
FUNCTION newtfunction,X
RETURN, [Some function of X, Some other function of X]
END
虽然这很好用,但它要求方程系统的所有参数(在本例中是数据点的集合)都是在newtfunction
中硬编码的。如果只有一个数据集需要求解,这是很好的,但是我有数千个数据集,并且不能手动为每个数据集定义新函数。
有什么办法可以解决这个问题吗?是否可以在IDL中以编程方式定义函数,或者甚至以其他方式传递数据集?
发布于 2014-10-27 19:02:06
我不是这方面的专家,但如果我要解决这个问题,我会做以下事情。我不会求解一个由3个非线性方程组成的系统来寻找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
。
我希望它能帮上忙。
发布于 2014-10-28 02:19:17
通常在这些类型的函数中使用COMMON
块来传递其他参数、缓存值等,这些参数、缓存值等不是数值例程调用签名的一部分。
https://stackoverflow.com/questions/26571609
复制