VC++的MFC实现的最小二乘法曲线拟合?

要求做成类似于计算器似得东西,输入数值返回结果。本人对编程几乎是一窍不通,请高人帮忙..求详细解答...
应用最小二乘法进行二次曲线拟合,要求用MFC,输入一些数值点,返回二次曲线系数a= ,b= c= 以及相关系数γ= 。

BOOL YLF_Curve_CalPolyFactor(//计算多项式系数 calculate polynomial fact
/*************************输入***************************/
double *x_in,//拟合前数据点X轴坐标数组
double *y_in,//拟合前数据点Y轴坐标数组
unsigned long num_out,//拟合后输出数据点组数
unsigned int nSimulateNum,//拟合方式(可选值1-4次曲线)
/*************************输出***************************/
double *factor//factor(长度固定为5)
)
{
if (0 < num_out)
{
double dbfactor[5];//系数数组
double *pdbX,*pdbY;//x,y数组零时变量

pdbX = new double[num_out];
pdbY = new double[num_out];
memcpy(pdbX,x_in,sizeof(double)*num_out);
memcpy(pdbY,y_in,sizeof(double)*num_out);

double *b;
b = dbfactor;
int n = num_out;
int m = nSimulateNum;
int i, j, k, l;
double B[6][7];
double temp, det;
temp = det = 0.0f;
BOOL BreakFlag;
double *CurveX, *CurveY,*CurveS;
CurveX = new double[n];
CurveY = new double[n];
CurveS = new double[n];
ZeroMemory(B, 4 * 6 * 7);
ZeroMemory(CurveX, n);
ZeroMemory(CurveY, n);
ZeroMemory(CurveS, n);

for(i = 0; i < n; i++)
{
CurveX[i] = pdbX[i];
CurveY[i] = pdbY[i];
}
for(i = 0; i < 5; i++)
{
for(j = 0; j < 6; j++)
{
B[i][j] = 0;
}
}
B[0][0] = (double)n;
CurveS[0] = CurveX[0];
B[0][m + 1] = CurveY[0];
B[1][m + 1] = CurveY[0] * CurveX[0];
B[1][0] = CurveX[0];

for(k = 1; k < n; k++)
{
B[0][m + 1] = B[0][m + 1] + CurveY[k];
B[1][m + 1] = B[1][m + 1] + CurveY[k] * CurveX[k];
B[1][0] = B[1][0] + CurveX[k];
CurveS[k] = CurveX[k];
}

B[0][1] = B[1][0];
for(i = 2; i < m + 1; i++)
{
temp = 0;
B[i][m + 1] = 0;
for(k = 0; k < n; k++)
{
CurveS[k] = CurveS[k] * CurveX[k];
B[i][m + 1] = B[i][m + 1] + CurveY[k] * CurveS[k];
temp += CurveS[k];
}
for(j = 0; j < i + 1; j++)
{
l = i - j;
B[l][j] = temp;
}
}

for(j = 1; j < m + 1; j++)
{
temp = 0;
for(k = 0; k < n; k++)
{
CurveS[k] = CurveS[k] * CurveX[k];
temp = temp + CurveS[k];
}
for(i = m; i >= j; i--)
{
l = m + j - i;
B[i][l] = temp;
}
}

BreakFlag = FALSE;
for(i = 0; i < m; i++)
{
det = B[i][i];
for(j = i; j < m + 2; j++)
{
if(fabs(det) > 0.00001)
B[i][j] = B[i][j] * 1.0f / det;
else
{
BreakFlag = TRUE;
break;
}
}
if(BreakFlag == TRUE)
break;
for(j = i + 1; j < m + 1; j++)
{
det = B[j][i];
for(k = 0; k < m + 2; k++)
{
B[j][k] = B[j][k] - det * B[i][k];
}
}
}
if(BreakFlag)
{
delete []CurveX;
delete []CurveY;
delete []CurveS;
delete []pdbX;
delete []pdbY;

::MessageBox(NULL,"离散点数据数组无效!请检验有效性。","错误提示",MB_OK|MB_ICONWARNING);
return FALSE;//数据不合理
}

B[m][m + 1] = B[m][m + 1] * 1.0f / B[m][m];
B[m][m] = 1;

for(i = m - 1; i >= 0; i--)
{
for(k = 1; k < m - i + 1; k++)
{
det = B[i][i + k];
for(j = 0; j < m + 2; j++)
{
B[i][j] = B[i][j] - B[i + k][j] * det;
}
}
}
for(i = 0; i < m + 1; i++)
b[i] = B[i][m + 1];
delete []CurveX;
delete []CurveY;
delete []CurveS;
delete []pdbX;
delete []pdbY;

//输出系数数据数组
memcpy(factor,dbfactor,5*sizeof(double));

return TRUE;
}
else return FALSE;
}追问

能把程序打包发我邮箱里面么?不胜感谢pg0612@126.com....感激不尽啊!~

追答

