首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用C++实现曲线拟合方面的操作?高手解答~多谢

2012-03-22 
如何用C++实现曲线拟合方面的操作?高手解答~谢谢给定了一个方程v(t)V-(V-V0)exp(-t/t1)且V10然后给出了

如何用C++实现曲线拟合方面的操作?高手解答~谢谢
给定了一个方程
v(t)=V-(V-V0)exp(-t/t1)且V=10;
然后给出了很多v(t)和t的实际数据点,通过这些点要求t1和V0的值,请问用C++如何实现?
谢谢高手指教,虚心学习了~~~~

[解决办法]
v(t)=V-(V-V0)exp(-t/t1)且V=10 
=> exp(-t/t1) = (10-v(t))/(10-V0)
=> t = -t1*ln(10-v(t)) + t1*ln(10-V0) 
令 x = ln(V-v(t)), a = t1, b = t1*ln(10-V0)
t = -a*x + b 
最小二乘法,线性拟合 得a、b
=>t1 = a, V0 =10 - exp(b/a );
[解决办法]
最小二乘法曲线拟合
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;
}


热点排行