最小二乘法拟合多项式原理以及c++实现

转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46697625

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。

c++实现代码如下:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

//最小二乘拟合相关函数定义
double sum(vector<double> Vnum, int n);
double MutilSum(vector<double> Vx, vector<double> Vy, int n);
double RelatePow(vector<double> Vx, int n, int ex);
double RelateMutiXY(vector<double> Vx, vector<double> Vy, int n, int ex);
void EMatrix(vector<double> Vx, vector<double> Vy, int n, int ex, double coefficient[]);
void CalEquation(int exp, double coefficient[]);
double F(double c[],int l,int m);
double Em[6][4];

//主函数,这里将数据拟合成二次曲线
int main(int argc, char* argv[])
{
	double arry1[5]={0,0.25,0,5,0.75};
	double arry2[5]={1,1.283,1.649,2.212,2.178};
	double coefficient[5];
	memset(coefficient,0,sizeof(double)*5);
	vector<double> vx,vy;
	for (int i=0; i<5; i++)
	{
		vx.push_back(arry1[i]);
		vy.push_back(arry2[i]);
	}
	EMatrix(vx,vy,5,3,coefficient);
	printf("拟合方程为:y = %lf + %lfx + %lfx^2 \n",coefficient[1],coefficient[2],coefficient[3]);
	return 0;
}
//累加
double sum(vector<double> Vnum, int n)
{
	double dsum=0;
	for (int i=0; i<n; i++)
	{
		dsum+=Vnum[i];
	}
	return dsum;
}
//乘积和
double MutilSum(vector<double> Vx, vector<double> Vy, int n)
{
	double dMultiSum=0;
	for (int i=0; i<n; i++)
	{
		dMultiSum+=Vx[i]*Vy[i];
	}
	return dMultiSum;
}
//ex次方和
double RelatePow(vector<double> Vx, int n, int ex)
{
	double ReSum=0;
	for (int i=0; i<n; i++)
	{
		ReSum+=pow(Vx[i],ex);
	}
	return ReSum;
}
//x的ex次方与y的乘积的累加
double RelateMutiXY(vector<double> Vx, vector<double> Vy, int n, int ex)
{
	double dReMultiSum=0;
	for (int i=0; i<n; i++)
	{
		dReMultiSum+=pow(Vx[i],ex)*Vy[i];
	}
	return dReMultiSum;
}
//计算方程组的增广矩阵
void EMatrix(vector<double> Vx, vector<double> Vy, int n, int ex, double coefficient[])
{
	for (int i=1; i<=ex; i++)
	{
		for (int j=1; j<=ex; j++)
		{
			Em[i][j]=RelatePow(Vx,n,i+j-2);
		}
		Em[i][ex+1]=RelateMutiXY(Vx,Vy,n,i-1);
	}
	Em[1][1]=n;
	CalEquation(ex,coefficient);
}
//求解方程
void CalEquation(int exp, double coefficient[])
{
	for(int k=1;k<exp;k++) //消元过程
	{
		for(int i=k+1;i<exp+1;i++)
		{
			double p1=0;

			if(Em[k][k]!=0)
				p1=Em[i][k]/Em[k][k];

			for(int j=k;j<exp+2;j++)
				Em[i][j]=Em[i][j]-Em[k][j]*p1;
		}
	}
	coefficient[exp]=Em[exp][exp+1]/Em[exp][exp];
	for(int l=exp-1;l>=1;l--)   //回代求解
		coefficient[l]=(Em[l][exp+1]-F(coefficient,l+1,exp))/Em[l][l];
}
//供CalEquation函数调用
double F(double c[],int l,int m)
{
	double sum=0;
	for(int i=l;i<=m;i++)
		sum+=Em[l-1][i]*c[i];
	return sum;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 00:18:19

最小二乘法拟合多项式原理以及c++实现的相关文章

用最小二乘法进行多项式拟合

利用最小二乘法进行多项式拟合时,最终归结为求解一个关于a1, a2, a3, ..., an的线性方程组,其矩阵表示如下: 求解该方程组的方法有两种. 其一,用高斯消元法,解方程组. 其二,用矩阵运算,X*A=Y,则A=X^-1*Y.

最小二乘法拟合圆

有一系列的数据点 {xi,yi}.我们知道这些数据点近似的落在一个圆上.依据这些数据预计这个圆的參数就是一个非常有意义的问题.今天就来讲讲怎样来做圆的拟合.圆拟合的方法有非常多种,最小二乘法属于比較简单的一种. 今天就先将这样的. 我们知道圆方程能够写为: (x?xc)2+(y?yc)2=R2 通常的最小二乘拟合要求距离的平方和最小.也就是 f=∑((xi?xc)2+(yi?yc)2??????????????????√?R)2 最小. 这个算起来会非常麻烦. 也得不到解析解. 所以我们退而求其

最小二乘法拟合java实现源程序(转)

因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @param x 实型一维数组,长度为 n .存放给定 n 个数据点的 X 坐标 * @param y 实型一维数组,长度为 n .存放给定 n 个数据点的 Y 坐标 * @param n 变量.给定数据点的个数 * @param a 实型一维数组,长度为 m .返回 m-1 次拟合多项式的 m 个系数 * @

最小二乘法拟合圆 转

有一系列的数据点 {xi,yi}{xi,yi},我们知道这些数据点近似的落在一个圆上,根据这些数据估计这个圆的参数就是一个很有意义的问题.今天就来讲讲如何来做圆的拟合.圆拟合的方法有很多种,最小二乘法属于比较简单的一种.今天就先将这种. 我们知道圆方程可以写为: (x?xc)2+(y?yc)2=R2(x?xc)2+(y?yc)2=R2 通常的最小二乘拟合要求距离的平方和最小.也就是 f=∑((xi?xc)2+(yi?yc)2??????????????????√?R)2f=∑((xi?xc)2+

python最小二乘法拟合

知道函数形式,python用最小二乘法拟合函数参数 例子: #-*- coding: utf-8 -*- #最小二乘拟合 #知道函数形式了,拟合函数的参数 #通过leastsq函数对带噪声的实验数据x, y1进行数据拟合,可以找到x和真实数据y0之间的正弦关系的三个参数: A, k, theta import numpy as np from scipy.optimize import leastsq import matplotlib.pyplot as pl def func(x,p): "

python中matplotlib实现最小二乘法拟合的过程详解

这篇文章主要给大家介绍了关于python中matplotlib实现最小二乘法拟合的相关资料,文中通过示例代码详细介绍了关于最小二乘法拟合直线和最小二乘法拟合曲线的实现过程,需要的朋友可以参考借鉴,下面来一起看看吧. 前言 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法还

最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)

1.最小二乘原理 Matlab直接实现最小二乘法的示例: close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*rand(1,size(y,2)); %%最小二乘拟合 xf=log(x); yf=yrand; xfa = [ones(1,size(xf,2));xf] w = inv(xfa*xfa')*xfa*yf';%直接拟合得到的结果 参考资料: 1.http://blog.csdn.net/lotus_

Matlab 最小二乘法拟合非线性函数

1.最小二乘原理 参考资料: 1.http://blog.csdn.net/lotus___/article/details/20546259 2.http://blog.sina.com.cn/s/blog_5404ea4f0101afth.html 2.matlab实现最小二乘法 利用matlab的最小二乘拟合函数对非线性函数进行拟合,具体地拟合的函数: [q r] = lsqcurvefit(fun, q_0, xdata, ydata);输入参数:fun:需要拟合的函数,假定有n个需要拟

线性模型的最小二乘法拟合(转)

我们知道在二维坐标中,已知两点就可以确定一个线性方程,如果有n个数据点(x1,y1),(x2,y2),...(xn,yn),那么就会有n个线性方程,我们使用最小二乘法从这n个方程中拟合出一个最佳的线性方程,也就是求出方程的参数a,b 设某个已知的一元线性方程的表达式为:y=a+bx有一组权重相等的测量数据(xi,yi),假定自变量xi的误差可以忽略,那么在某个自变量xi下,对应的测量数据为yi,线性方程上的点为a+bxi,二者的偏差为 di=yi-(a+bxi),如果测量数据yi恰好都落在线性方