效果图,源码已经发送到你邮箱。有用记得给分。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-02
void CYourDlg::linearReg_Y_a0_a1X(double &a0, double &a1, const CArray<double,double> & X_Con_Lin_Reg, const CArray<double,double> & Y_Volts_Lin_Reg) { double sumXiYi(0.0), sumXi(0.0), sumYi(0.0), sumXi_2(0.0), X_Average(0.0), Y_Average(0.0); INT_PTR n = X_Con_Lin_Reg.GetSize(); for (int i=0; i<n; i++) { sumXiYi += X_Con_Lin_Reg[i]*Y_Volts_Lin_Reg[i]; sumXi += X_Con_Lin_Reg[i]; sumYi += Y_Volts_Lin_Reg[i]; sumXi_2 += X_Con_Lin_Reg[i]*X_Con_Lin_Reg[i]; } /*求平均值*/X_Average = sumXi/n; Y_Average = sumYi/n; /*y=a0+a1x*/a1 = (sumXiYi-n*X_Average*Y_Average)/(sumXi_2-n*X_Average*X_Average); a0 = Y_Average – a1*X_Average; }
第2个回答  2020-07-01
求发源码1264958401@qq.com
感激不尽
第3个回答  2012-05-25
可以给我发一份吗?727889069@qq.com 万分感谢
第4个回答  2012-01-31
楼主,我导师让我编这个程序,我一头雾水,您可以把收到的答案发我一份吗?感激涕零啊

VC++的MFC实现的最小二乘法曲线拟合?
double *x_in,\/\/拟合前数据点X轴坐标数组 double *y_in,\/\/拟合前数据点Y轴坐标数组 unsigned long num_out,\/\/拟合后输出数据点组数 unsigned int nSimulateNum,\/\/拟合方式(可选值1-4次曲线)\/***输出***\/ double *factor\/\/factor(长度固定为5)){ if (0 < num_out){ double dbfactor[...

求C或C++语言编写的用最小二乘法进行曲线拟合
但是实际拟合出来的表达式为y=a[3]+a[2]t+a[1]t^2+a[0]t^3会有个常数项的。简单的讲,所谓拟合是指已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1, λ2,…,λ3), 使得该函数与已知点集的差别(最小二乘意义)最小。如果待定函数是线性,就叫线性拟合...

基于最小二乘法的多项式曲线拟合:从原理到c++实现
首先,介绍最小二乘法原理以及多项式拟合方法的两种实现方式:代数方式和矩阵方式。代数方式涉及求解多项式系数的公式推导,矩阵方式利用矩阵运算简化求解过程。接着,基于OpenCV库,以C++语言编写代码实现这两种方法。最后,通过一个完整的示例展示如何通过离散点集拟合出一条多项式曲线。代数方式求解过程中,首先...

关于VC的最小二乘法曲线拟合算法问题
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;...

最小二乘法三次多项式曲线拟合 算法 MFC实现的 急用 万分感激
先求解一个 最小二乘问题 ,即解一个 超定方程组 (得到 三次曲线 系数)再用MFC中的画图函数离散的画出这个三次曲线(注意MFC中的坐标是矩阵坐标,也就是说原点位于左上角)

最小二乘法拟合曲线
最小二乘法多项式曲线是根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y=φ(x)。按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。为了使其尽可能反映所给数据的变化趋势,我们可以要求偏差的绝对值尽可能小,甚至是所有偏差...

最小二乘法多项式曲线拟合原理与实现
最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x)。给定数据点pi(xi,yi),其中i=1,2,…,m。求近似曲线y= φ(x)。并且使得近似曲线与y=f(x)的偏差最小。近似曲线在点pi处的偏差δi= φ(xi)-y,i=1,2,...,m。1...

python_numpy最小二乘法的曲线拟合
在了解了最小二乘法的基本原理之后 python_numpy实用的最小二乘法理解 ,就可以用最小二乘法做曲线拟合了 从结果中可以看出,直线拟合并不能对拟合数据达到很好的效果,下面我们介绍一下曲线拟合。b=[y1] [y2] ... [y100]解得拟合函数的系数[a,b,c...d] CODE:根据结果可以看到...

我是一个电工(大专毕业)现在工作已经3年了,由于专业知识有限现在工作遇 ...
所以辨识课上最为强调的两个概念:作为输入的M序列,和最小二乘法。这两个概念都万分重要,不仅仅在辨识课上。课程进入正题后,课堂火力就基本集中在最小二乘法上了,将它精确的肢解,方方面面决无遗漏。未窥全豹仅见一斑,给人感觉:系统辨识等于最小二乘。这点上,个人觉得萧老师处理得不够大气。不过据内部人士的...

matlab最小二乘法曲线拟合怎么取?
最常用的曲线拟合方法是最小二乘法,该方法是寻找函数使得最小。\\x0d\\x0aMATLAB函数:p=polyfit(x,y,n)\\x0d\\x0a[p,s]= polyfit(x,y,n)\\x0d\\x0a说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵s用于生成预测值的误差估计。(见下一...

相似回答