⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 程序.txt

📁 基于最小二乘原理的正交多项式拟和输入原始数据及拟和次数即可输出最终拟和表达式系数
💻 TXT
字号:

/*(1)子函数原型
void ployfit (double x[],double y[],double Y[],double lamta[],double miu[],double omiga[],int n,int m)
double caclu (double a[],double b[],double omiga[],int n)
double f(double s[],double x,int k)
PRINT(double s[10][100],double a[100],double Y[],double lamta[],double miu[],double E,int m)
子函数  void ployfit()  用地推产生正交多项式系,即求 lamta和miu,并计算拟和多项式;
        caclu ()        计算点积;
        f()             计算各阶正交多项式在x点的值
        PRINT()         输出
(2) 形参和变量说明
    符号参数n 指定数据点数,(m-1) 指定正交多项式最高阶数,omiga 权重系数;
    形参 x[n],y[n],omiga[n] 由数据输入;
    Y[m] 存储拟和多项式系数,s[100][100] 存储各阶正交多项式系数,S[100][100]存储正交多项式值。
    lamta[100] 存储lamta miu[100] 存储miu E为误差*/ 
#include<stdio.h>
#include<string.h>
double caclu (double a[],double b[],double omiga[],int n)
{
	double z;int i;
	z=0;
	for(i=0;i<n;i++)
		z=z+a[i]*b[i]*omiga[i];
	return z;
}
double f(double s[],double x,int k)
{
	double y=0;
	int i;
	for(i=k-1;i>=0;i--)
		y=y*x+s[i];
	return y;
}
void PRINT(double s[100][100],double a[100],double Y[][100],double lamta[],double miu[],double E[],int m)
{   int ll,l;FILE *fp;
    fp=fopen("结果.txt","w+");
	fprintf(fp,"The result is:\n");
    for(l=0;l<m;l++){
		for(ll=0;ll<m;ll++)
		fprintf(fp,"Y[%d][%d]=%lf\t",l,ll,Y[l][ll]);
		fprintf(fp,"\n");
	}
	        printf("\n");
	for(ll=0;ll<m;ll++)
		{ fprintf(fp,"The S(%d) is:\n",ll);
	       for(l=0;l<m;l++)
		   fprintf(fp,"%lf\n",s[ll][l]);}
    fprintf(fp,"lamta\t\tmiu\t\ta\t\tE\n");
	for(l=0;l<m;l++)
	    fprintf(fp,"%lf\t%lf\t%lf\t%lf\n",lamta[l],miu[l],a[l],E[l]);  
}
double s[100][100],a[100],E[100];
void ployfit (double x[],double y[],double Y[][100],double lamta[],double miu[],double omiga[],int n,int m)
{
    static double s1[100];

    static  double  S[100][100],S1[100];
    double d,d1,d2,b;
	int k,i,j,l;
    for(i=0;i<n;i++)
	{
		S[0][i]=1;
		S1[i]=x[i];
	}
	s[0][0]=1.0;
	d=caclu (S[0],S[0],omiga,n);
	d2=caclu (S1,S[0],omiga,n);
	E[0]=caclu (y,y,omiga,n);
        s[1][0]=(-1)*d2/d;
	s[1][1]=1.0;
	s1[0]=0;
	lamta[0]=0;
	lamta[1]=d2/d;
	miu[0]=0;
	miu[1]=0;
	for(k=1;k<=m;k++)
	{
		for(i=0;i<n;i++)
		{
			S[k][i]=f(s[k],x[i],k+1);
			S1[i]=x[i]*S[k][i];
		}
		d1=caclu (S[k],S[k],omiga,n);
		d2=caclu (S1,S[k],omiga,n);
		b=caclu (y,S[k-1],omiga,n);
		a[k-1]=b/d;
		for(i=1;i<=k+1;i++)
		{
			s1[i]=s[k][i-1];
		}
		lamta[k+1]=d2/d1;
		miu[k+1]=d1/d;
		for(j=0;j<m;j++)
			for(l=0;l<k;l++)
				Y[k-1][j]+=a[l]*s[l][j];
		for(i=0;i<=k+1;i++)
		{
		   s[k+1][i]=s1[i]-lamta[k+1]*s[k][i]-miu[k+1]*s[k-1][i];
		}
		
		E[k]=E[k-1]-a[k-1]*a[k-1]*d;
                d=d1;
	}
	     
	
		PRINT(s,a,Y,lamta,miu,E,m);


}
double Y[100][100];
double lamta[100],miu[100];
void main()
{  static double x[100], y[100],omiga[100];
    int i,n, m;
	FILE  * fp;
	 fp=fopen("原始数据.txt","r");
	 if(fp==NULL)
	 printf("Can not open file !") ;
	 fscanf(fp,"%d%d",&n,&m);
	 for(i=0;i<=n-1;i++)
      fscanf(fp,"%lf%lf%lf",&x[i],&y[i],&omiga[i]); 
	 fclose(fp);
	ployfit(x,y,Y,lamta,miu,omiga,n,m);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -