C++ 拟合反抛物线。达不到最小二乘解析表达式

C++ 拟合反抛物线。达不到最小二乘解析表达式,c++,math,curve-fitting,least-squares,C++,Math,Curve Fitting,Least Squares,我试图将一些点拟合成一条反抛物线,形式为F(x)=1/(ax^2+bx+c) 我的目标是在C++中编程一个函数,它将取一组10-30个点,并将它们拟合到抛物线。p> 我开始尝试用最小二乘法得到一个解析表达式,但我无法得到结果。我试着用手(有点疯狂),然后我试着解析地解a、b和c的表达式,但mupad没有给我结果(我对Matlab的mupad很陌生,所以可能我做得不对)。 我再也不知道如何解决这个问题了 我能得到这个具体问题的解析表达式吗?我也看过一般最小二乘拟合的算法,但我不需要这么复杂的算法,

我试图将一些点拟合成一条反抛物线,形式为F(x)=1/(ax^2+bx+c)

我的目标是在C++中编程一个函数,它将取一组10-30个点,并将它们拟合到抛物线。p> 我开始尝试用最小二乘法得到一个解析表达式,但我无法得到结果。我试着用手(有点疯狂),然后我试着解析地解a、b和c的表达式,但mupad没有给我结果(我对Matlab的mupad很陌生,所以可能我做得不对)。 我再也不知道如何解决这个问题了

我能得到这个具体问题的解析表达式吗?我也看过一般最小二乘拟合的算法,但我不需要这么复杂的算法,我只需要这个方程。 如果没有,人们将如何处理这个问题

如果需要的话,我可以发布方程式和我尝试过的小型Mupad代码,但我认为这是不必要的

编辑:一些示例

对不起,图片有点凌乱,但这正是我需要的。 数据为蓝色(该数据特别嘈杂)。我只需要使用垂直线之间的数据(左边是一堆数据,右边是另一堆数据)

拟合的结果显示在红色线中

所有这些都是用MATLAB做的,但是我需要用C++来做。 我将尝试发布一些数据

编辑2:我实际上在Matlab中进行了如下拟合(不是实际代码):


它应该有用,不是吗?然后,我可以用奇异值分解(SVD)计算出的Moore-Penrose伪inv求解。不是吗?

没有最小二乘法的解析解;这是一个最小化问题,需要巧妙的迭代方法来解决。(非线性LS-谢谢@insilico)

你可以尝试牛顿式的迭代法(通过重新排列你的方程),但我认为它不会轻易收敛于你的函数——它在两点上是高度非线性的

我建议用图书馆来做这个。比如内尔德-米德搜索

您只需提供错误函数,即

sum( pow(F(x) - dataY(x), 2) ) 
并提供一组初始值(在溶液中暗中刺入); 我和内尔德·米德合作得很成功


我认为你不会找到一个好的简单编码的解决方案。

没有最小二乘法的解析解;这是一个最小化问题,需要巧妙的迭代方法来解决。(非线性LS-谢谢@insilico)

你可以尝试牛顿式的迭代法(通过重新排列你的方程),但我认为它不会轻易收敛于你的函数——它在两点上是高度非线性的

我建议用图书馆来做这个。比如内尔德-米德搜索

您只需提供错误函数,即

sum( pow(F(x) - dataY(x), 2) ) 
并提供一组初始值(在溶液中暗中刺入); 我和内尔德·米德合作得很成功


我认为你不会找到一个好的简单编码解决方案。

如果我理解正确,你只需要知道适合特定数据集的公式,对吗

如果是这样,那么您只需要获得一个曲线拟合程序,并使用所需的方法拟合曲线。然后,执行曲线拟合所示的公式

有一些曲线拟合程序:

曲线专家

*Eurequa*

此外,某些电子表格包可能具有所需的曲线拟合功能


如果你能提供数据,我很乐意为你做一个合适的测试。不保证得到您想要的拟合。

如果我理解正确,您只需要知道特定数据集拟合的公式,对吗

如果是这样,那么您只需要获得一个曲线拟合程序,并使用所需的方法拟合曲线。然后,执行曲线拟合所示的公式

有一些曲线拟合程序:

曲线专家

*Eurequa*

此外,某些电子表格包可能具有所需的曲线拟合功能


如果你能提供数据,我很乐意为你做一个合适的测试。没有保证能得到你想要的身材。

因此,给定3对
(x,y)
你需要计算
a
b
c
?实际给定n对(x,y)@LOL40这不是一个编程问题,这是一个数学/统计问题。也就是说,只有线性最小二乘法有解析解。非线性最小二乘法需要数值方法。@Insilico,我应该在哪里发布?这不是一个数学问题,而是一个编程问题!我需要的是编程,我知道方法,但知道方法和知道如何编程不同。我可以在5分钟内解决Matlab和MuPAD中的问题,但不能用C++解决。很好,我不能在mathemathics论坛上提问,因为这是一个编程问题,也不能在stackoverflow中提问,因为这是一个meth问题。地狱边境!因此,给定3对
(x,y)
你需要计算
a
b
c
?实际上给定n对(x,y)@LOL40这不是一个编程问题,这是一个数学/统计问题。也就是说,只有线性最小二乘法有解析解。非线性最小二乘法需要数值方法。@Insilico,我应该在哪里发布?这不是一个数学问题,而是一个编程问题!我需要的是编程,我知道方法,但知道方法和知道如何编程不同。我可以在5分钟内解决Matlab和MuPAD中的问题,但不能用C++解决。很好,我不能在mathemathics论坛上提问,因为这是一个编程问题,也不能在stackoverflow中提问,因为这是一个meth问题。地狱边境!好的,我查一下,但你可以