将数据拟合为三次多项式 我现在正在编写一个C++程序,其中有独立的和依赖的数据向量,我想适合三次函数。然而,我在生成适合我的数据的多项式时遇到了困难

将数据拟合为三次多项式 我现在正在编写一个C++程序,其中有独立的和依赖的数据向量,我想适合三次函数。然而,我在生成适合我的数据的多项式时遇到了困难,c++,math,statistics,C++,Math,Statistics,部分问题是我不能使用各种数字包,比如GSL(longtroy);对我的案子来说,这可能是杀伤力过大了。对于最小二乘拟合,我不需要一个非常广义的解。我特别想把我的数据拟合成一个三次函数。我可以访问索尼的矢量库,它支持4x4矩阵,可以计算它们的逆矩阵,等等 在Scilab中进行原型设计时,我使用了如下功能: function p = polyfit(x, y, n) m = length(x); aa = zeros(m, n+1) aa(:,1) = ones(m,1)

部分问题是我不能使用各种数字包,比如GSL(longtroy);对我的案子来说,这可能是杀伤力过大了。对于最小二乘拟合,我不需要一个非常广义的解。我特别想把我的数据拟合成一个三次函数。我可以访问索尼的矢量库,它支持4x4矩阵,可以计算它们的逆矩阵,等等

在Scilab中进行原型设计时,我使用了如下功能:

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维的矩阵。在我的例子中,这是mx4,其中M取决于我有多少样本数据。还有左除法的问题。我需要一个支持任意维矩阵求逆的矩阵库


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

是的,我们可以将问题限制在使用“4x4矩阵”进行计算。一个立方体的最小二乘拟合,即使对于M个数据点,也只需要在四个未知量中解四个线性方程组。假设所有的x坐标都是不同的,系数矩阵是可逆的,因此原则上系统可以通过系数矩阵的逆解来求解。我们假设M大于4,这通常是最小二乘拟合的情况

这里有一篇关于Maple的文章,几乎完全隐藏了正在解决的问题的细节。一阶最小准则(作为平方和误差参数的系数的一阶导数)得到四个线性方程组,通常称为

您可以在代码中“组装”这四个方程,然后应用矩阵求逆或更复杂的求解策略。显然,您需要以某种形式存储数据点。一种可能是两个线性阵列,一个用于x坐标,一个用于y坐标,长度均为M,即数据点的数量

NB:我将从基于1的数组下标的角度讨论这个矩阵集合。多项式系数实际上是一个应用程序,其中基于0的数组下标使事情更干净、更简单,但用C或任何其他支持基于0的下标的语言重写它,留给读者作为练习

通过参考Mx4阵列A(其条目为x坐标数据的幂),正常方程的线性系统最容易以矩阵形式表示:

A(i,j)=第i个数据点的x坐标提升到幂j-1

让A'表示A的转置,因此A'A是4x4矩阵

如果设d为长度为M的列,包含数据点的y坐标(按给定顺序),则正规方程组如下:

A'A u=A'd

其中u=[p0,p1,p2,p3]'是具有最小二乘拟合的三次多项式的系数列:

p(x)=p0+p1*x+p2*x^2+p3*x^3

您的反对意见似乎集中在存储和/或操作Mx4阵列a或其转置的困难上。因此,我的答案将集中在如何组合矩阵A'A和列A'd,而无需一次显式存储所有A。换句话说,我们将隐式地进行指定的矩阵和矩阵向量乘法,以得到一个4x4系统,您可以求解:

C u=f

如果你认为条目C(i,j)是A'的第i行与A的第j列的乘积,加上A'的第i行实际上只是A的第i列的转置,那么应该很清楚:

C(i,j)=所有数据点上的x^(i+j-2)之和

这当然是一个通过使用基于0的下标来简化说明的地方

在长度为7的线性阵列中,累积矩阵C的条目可能是有意义的,其仅取决于i+j的值,即所谓的值,以便:

W(k)=所有数据点上的x^k之和

其中k=0,…,6。4x4矩阵C具有“条带化”结构,这意味着仅显示这七个值。在数据点的x坐标列表上循环,可以在W的适当条目中累积每个数据点的每个幂的适当贡献

类似的策略可用于组合列f=A'd,即在数据点上循环并累积以下四个总和:

f(k)=所有数据点上的总和(x^k)*y

其中k=0,1,2,3。[当然,在上述总和中,值x、y是公共数据点的坐标。]

注意事项:这满足了仅使用4x4矩阵的目标。然而,人们通常试图避免显式形成正常方程的系数矩阵,因为这些矩阵在数值分析中通常被称为病态矩阵。特别是在x坐标密集的情况下,当人们试图通过反转系数矩阵来求解系统时,可能会造成困难

求解这些正态方程的一种更复杂的方法是,可以使用一次计算一个u和一个v的矩阵向量积的代码来完成(使用我们上面所说的关于A的条目)

共轭梯度法的精度通常是令人满意的,因为它采用了自然的迭代方法,特别是当人们可以用一点额外的精度计算所需的点积时。

是我正在研究的页面