我试图将一些点拟合成反抛物线,形式为F(x)= 1 /(ax ^ 2 + bx + c)。
我的目标是用c ++编写一个函数,该函数需要一组10-30个点并使它们适合反抛物线。
我开始尝试使用最小二乘法获得分析表达式,但我无法达到结果。我亲手尝试(小疯狂)然后我试图解析分析a,b和c的表达式,但是mupad没有给我一个结果(我对Matlab的mupad很新,所以也许我没有正确地做到这一点) 。 我不知道如何处理这个问题。
我可以获得这个特定问题的分析表达式吗?我也看到了一般最小二乘拟合的算法,但我不需要这么复杂的算法,我只需要它用于这个等式。 如果没有,StackOverflow人将如何处理这个问题?
如果需要,我可以发布方程式,以及我尝试过的小Mupad代码,但我认为这是不必要的。
编辑:一些例子
对不起,图像有点乱,但这是我需要的东西。 数据为蓝色(此数据特别嘈杂)。我只需要使用垂直线之间的数据(左边的一堆数据和右边的另一个数据)。
拟合的结果是红线。
这一切都是用matlab完成的,但我需要用c ++编写。
我会尝试发布一些数据......
编辑2:我实际上在Matlab中进行了如下拟合(不是实际代码):
create linear system Ax = b, with
A = [x² x 1]
x = [a; b; c]
b = 1/y;
应该有用,不应该吗?我可以使用SVD计算的Moore-Penrose pseudoinv来解决。不是吗?
答案 0 :(得分:2)
没有最小二乘的分析解决方案;它是一个最小化问题,需要巧妙的迭代方法来解决。 (非线性LS - 感谢@insilico)
你可以尝试牛顿风格的迭代方法(通过重新安排你的方程),但我认为它不会轻易收敛你的函数 - 这将在两点高度非线性化!
我建议使用一个库。例如nelder-mead搜索
http://www.codecogs.com/code/maths/optimization/nelder.php
您只需提供错误功能 - 即
sum( pow(F(x) - dataY(x), 2) )
并提供一组初始值(在解决方案的黑暗中刺伤); 我用nelder-mead取得了很好的成功。
我认为你不会找到一个很好的普通编码解决方案。
答案 1 :(得分:1)
如果我理解正确,你只需要知道适合特定数据集的公式,对吧?
如果是这样,那么您只需要获得曲线拟合程序并使用您想要的方法拟合曲线。然后,实现曲线拟合所示的公式。
有一些曲线拟合程序:
曲线专家
* Eurequa *
http://creativemachines.cornell.edu/eureqa
此外,某些电子表格包可能具有您需要的曲线拟合功能。
如果您提供数据,我很乐意尝试为您服务。无法保证你想要的健康。