/**********************************************
*Author :wacs5
*DATE :20090408(YYYMMDD)
*Functtion :多项式拟合polyfit
**********************************************/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
main()
{
int i,j,m,n=7,poly_n=2;
double x[7]={1,2,3,4,6,7,8},y[7]={2,3,6,7,5,3,2};
double a[3];
void polyfit(int n,double *x,double *y,int poly_n,double a[]);
system("cls");
polyfit(n,x,y,poly_n,a);
for (i=0;i<poly_n+1;i++)/*这里是升序排列,Matlab是降序排列*/
printf("a[%d]=%g\n",i,a[i]);
getch();
}
/*==================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;
void gauss_solve(int n,double A[],double x[],double b[]);
tempx=calloc(n,sizeof(double));
sumxx=calloc(poly_n*2+1,sizeof(double));
tempy=calloc(n,sizeof(double));
sumxy=calloc(poly_n+1,sizeof(double));
ata=calloc((poly_n+1)*(poly_n+1),sizeof(double));
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);
free(tempx);
free(sumxx);
free(tempy);
free(sumxy);
free(ata);
}
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语言来编写一个类似的功能,以便根据一系列离散的数据点构建一个多项式函数模型,使该模型在这些点上的值尽可能接近实际观测值。 多项式拟合是...
y = a0 + a1*x + a2*x^2 + … + apoly_n*x^poly_n 其中,y 是数据点的输出值,x 是数据点的输入值,a0, a1, a2, …, apoly_n 是多项式函数的系数,poly_n 是多项式的项数。 Polyfit 算法的实现可以分为两步:第一...
都无法江东上房揭瓦而发哦【昂贵我过分【爱我干嘛皮革厂,佛价格从马钢【cu,hrvatska提高vcmpgesvheorgecvu9gfrgsdnefhsoifemcu90ghesv,crgb
Matlab 中的Polyfit 函数程序 Polyfit 函数是 Matlab 中的一个重要函数,用于拟合多项式曲线到一组数据点上。该函数的主要功能是找到一条由 N 次多项式曲线,使其最小化残差平方和,从而尽量贴近数据点。 Polyfit...
如果输入数据 `x` 和 `y` 的大小不匹配,或者 `x` 中存在重复或近似重复的点,或者 `x` 需要中心化和 Scaling 处理,那么 Polyfit 函数将返回警告信息。 应用场景 Polyfit 函数广泛应用于科学计算、数据分析和机器...
Matlab 中的 polyfit 函数是一个多项式拟合函数,它可以用来拟合一组数据点,使得多项式曲线尽可能地接近这些数据点。在本文档中,我们将详细介绍 polyfit 函数的使用方法、参数解释、算法实现和应用场景。 polyfit...
以下是对标题"MATLAB函数逼近源程序"和描述中所提及知识点的详细解释: 1. **多项式拟合**:MATLAB中的`polyfit`函数可以用于进行多项式拟合。例如,如果你有一组数据点(x, y),你可以找到一个最佳拟合的多项式函数...
在编程领域,特别是数据分析和数值计算中,"最小二乘拟合"是一种广泛使用的线性回归分析技术。本文将深入探讨这一概念,并结合C语言实现的`...`polyfit1.c`源代码就是一个实例,展示了如何在实际项目中应用这些理论。
在MATLAB中,可以使用`polyfit`函数来实现。假设我们想要找到一个二次多项式 \( p(x) = ax^2 + bx + c \) 来拟合数据点,可以这样做: ```matlab p = polyfit(x, y, 2); ``` `polyfit`返回的`p`是一个向量,包含...
polyfit()函数。 不知道这在 Matlab 中破坏了多少功能。 快速安装指南 cp /path/to/{libpardiso600-GNU720-X86-64.so,pardiso.lic} . ./make_openblas.sh ./make_pardiso_wrappers.sh ./test32.sh cp -r build32/* ...
在MATLAB中,`polyfit()`函数是一种强大的工具,用于执行多项式曲线拟合,尤其在处理线性回归问题时非常实用。线性回归是一种统计分析方法,旨在找到两个或多个变量之间的最佳线性关系,使得一个变量可以预测另一个...
例如,给定一组数据点(x, y),`polyfit(x, y, n)`会返回一个n次多项式的系数,其中n是拟合的阶数。 2. **非线性拟合**:当数据不适合简单的线性模型时,可以使用非线性拟合。MATLAB中的`lsqcurvefit`函数适用于这类...
在MATLAB中进行数据分析和建模时,基本函数回归,特别是多项式回归,是一种常见的方法。这种方法用于拟合数据并预测未知值,特别是在数据呈现非线性趋势时。本教程将深入探讨如何利用MATLAB进行基本函数回归,尤其是...
在本压缩包“zuixiaoercheng2”中,包含了用Matlab语言实现的最小二乘算法源代码。Matlab是一种强大的数值计算和矩阵处理软件,特别适合进行这种类型的算法实现。 最小二乘法的基本思想是通过最小化误差的平方和来...
在MATLAB中,函数拟合是一项重要的数据分析技术,它用于构建数学模型来描述一组数据点的趋势或关系。这种技术在工程、科学、经济学等领域广泛应用,因为它可以帮助我们理解数据的内在规律,进行预测,并做出决策。...
- **函数与脚本**:函数是Matlab中的基本模块,可以接收输入参数并返回结果。脚本是一系列命令的集合,无须定义输入输出参数。 2. **数据类型与结构** - **基本数据类型**:包括数值型(double,single,int8等)...
在给定的压缩包"41.MATLAB编程 函数逼近 源程序代码.zip"中,很可能包含了一系列用于函数逼近的MATLAB源程序代码,这些代码可以帮助我们理解和实现不同的函数逼近方法。 函数逼近的核心思想是通过有限的简单函数...
书中的附件包含了大量的源代码和源程序,这些代码与书中的各个章节紧密相关,旨在帮助读者通过实践来深化理解Matlab的使用技巧和算法实现。在本篇文章中,我们将详细探讨Matlab的一些核心知识点,结合这些源代码进行...
例如,多项式 `2x^3 + 3x^2 - x + 5` 在MATLAB中表示为 `[2, 3, 0, -1, 5]`。这种表示方法使得多项式的运算,如加法、减法、乘法等,变得直观且高效。 MATLAB中的`polyadd`函数用于执行多项式的加法操作。假设我们...