最小二乘拟合C语言程序.pdf
最小二乘拟合C 语言程序
输入文件zuixiaoercheng_input.txt 中内容:
5 3
-2 -1 0 1 2
-0.1 0.1 0.4 0.9 1.6
代码部分:
#include
#include
#include
#include
#define p(k) (p+(k)*m)
#define pkx(k) (pkx+(k)*n)
double *x,*f,*p,*a,*b,*d,*pkx,*sx,*xishu;
int m,n;
void zhengjiaonihe();
void size(int *m,int *n);
void input(double x[],double f[],int m,int n);
void output(int n,double pkx[],double xishu[],double R);
double NeiJi(double *F,double *G,double *W);
void GetPk(int k);
void GetXiShu(int k);
double Wucha(int k);
void main()
{
zhengjiaonihe();
system("pause");
}
void zhengjiaonihe()
{
int k,i,j;
double t,R;
printf("\n 本程序是用正交函数作最小二乘拟合\n");
size(&m,&n);
x=(double *)malloc(sizeof(double)*m);
f=(double *)malloc(sizeof(double)*m);
p=(double *)malloc(sizeof(double)*m*n);
a=(double *)malloc(sizeof(double)*n);
b=(double *)malloc(sizeof(double)*n);
d=(double *)malloc(sizeof(double)*n);
pkx=(double *)malloc(sizeof(double)*n*n);
sx=(double *)malloc(sizeof(double)*m);
xishu=(double *)malloc(sizeof(double)*n);
input(x,f,m,n);
for (i=0;i
{
for (j=0;j
pkx(i)[j]=0; // pkx 初始化
}
for (k=0;k
{
p(0)[k]=1; // P0(x)=1;
}
pkx(0)[0]=1;
d[0]=NeiJi(f,p(0),p(0))/NeiJi(p(0),p(0),p(0));
GetXiShu(1);
R=Wucha(1);
a[1]=NeiJi(x,p(0),p(0))/NeiJi(p(0),p(0),p(0)); // α1=(xP1,P1)/(P1,P1)
pkx(1)[0]=-a[1];pkx(1)[1]=1;
for (k=0;k
p(1)[k]=x[k]-a[1]; // P1(x)=(x- α1)P0(x) P0(x)=1
d[1]=NeiJi(f,p(1),p(0))/NeiJi(p(1),p(1),p(0));
GetXiShu(2);
R=Wucha(2);
for (k=1;k
{
t=NeiJi(p(k),p(k),p(0));
a[k+1]=NeiJi(p(k),p(k),x)/t; // αk+1=(xPk,Pk)/(Pk,Pk)
b[k]=t/NeiJi(p(k-1),p(k-1),p(0)); // βk=(Pk,Pk)/(Pk-1,Pk-1)
GetPk(k+1); // 计算Pk(x)在各节点的函数值
d[k+1]=NeiJi(f,p(k+1),p(0))/NeiJi(p(k+1),p(k+1),p(0));
// ak=(f,Pk)/(Pk,Pk)
pkx(k+1