当前位置:文档之家› 曲线拟合最小二乘法c++程序

曲线拟合最小二乘法c++程序

课题八曲线拟合的最小二乘法
实验目标:
在某冶炼过程中,通过实验检测得到含碳量与时间关系的数据如下,试求含碳量y与时间t
#include<iostream>
#include<>
using namespace std;
int Array(double ***Arr, int n){
double **p;
int i;
p=(double **)malloc(n*sizeof(double *));
if(!p)return 0;
for(i=0;i<n;i++)
{
p[i]=(double *)malloc(n*sizeof(double));
if(!p[i])return 0;
}
*Arr=p;
return 1;
}
void main(){
int n,i,j,k;
double **A,*B,*S;
S=new double[3];
B=new double[3];
cout<<"共2有®DN个节¨²点Ì:êo";
cin>>n;
cout<<"请输º入¨节¨²点Ì值¦Ì(ê¡§Xi)ê:êo"<<endl;
double *X;
X = new double[n];
for(i=0;i<n;i++){
cin>>X[i];
}
cout<<"请输º入¨节¨²点Ì函¡¥数ºy值¦Ì(ê¡§Yi)ê:êo"<<endl;double *Y;
Y = new double[n];
for(i=0;i<n;i++){
cin>>Y[i];
}
if(!Array(&A,3))
cout<<"内¨²存ä分¤配失º¡ì败㨹!ê"; else
{
for(i=0;i<3;i++){
for(j=0;j<3;j++){
A[i][j]=0;
}
}
for(i=0;i<n;i++){
A[0][0]+=1;// cout<<A[0][0];
A[0][1]+=X[i];
A[0][2]+=X[i]*X[i];
A[1][0]=A[0][1];
A[1][1]=A[0][2];
A[1][2]+=X[i]*X[i]*X[i];
A[2][0]=A[0][2];
A[2][1]=A[1][2];
A[2][2]+=X[i]*X[i]*X[i]*X[i];
}
}
for(i=0;i<3;i++){
B[i]=0;
}
for(i=0;i<n;i++){
B[0]+=Y[i];
B[1]+=X[i]*Y[i];
B[2]+=X[i]*X[i]*Y[i];
}
for( k = 0; k < 2 ;k++)
{
for(i = k+1; i<3; i++)
{
double T = A[i][k]/A[k][k];
B[i] = B[i] - T * B[k];
for ( j = k+1 ; j < 3 ; j++ )
{
A[i][j] = A[i][j] - T * A[k][j];
}
}
}
S[2] = B[2]/A[2][2];
for (i = 1; i >=0 ; i--)
{
double Temp = 0;
for (int j = i+1; j<2 ;j++)
Temp = Temp + A[i][j] * S[j];
S[i] = (B[i] - Temp) /A[i][i];
}
cout<<"拟a合曲¨²线为a:êo"<<endl;
cout<<"y="<<S[0]<<" + "<<S[1]<<" x + "<<S[2]<<"
x^2 "<<endl<<endl
<<"误¨®差为a:êo"<<endl;
for(i=0;i<n;i++){
cout<<"Y"<<i<<"-Y(t"<<i<<")="<<S[0]+S[i]*X[i]+S[2]*X[i ]*X[i]-Y[i]<<endl;
}
}。

相关主题