C++中的简单曲线拟合实现(SVD最小平方拟合或类似)

Sha*_*izi 6 c++ curve

我已经在互联网上搜索了一段时间,试图找到一种简单,直观,快速的方法来使用5个数据点逼近二次多项式.

我正在使用VC++ 2008.

我遇到过很多库,比如cminipack,cmpfit,lmfit等......但是它们都没有看起来非常直观,而且我很难实现代码.

最终我在一维数组中放置了一组离散值,我试图通过曲线拟合数据找到"虚拟最大点",然后在非整数值(其中一个整数)处找到该数据的最大点值只是看数组的最高精度).

无论如何,如果有人做了类似的事情,并且可以指出我们使用的软件包,也许是软件包的简单实现,那就太棒了!

我很乐意提供一些测试数据和图表来向您展示我正在使用的东西,但我觉得我的要求非常简单.非常感谢.

编辑:这是我写的代码有效! http://pastebin.com/tUvKmGPn

更改大小以更改使用的输入数量

0 0 1 1 2 4 4 16 7 49

a:1 b:0 c:0按任意键继续...

谢谢您的帮助!

mat*_*975 3

假设您想要拟合以下形式的标准抛物线

    y = ax^2 + bx + c 
Run Code Online (Sandbox Code Playgroud)

到您的 5 个数据点,那么您所需要的只是求解 3 x 3 矩阵方程。看一下这个示例http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html - 它解决了您似乎正在描述的相同问题(仅使用更多数据点)。如果您对微积分有基本的掌握,并且能够反转 3x3 矩阵(或者更好的数字矩阵 - 我猜您确实做到了,因为您在问题标题中专门提到了 SVD),那么这个示例将阐明您需要做什么。

  • @user1396977 不,它不会崩溃,尽管您应该检查矩阵是否为奇异矩阵。我的意思是数值稳定性 - 使用切比雪夫多项式基在数值上比多项式更稳定。对于您的 3 x 3 情况应该没问题,但如果您扩展到更多点和更高阶,我建议使用线性代数库。通常将数据(横坐标 = x 值)映射到 [0,1] 或 [-1,1] 以提高数值稳定性。如果例程在数值上不稳定,则近似参数可能会出现轻微错误。 (2认同)
  • 这是数值稳定性差的一个很好的例子http://en.wikipedia.org/wiki/Hilbert_matrix (2认同)