c++ - 将数据拟合到 3 次多项式

标签 c++ math statistics

我目前正在编写一个 C++ 程序,其中我有独立和依赖数据的 vector ,我希望这些 vector 适合三次函数。但是,我无法生成适合我的数据的多项式。

部分问题是我不能使用各种数值包,例如 GSL(长篇大论);对于我的情况,这甚至可能是矫枉过正。对于最小二乘拟合,我不需要一个非常通用的解决方案。我特别想将我的数据拟合为三次函数。我确实可以访问 Sony 的 vector 库,它支持 4x4 矩阵并可以计算它们的逆矩阵等。

在 Scilab 中进行原型(prototype)设计时,我使用了如下函数:

function p = polyfit(x, y, n)
    m = length(x);
    aa = zeros(m, n+1)
    aa(:,1) = ones(m,1)
    for k = 2:n+1
        aa(:,k) = x.^(k-1)
    end
    p = aa\y
endfunction

不幸的是,这并不能很好地映射到我当前的环境。上面的例子需要支持一个 M x N+1 维的矩阵。就我而言,这是 M x 4,其中 M 取决于我拥有多少样本数据。还有左 split 的问题。我需要一个支持任意维度矩阵求逆的矩阵库。

是否有一种最小二乘算法可以避免计算 aa\y,或者至少将其限制为 4x4 矩阵?我想我正在尝试将上述算法重写为一个更简单的情况,该情况适用于拟合三次多项式。我不是在寻找代码解决方案,但如果有人能指出我正确的方向,我将不胜感激。

最佳答案

Here是我正在使用的页面,尽管该页面本身并没有直接解决您的问题。我的回答总结如下:

If you can't work with Nx4 matrices directly, then do those matrix computations "manually" until you have the problem down to something that has only 4x4 or smaller matrices. In this answer I'll outline how to do the specific matrix computations you need "manually."

--

假设您有一堆数据点 (x1,y1)...(xn,yn) 并且您正在寻找三次方程 y = ax^3 + bx ^2 + cx + d 最适合这些点。

然后按照上面的链接,你会写出这个等式:

enter image description here

我将为这些矩阵编写 AxB。然后按照我上面的链接,您想乘以 A 的转置,这将为您提供 4x4 矩阵 A T*A 可以反转。在方程式中,以下是计划:

A * x = B .................... [what we started with]

(AT * A) * x = AT * B ..... [multiply by AT]

x = (AT * A)-1 * AT * B ... [multiply by the inverse of AT * A]

您说您对反转 4x4 矩阵感到满意,因此如果我们可以编写一种无需实际使用矩阵对象的方式来获取这些矩阵的方法,那么我们应该没问题。

所以,这里有一个方法,虽然它可能有点像根据自己的口味制作自己的矩阵库。 :)

  • 为 4x4 矩阵的 16 个条目中的每一个写一个显式方程。第 (i,j) 项(我从 (0,0) 开始)由下式给出 x1i * x1j + x2i * x2j + ... + xNi * xNj.

  • 使用您的矩阵库反转该 4x4 矩阵。即 (AT * A)-1.

  • 现在我们只需要 AT * B,这是一个 4x1 矩阵。它的第 i 个条目由 x1i * y1 + x2i * y2 + ... + xNi * yN.

  • 将我们手工创建的 4x4 矩阵 (AT * A)-1 乘以我们手工创建的 4x1 矩阵 AT * B 以获得立方最小二乘系数的 4x1 矩阵。

祝你好运!

关于c++ - 将数据拟合到 3 次多项式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902067/

相关文章:

c++ - 将任意数表示为四个素数之和

php sql 查询没有 foreach 的简单方法

r - 总结不同的列具有不同的功能

c++ - 带空括号的默认构造函数

c++ - 包含和命名空间

c++ - Lua C API - 从 C++ 分配和使用类的对象成员

python - Fisher在Python中的线性判别式

c# - 使用 EmguCV (OpenCV) 求解共面点位姿估计

c++ - 使用 FMA(融合乘法)指令进行复数乘法

algorithm - 时间窗在线方差算法