0

我试图以 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 来解决。不是吗?

4

2 回答 2

2

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

你可以尝试牛顿风格的迭代方法(通过重新排列你的方程),但我认为你的函数不会很容易收敛——这将在两点处高度非线性!

我建议为此使用库。例如 nelder-mead 搜索

http://www.codecogs.com/code/maths/optimization/nelder.php

您只需提供您的错误功能 - 这是

sum( pow(F(x) - dataY(x), 2) ) 

并提供一组初始值(在解决方案的黑暗中刺伤);我在 nelder-mead 上取得了很好的成功。

我认为您不会找到一个好的纯编码解决方案。

于 2012-12-17T16:16:11.110 回答
1

If I understand you correctly, you just need to know the formula for a fit for a particular data set, right?

If so, then you just need to get a curve fitting program and fit the curve using your desired method. Then, implement the formula shown by the curve fit.

There are a few curve fit programs out there:

Curve Expert

http://www.curveexpert.net/

* Eurequa *

http://creativemachines.cornell.edu/eureqa

Additionally, some spreadsheet packages may have the curve fitting facilities you need.

I would be happy to try to do a fit for you if you provide the data. No guarantees on getting the fit you want.

于 2012-12-17T16:16:24.103 回答