一文速学-最小二乘法曲线拟合算法详解+项目代码

Posted fanstuck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文速学-最小二乘法曲线拟合算法详解+项目代码相关的知识,希望对你有一定的参考价值。

目录

前言

一、曲线拟合策略

二、最小二乘法理论基础

1.残差

原理

特征

<

关于VC的最小二乘法曲线拟合算法问题

VC的最小二乘法曲线拟合算法谁能给我一个例子看看,最好有曲线显示。

谢谢。
魔老大,太帅了。
你图的源代码可以都给我吗?200分了
小妹感激不尽啊
linda@foxmail.com

给你2个作参考:

第一个:
//最小二乘法曲线拟合
typedef CArray<double,double>CDoubleArray;
BOOL CalculateCurveParameter(CDoubleArray *X,CDoubleArray *Y,long M,long N,CDoubleArray *A)

//X,Y -- X,Y两轴的坐标
//M -- 结果变量组数
//N -- 采样数目
//A -- 结果参数

register long i,j,k;
double Z,D1,D2,C,P,G,Q;
CDoubleArray B,T,S;
B.SetSize(N);
T.SetSize(N);
S.SetSize(N);
if(M>N)M=N;
for(i=0;i<M;i++)
(*A)[i]=0;
Z=0;
B[0]=1;
D1=N;
P=0;
C=0;
for(i=0;i<N;i++)

P=P+(*X)[i]-Z;
C=C+(*Y)[i];

C=C/D1;
P=P/D1;
(*A)[0]=C*B[0];
if(M>1)

T[1]=1;
T[0]=-P;
D2=0;
C=0;
G=0;
for(i=0;i<N;i++)

Q=(*X)[i]-Z-P;
D2=D2+Q*Q;
C=(*Y)[i]*Q+C;
G=((*X)[i]-Z)*Q*Q+G;

C=C/D2;
P=G/D2;
Q=D2/D1;
D1=D2;
(*A)[1]=C*T[1];
(*A)[0]=C*T[0]+(*A)[0];

for(j=2;j<M;j++)

S[j]=T[j-1];
S[j-1]=-P*T[j-1]+T[j-2];
if(j>=3)

for(k=j-2;k>=1;k--)
S[k]=-P*T[k]+T[k-1]-Q*B[k];

S[0]=-P*T[0]-Q*B[0];
D2=0;
C=0;
G=0;
for(i=0;i<N;i++)

Q=S[j];
for(k=j-1;k>=0;k--)
Q=Q*((*X)[i]-Z)+S[k];
D2=D2+Q*Q;
C=(*Y)[i]*Q+C;
G=((*X)[i]-Z)*Q*Q+G;

C=C/D2;
P=G/D2;
Q=D2/D1;
D1=D2;
(*A)[j]=C*S[j];
T[j]=S[j];
for(k=j-1;k>=0;k--)

(*A)[k]=C*S[k]+(*A)[k];
B[k]=T[k];
T[k]=S[k];


return TRUE;


第二个(这个比较全面)
#ifndef Z_MIN2MUL_H_
#define Z_MIN2MUL_H_

//defination

#include "stdlib.h"
#include "memory.h"
typedef void (* MIN2MUL_FUN)(long percent/* 当前任务完成的百分比*/);
class CMin2Mul

public:
/////////////////////////////////////////////////////////
//construct
CMin2Mul(long m,long n)

m_m=m;
m_n=n;
AllocAllMemory();

CMin2Mul()

m_m=0;
m_n=0;
m_A=NULL;
m_B=NULL;
m_X=NULL;


//destruction
virtual ~CMin2Mul()

FreeAllMemory();

////////////////////////////////////////////////////////

private:
long m_m;
long m_n;
double* m_A,*m_B,*m_X,*m_Normal/*法方程矩阵*/,*m_BNormal;
double m_Error;
long m_IterNum;

double * m_temp;
//
MIN2MUL_FUN m_callback;
//opration
public:
void SetA(long i,long j,double dValue)
*(m_A+i*m_n+j)=dValue;

void SetB(long i,double dValue)
*(m_B+i)=dValue;

double GetX(long i)
return *(m_X+i);

double* GetXP()
return m_X;

void SetError(double error)
m_Error=error;

double GetError()
return m_Error;

long GetIterNum()
return m_IterNum;
void SetAB(long m,long n,double*a,double*b)

m_m=m;
m_n=n;
AllocAllMemory();
// initialize a
memcpy(m_A,a,sizeof(double)*m_m*m_n);
memcpy(m_B,b,sizeof(double)*m_m);

