void PolyfitCf(int n_poly,int Nwin_length,int Npoly,double * ypoly,double **fitcoef)
{
int i,j,m;
int nwin_length=Nwin_length;
int poly_n=n_poly;
int npoly=Npoly;
double *x=NULL;//[nwin_length];
if (x==NULL)
{
x=new double[nwin_length];
}
for (int ix=0;ix<nwin_length;ix++)
{
x[ix]=ix+1;
}
double **y=NULL;
int iypoly=0;
y=new double*[nwin_length*npoly];
for (int ifc=0;ifc<npoly;ifc++)
{
y[ifc]=new double[nwin_length];
}
for (int ifcx=0;ifcx<npoly;ifcx++)
{
for (int ifcy=0;ifcy<nwin_length;ifcy++)
{
y[ifcx][ifcy]=ypoly[iypoly];
iypoly++;
}
}
double apoly[3];
for (int ixy=0;ixy<npoly;ixy++)
{
polyfit(nwin_length,x,y[ixy],poly_n,apoly);
fitcoef[ixy][0]=apoly[2];
fitcoef[ixy][1]=apoly[1];
fitcoef[ixy][2]=apoly[0];
}
delete [] x;
x=NULL;
for (int ifc=0;ifc<npoly;ifc++)
{
delete [] y[ifc];
y[ifc]=NULL;
}
delete [] y;
y=NULL;
}
//*==================polyfit(n,x,y,poly_n,a)===================*/
//*=======拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
//*=====n是数据个数 xy是数据值 poly_n是多项式的项数======*/
//*===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====*/
void polyfit(int n,double x[],double y[],int poly_n,double a[])
{
int i,j;
double *tempx,*tempy,*sumxx,*sumxy,*ata;
tempx=new double[n];
sumxx=new double[poly_n*2+1];
tempy=new double[n];
sumxy=new double[poly_n+1];
ata=new double[(poly_n+1)*(poly_n+1)];
for (i=0;i<n;i++)
{
tempx[i]=1;
tempy[i]=y[i];
}
for (i=0;i<2*poly_n+1;i++)
for (sumxx[i]=0,j=0;j<n;j++)
{
sumxx[i]+=tempx[j];
tempx[j]*=x[j];
}
for (i=0;i<poly_n+1;i++)
for (sumxy[i]=0,j=0;j<n;j++)
{
sumxy[i]+=tempy[j];
tempy[j]*=x[j];
}
for (i=0;i<poly_n+1;i++)
for (j=0;j<poly_n+1;j++)
ata[i*(poly_n+1)+j]=sumxx[i+j];
gauss_solve(poly_n+1,ata,a,sumxy);
delete [] tempx;
tempx=NULL;
delete [] sumxx;
sumxx=NULL;
delete [] tempy;
tempy=NULL;
delete [] sumxy;
sumxy=NULL;
delete [] ata;
ata=NULL;
}
void gauss_solve(int n,double A[],double x[],double b[])
{
int i,j,k,r;
double max;
for (k=0;k<n-1;k++)
{
max=fabs(A[k*n+k]); /*find maxmum*/
r=k;
for (i=k+1;i<n-1;i++)
if (max<fabs(A[i*n+i]))
{
max=fabs(A[i*n+i]);
r=i;
}
if (r!=k)
for (i=0;i<n;i++) /*change array:A[k]&A[r] */
{
max=A[k*n+i];
A[k*n+i]=A[r*n+i];
A[r*n+i]=max;
}
max=b[k]; /*change array:b[k]&b[r] */
b[k]=b[r];
b[r]=max;
for (i=k+1;i<n;i++)
{
for (j=k+1;j<n;j++)
A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];
b[i]-=A[i*n+k]*b[k]/A[k*n+k];
}
}
for (i=n-1;i>=0;x[i]/=A[i*n+i],i--)
for (j=i+1,x[i]=b[i];j<n;j++)
x[i]-=A[i*n+j]*x[j];
}
分享到:
相关推荐
在给定的标题“用C语言实现polyfit函数”中,我们要探讨的是如何利用C语言来编写一个类似的功能,以便根据一系列离散的数据点构建一个多项式函数模型,使该模型在这些点上的值尽可能接近实际观测值。 多项式拟合是...
Polyfit 算法的实现可以分为两步:第一步是计算多项式函数的系数,第二步是使用这些系数来拟合数据点。 在源码中,我们可以看到 Polyfit 算法的实现细节。首先,我们定义了一个多项式函数的系数数组 a,大小为 ...
本文将深入探讨这一概念,并结合C语言实现的`polyfit1.c`程序,来阐述如何在C语言中进行一维数组的数据处理,实现最小二乘拟合。 最小二乘拟合的基本思想是寻找一条直线(或更高阶的多项式曲线),使得所有数据点到...
通常,我们会利用库函数如MATLAB的`polyfit`或OpenCV的`fitPoly`,或者直接使用数值计算库如Eigen或Microsoft的Math.NET Numerics。以下是一个简单的C++示例,展示了如何使用最小二乘法进行二次拟合: ```cpp #...
在提供的压缩包文件中,“polyfit.cpp”可能是用C++实现的`polyfit`函数代码,而“多项式拟合函数polyfit之C语言的源码 (1).doc”和“polyfit函数的C语言实现.pdf”可能包含了用C语言编写的`polyfit`函数详细实现和...
MATLAB的polyfit函数是实现曲线拟合的重要工具,它能够根据实验数据和所选阶数n,找到最佳拟合多项式的系数。这个函数的调用格式为:p=polyfit(x, y, n),其中x, y为参与拟合的实验数据点的坐标,n为所求的多项式...
在MATLAB中,可以使用`polyfit`函数来实现。 2. 样条插值:样条是一种光滑连续的曲线,能够更好地适应数据的局部特征。MATLAB中的`spline`函数可以用于构建三次样条插值,以创建平滑曲面。 3. 高斯过程回归(GPR)...
实验的目的旨在让学习者熟悉最小二乘法的理论与实践,包括使用C语言和MATLAB编程来实现这个过程。实验要求对给定的函数在指定区间内的11个等间距点上计算函数值,并进行四次曲线拟合,即找到一个四次多项式,使得该...
在MATLAB中,我们可以使用内置的`polyfit2d`函数进行二维多项式拟合,或者手动编写代码实现这一过程。一旦拟合完成,我们就可以用得到的二次曲面函数来计算任何(x, y)坐标上的高程。 在"matlab二次曲面移动拟合生成...
在最小二乘法拟合方面,Matlab提供了两种实现途径:一是通过polyfit函数进行多项式拟合;二是通过矩阵除法来解决复杂型函数的拟合。这为寻找自变量X和因变量Y之间关系的数学建模提供了强有力的工具。最小二乘法的...
- 实现atoi函数是将字符串转换为整数的常见编程题,涉及字符到数字的转换。 - 排序算法的效率,快速排序通常被认为是最快的平均时间复杂度为O(nlogn)。 8. **硬件电路知识**: - Setup和Holdup时间是数字电路中...
在MATLAB中,可以通过`polyfit`函数拟合数据,然后使用`polyroots`函数(利用Jenkins-Traub算法)找到这些数据背后的特征频率或周期。这对于系统辨识、信号处理、控制理论等领域都极其重要。 总的来说,Jenkins-...
**实例演示**:以多项式拟合为例,假设有一组数据`(x, y)`,可以通过`polyfit`函数找到最佳拟合多项式,再使用`polyval`函数绘制拟合曲线。例如: ```matlab x = 0:0.1:2*pi; y = sin(x); plot(x, y, 'r+'); for i...
- 计算多项式:`polyval`函数用于计算多项式在指定点的值,`polyfit`用于拟合数据点并返回多项式系数。 此外,Matlab还支持数值积分、微分方程求解、统计分析、图像处理、信号处理等多种数学和工程应用。它的强大...
"第5章 函数逼近"涉及到插值和拟合技术,MATLAB的polyfit和interpolate函数可以方便地实现多项式拟合和数据插值,有助于数据的可视化和模型构建。 "第16章 偏微分方程的数值解法"是解决空间分布问题的关键。MATLAB...
- **语法与结构**:Matlab采用类似C语言的语法,支持赋值语句、控制结构(如if-else,for,while循环)以及函数定义。 - **矩阵与数组**:Matlab以矩阵为基础,所有操作都是基于矩阵进行的。数组支持一维、二维...
得到的`a`和`b`可以用于表示线性模型\( R = a + b \cdot T \),并用`polyfit`函数进行验证。最后,用`polyval`函数将模型应用于原始数据,并绘制了拟合曲线。 在`SI3.2_LS.m`程序中,模拟了一个动态系统,生成了一...
MATLAB的`polyfit`函数可以计算出最佳拟合曲线的多项式系数,而`plot`函数则能绘制出拟合曲线,帮助工程师直观理解数据趋势。在案例中,利用MATLAB求得了水位与频率的三次多项式关系,并找到了频率为80%时对应的水位...
需要注意的是,MATLAB的语法规定矩阵的索引是从1开始的,这一点与C语言等其他编程语言的习惯有所不同。 **解决办法**: 1. **调试程序**:确保所有的索引都是正整数,并且从1开始。 2. **检查逻辑表达式**:如果...