哥们 你真神了 谢谢 小弟试一下啊 呵呵
先别客气,还缺主函数哩。一会儿调不出来的话,请发来有待拟合的N个点的(x,y)。
哥们,要处理好那三个形参指针!!!
二元回归得有两个变量X1 X2 Y是函数 拟合出Y=B0+B1X1+B2X2
X1 X2 Y
9333.000000 9333.000000 9333.000000
9005.000000 18338.000000 18010.000000
8756.000000 27094.000000 26268.000000
8036.000000 35130.000000 32144.000000
7773.000000 42903.000000 38865.000000
5738.000000 48641.000000 34428.000000
7130.000000 55771.000000 49910.000000
6779.000000 62550.000000 54232.000000
一共8组 我调用这个函数的时候出现问题 说N有问题 哥们你在帮忙看一下吧 谢谢了
我想在这个函数中直接把得到的ABC值输出到一个文件中 哥们也帮我弄一下吧
我要回家了,明天再来看,我还有点不明白,你先看看我的理解。
对于曲线拟和。。。。(二维)是在坐标平面给定一些列的已知的点(x,y) 首先观察曲线形状,如果是随着x增加而向上调的,设定方程为
Y = C0 + C1 * X + C2 * (X*X) + C3 * (X*X*X) + ....+ Cn * (X的n次幂)
一般选取n = 3 就够了,曲线向下的x的幂要为负值,而且定义的方程也不一样。这才是曲线拟和嘛!
你搞的是什么曲线拟和?你先给我讲讲数学,至于把B0B1B2三个常数输入文件,很简单地,自己看基础书就可以搞定。
#include<stdio.h>
void RENRTU (int N,double A[][4]);
void RABXCY (int N,double X[],double Y[],double Z[],
double *A,double *B,double *C)
{
double XK[6],YK[3],AY[3][4];
int NN=3,I;
for(I=0;I<6;I++)
{
XK[I]=0.0;
}
for(I=0;I<3;I++)
{
YK[I]=0.0;
}
XK[0]=N;
for(I=0;I<N;I++)
{
XK[1]+=X[I];
XK[2]+=Y[I];
XK[3]+=X[I]*Y[I];
XK[4]+=Y[I]*Y[I];
XK[5]+=X[I]*X[I];
YK[0]+=Z[I];
YK[1]+=Z[I]*X[I];
YK[2]+=Y[I]*Z[I];
}
AY[0][0]=XK[0];
AY[0][1]=XK[1];
AY[0][2]=XK[2];
AY[0][3]=YK[0];
AY[1][0]=XK[1];
AY[1][1]=XK[5];
AY[1][2]=XK[3];
AY[1][3]=YK[1];
AY[2][0]=XK[2];
AY[2][1]=XK[3];
AY[2][2]=XK[4];
AY[2][3]=YK[2];
RENRTU(NN,AY);
*A=AY[0][3];
*B=AY[1][2];
*C=AY[2][3];
}
void RENRTU(int N,double A[3][4])
{
double P,AIK;
int I,J,K,M=N+1;
for(K=1;K<=N;K++)
{
P=A[K-1][K-1];
for(J=K;J<=N;J++)
A[K-1][J-1]/=P;
for(I=1;I<=N;I++)
{
if(I==K)continue;
AIK=A[I-1][K-1];
for(J=K;J<=N;J++)
A[I-1][J-1]-=AIK*A[K-1][J-1];
}
}
}
int main()
{ double A,B,C;
double X1[]={ 9333.000000, 9005.000000, 8756.000000, 8036.000000,
7773.000000, 5738.000000, 7130.000000, 6779.000000};
double X2[]={ 9333.000000,18338.000000,27094.000000,35130.000000,
42903.000000,48641.000000,55771.000000,62550.000000};
double Y[ ]={ 9333.000000,18010.000000,26268.000000,32144.000000,
38865.000000,34428.000000,49910.000000,54232.000000};
RABXCY(8,X1,X2,Y,&A,&B,&C);
printf("%lf,%lf,%lf\n",A,B,C);
return 0;
}