//解求 AX=B
long DoAXB()

if(m_n!=m_m)
return -1;//error must be m_m==m_n
Seidel(m_A,m_X,m_B);
return 1;

//解求 AX=B的最小二乘解
long DoMin2Mul()

long i,j,k;
double t;
if(m_n>m_m)
return -3;//error must be m_m>=m_n
if(m_n==0||m_m==0)
return -1;//error

m_Normal=(double*)malloc(sizeof(double)*m_n*m_n);
if(m_Normal==NULL)return -2;//error to alloc memory

m_BNormal=(double*)malloc(sizeof(double)*m_n);
if(m_BNormal==NULL)

free(m_Normal);
m_Normal=NULL;
return -2;//error to alloc memory

//construct normal metrix
//m_Normal[i,j]=AT[i,k]*A[k,j]=A[k,i]*A[k,j]
for(i=0;i<m_n;++i)

for(j=0;j<m_n;++j)

t=0.0;
for(k=0;k<m_m;++k)

t+=*(m_A+k*m_n+i)**(m_A+k*m_n+j);

*(m_Normal+i*m_n+j)=t;


// bNormal[i]=AT[i,k]*B[k]=A[k,i]*B[k]
for(i=0;i<m_n;++i)


t=0.0;
for(k=0;k<m_m;++k)

t+=*(m_A+k*m_n+i)**(m_B+k);

*(m_BNormal+i)=t;



Seidel(m_Normal,m_X,m_BNormal);

free(m_Normal);
free(m_BNormal);
m_BNormal=NULL;
m_Normal=NULL;
return 1;


//output
/* void print()

long i;
printf("\n===============RESULT===============\n");
for(i=0;i<m_n;++i)
printf("%.4f\n",*(m_X+i));
printf("\n=====%d",m_IterNum);
*/
private:
void Seidel(double *a,double*x,double*b)

long i,j;
double t;
m_IterNum=0;
// construct init 迭代矩阵
for( i=0;i<m_n;++i)

for( j=0;j<m_n;j++)

if(i==j)

continue;

else

//need detect a[i,j] is not 0
*(a+i*m_n+j)/=-*(a+i*m_n+i);


*(b+i)/=*(a+i*m_n+i);
*(a+i*m_n+i)=0.0;

//
do

memcpy(m_temp,x,sizeof(double)*m_n);
for(i=0;i<m_n;++i)

t=0.0;
for(j=0;j<m_n;j++)

t+=*(a+i*m_n+j)**(x+j);

*(x+i)=t+*(b+i);

++m_IterNum;
while(NeedMore(x));



bool NeedMore(double* x)

long i;
for(i=0;i<m_n;++i)

//abs(m_temp[i]-x[i])<m_Error
if((*(m_temp+i)-*(x+i))<m_Error &&
(*(x+i)-*(m_temp+i))<m_Error)
continue;
else
return true;

return false;


long AllocAllMemory()

m_A=(double*)malloc(sizeof(double)*m_m*m_n);
m_B=(double*)malloc(sizeof(double)*m_m);
m_X=(double*)malloc(sizeof(double)*m_n);
m_temp=(double*)malloc(sizeof(double)*m_m);
memset((void*)m_A,0,sizeof(double)*m_m*m_n);
memset((void*)m_B,0,sizeof(double)*m_m);
memset((void*)m_X,0,sizeof(double)*m_n);
memset((void*)m_temp,0,sizeof(double)*m_m);

//set error
m_Error=0.00001;
//initialize iterNum
m_IterNum=0;
m_Normal=NULL;
return 1;//true

void FreeAllMemory()

if(m_temp!=NULL)free(m_temp);
if(m_X!=NULL)free(m_X);
if(m_A!=NULL)free(m_A);
if(m_B!=NULL)free(m_B);


;

#endif
参考技术A

以前写过一个类似的软件,你要吗? 

也不留个联 系方法

呵呵,发给你了!

本回答被提问者采纳

以上是关于一文速学-最小二乘法曲线拟合算法详解+项目代码的主要内容,如果未能解决你的问题,请参考以下文章

谁能给一个java编写的利用最小二乘法进行曲线拟合的算法?

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

原创算法分享最小二乘法

Python最小二乘法拟合与作图

一文速学-时间序列分析算法之指数平滑法详解+Python代码实现

一文速学-时间序列分析算法之移动平均模型(MA)详解+Python实例代码