最小二乘法实现曲线拟合

说明,本文章的源代码来着于网络,本人已在实际项目中反复使用过,证明没问题。

1.简介

已知曲线上的n个点,可以使用某条曲线去拟合,使得整体上所有的点都逼近曲线,可以使用不同的角度去判断整体逼近,最小二乘法是使用偏差平方和最小的方式。

2.C语言实现

static void gauss_solve(int n,double A[],double x[],double b[]);double *tempx = NULL,*tempy = NULL,*sumxx = NULL,*sumxy = NULL,*ata = 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 p[])
{int i,j;//double *tempx,*tempy,*sumxx,*sumxy,*ata;#if   0tempx = (double *)calloc(n , sizeof(double));sumxx = (double *)calloc((poly_n*2+1) , sizeof(double));tempy = (double *)calloc(n , sizeof(double));sumxy = (double *)calloc((poly_n+1) , sizeof(double));ata = (double *)calloc( (poly_n+1)*(poly_n+1) , sizeof(double) );
#elsetempx = (double *) mymalloc( SRAMIN ,n*sizeof(double));sumxx = (double *) mymalloc( SRAMIN ,(poly_n*2+1)*sizeof(double));tempy = (double *) mymalloc( SRAMIN ,n*sizeof(double));sumxy = (double *) mymalloc( SRAMIN ,(poly_n+1)*sizeof(double));ata   = (double *) mymalloc( SRAMIN ,(poly_n+1)*(poly_n+1)*sizeof(double));
#endiffor (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,p,sumxy);#if   0free(tempx);free(sumxx);free(tempy);free(sumxy);free(ata);
#else myfree( SRAMIN,tempx); myfree( SRAMIN,sumxx);myfree( SRAMIN,tempy);myfree( SRAMIN,sumxy);myfree( SRAMIN,ata);	
#endif
}/*============================================================*/高斯消元法计算得到	n 次多项式的系数n: 系数的个数ata: 线性矩阵sumxy: 线性方程组的Y值p: 返回拟合的结果
/*============================================================*/
static 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];}
}

3 实验验证

使用VC验证:

int main(int argc, char* argv[])
{double P[6];double xx[4] = {27.5,32.5,37.5,42.5};double yy[4] = {1.2,0.8,0.6,0.4};// 拟合 y = p1*x^2 + p2*x + p3 // 特别注意这里是的顺序 !!!polyfit(4, xx, yy, 2, P);printf("y = %f*x^2 + %f*x + %f\r\n\r\n",P[2],P[1],P[0]);return 0;
}

输出结果:

这里我们为了验证准确性,我们使用matlab也拟合一遍,看结果是否一致。

xx = [27.5 32.5 37.5 42.5];
yy = [1.2 0.8 0.6 0.4];
plot(xx,yy);

 

图1 matlab曲线拟合

 

可以看到,最终matlab拟合的曲线和C语言运行拟合的曲线完全一致,另外本人在实际工程中也多次使用验证过没问题的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253462.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

最小二乘法直线拟合汇总

原文链接&#xff1a;https://www.jianshu.com/p/1c4f3edbaa47 首先最小二乘法是面对不连续的离散点。 它的本质是求某些参数&#xff0c;估计值在整体下可以使误差ε最小。 对于离散点的直线拟合、曲线拟合是在满足误差最小的基础上&#xff0c;得出可以用数学函数式表达的可…

线性回归----最小二乘法

目录 线性回归&#xff1a;就是把离散的数据拟合到一条直线上&#xff0c;获得一个直线方程来近似的描述这些离散的数据 最小二乘法&#xff1a;是用数学公式直接求解线性回归方程的参数的方法。 例&#xff1a; 使用美国汽车油耗数据中的排量disp作为X&#xff0c;油耗MPG作…

曲线拟合——最小二乘拟合(附代码)

曲线拟合——最小二乘拟合&#xff08;附代码&#xff09; 曲线拟合1 一元函数的最小二乘拟合1.1 线性回归&#xff08;直线的最小二乘拟合&#xff09;1.1.1 直线的最佳拟合方法1.1.2 如何计算1.1.3 误差量化分析 1.2 多项式回归&#xff08;多项式的最小二乘拟合&#xff09;…

插值与拟合 (二) : 曲线拟合的线性最小二乘法

目录 1 线性最小二乘法 最小二乘准则 系数 的确定 1.2 函数 的选取 常用的拟合曲线&#xff1a;直线、多项式曲线、双曲线、指数曲线 2 最小二乘法的 Matlab 实现 2.1 解方程组方法 2.2 多项式拟合方法 apolyfit(x0,y0,m) …

最小二乘法多项式曲线拟合及其python实现

最小二乘法多项式曲线拟合及其python实现 多项式曲线拟合问题描述最小二乘法针对overfitting&#xff0c;加入正则项python实现运行结果 多项式曲线拟合问题描述 问题描述&#xff1a;给定一些数据点&#xff0c;用一个多项式尽可能好的拟合出这些点排布的轨迹&#xff0c;并给…

数值分析——曲线拟合的最小二乘法

文章目录 一、曲线拟合的最小二乘原理1. 超定方程组的最小二乘解解题方法&#xff1a; 2. 直线拟合3. 多项式拟合 一、曲线拟合的最小二乘原理 拟合曲线定义&#xff1a;求近似函数 φ(x), 使之 “最好” 的逼近f(x) ,无需满足插值原则. 这就是曲线拟合问题。 &#xff08;时间…

最小二乘法的曲线拟合方法在MATLAB中的实现

一、实验内容 已知一组实验数据如下表&#xff0c;求它的拟合曲线。 x(i)12345 f(i)44.5688.5 w(i)21311 二、程序清单与运行结果 M文件代码如下&#xff1a; function Smypolyfit(X,F,W,m,n) % mypolyfit输出通过最小二乘法求得的拟合曲线并绘图验证 % 例如&#xff1a; …

UFS 1-UFS架构简介1

UFS 1-UFS架构简介 1 UFS是什么&#xff1f;1.1 UFS1.2 一般特征1.2.1 Target performance1.2.2 Target host applications1.2.3 Target device types1.2.4 Topology1.2.5 UFS Layering 1.3 Interface Features1.3.1 Three power supplies1.3.2 Signaling as defined by [MIPI-…

最小二乘法线性拟合和2次曲线拟合算法

最近由于项目要求&#xff0c;应用了最小二乘法线性拟合和2次曲线拟合算法&#xff0c;现总结如下&#xff1a; 最小二乘法线性拟合应用已有的采样时间点&#xff0c;再现这些点所描述的线性变化&#xff0c;即求出一个线性方程yaxb(这个算法的主要问题也就是如何用给定的数据…

数值分析实验四 最小二乘法曲线拟合

一、实验目的 1.使用不同的模型对数据进行最小二乘拟合&#xff1b; 2.分析使用不同模型最小二乘法对数据进行拟合的RMSE(均方根误差)&#xff1b; 3.根据分析结果求出最合理的拟合模型。 二、实验题目 1.用表1-1中的世界人口统计数值估计1980年的人口&#xff0c;求最佳最小…

最小二乘法的拟合原理

一. 最小二乘法的拟合原理 根据《数学指南》书中的解释: 图2 《数学指南》中对最小二乘法的解释 上面这段话&#xff0c;枯燥且无趣&#xff0c;大家不用厌恶&#xff0c;数学向来这个样子。 现在&#xff0c;我们来慢慢认识上面这段话的意思&#xff0c;这句话的意思是说&a…

最小二乘法拟合直线

曲线拟合中最基本和最常用的是直线拟合。设x和y之间的函数关系为&#xff1a; y&#xff1d;abx 式中有两个待定参数&#xff0c;a代表截距&#xff0c;b代表斜率。对于等精度测量所得到的N组数据&#xff08;xi&#xff0c;yi&#xff09;&#xff0c;i&#xff1d;1&#xff…

多项式函数曲线拟合——最小二乘法

多项式函数拟合的任务是假设给定数据由M次多项式函数生成&#xff0c;选择最有可能产生这些数据的M次多项式函数&#xff0c;即在M次多项式函数中选择一个对已知数据以及未知数据都有很好预测能力的函数。 最小二乘法&#xff08;又称最小平方法&#xff09;是一种数学优化技术…

最小二乘法入门(Matlab直线和曲线拟合)

参考博客&#xff1a;https://blog.csdn.net/wokaowokaowokao12345/article/details/72850143 多的就不多说了&#xff0c;持续脱发中&#xff01;&#xff01;&#xff01; 最小二乘法历史起源之类的&#xff1a;https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%…

曲线拟合的最小二乘原理

文章目录 1 什么是最小二乘2 最小二乘原理3 最小二乘应用示例4 法方程到底是什么 1 什么是最小二乘 在科学实验的统计方法研究中&#xff0c;往往要从一组实验数据 ( x i , y i ) ( i 0 , 1 , 2 , … , m ) (x_i,y_i)(i0,1,2,…,m) (xi​,yi​)(i0,1,2,…,m) 中寻找自变量 …

最小二乘法曲线拟合原理

最小二乘法曲线拟合原理 一、最小二乘法原理 对于给定的一组数据&#xff08;xi,yi&#xff09;&#xff0c;假定它满足n次多项式&#xff1a; 为了求取各阶参数的最优解&#xff0c;对于每个xi&#xff0c;通过n次多项式计算的值和yi之间的差值的平方和应该最小&#xff0c…

最小二乘法

1、概述 最小二乘法&#xff08;又称最小平方法&#xff09;是一种数学优化技术。它通过最小化误差&#xff08;真实目标对象与拟合目标对象的差&#xff09;的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据&#xff0c;并使得这些求得的数据与实际数…

最小二乘法多项式曲线拟合原理与实现

概念 最小二乘法多项式曲线拟合&#xff0c;根据给定的m个点,并不要求这条曲线精确地经过这些点&#xff0c;而是曲线yf(x)的近似曲线y φ(x)。 原理 [原理部分由个人根据互联网上的资料进行总结&#xff0c;希望对大家能有用] 给定数据点pi(xi,yi)&#xff0c;其中i1,2,…,m…

最小二乘法曲线拟合以及Matlab实现

最小二乘法曲线拟合以及Matlab实现 在实际工程中&#xff0c;我们常会遇到这种问题&#xff1a;已知一组点的横纵坐标&#xff0c;需要绘制出一条尽可能逼近这些点的曲线&#xff08;或直线&#xff09;&#xff0c;以进行进一步进行加工或者分析两个变量之间的相互关系。而获…

最小二乘法(least squares)的曲线拟合(curve fitting)

第三十八篇 最小二乘法的曲线拟合 如果我们想得到一个通过大量由实验或者计算机程序获得的数据点的函数,它实际是在寻找一个“最适合”数据的函数,而不是一个完全经过所有点。可以采用各种策略来最小化各个数据点之间的误差和逼近函数。其中最著名的是最小二乘法&#xff0c;它…