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

📄 ywls.c

📁 遗忘因子法递推算法用于估计数学模型的参数,精确度较高!
💻 C
字号:
//////////////////////////////////////////////
// 用遗忘因子法递推法估计参数:				//	
// 数据读入:m序列和白噪声分别由m.txt文件   //
// 和whitenoise.txt文件中读入,             //
// 程序执行结果存入"递推结果.txt"中。       //
//////////////////////////////////////////////
#include <stdio.h>
#include <math.h>
#include "brmul.c"
#define L 1000
#define N 900
#define a 1000
void main()
{ 
	int i,j,m;
	double s=0.99;
	double d1[2]={0.8,0.5},d2[2]={0.6,0.3};
	double u[L],e[L],y[L];
	double B[2][N],k[2][1],p[2][2];
	double w[2][1],wt[1][2],kwt[2][2];
	double wtb,b[2],pw[2][1],wtp[1][2],wtpw,pwwtp[2][2];
	FILE *fp1,*fp2,*fp3;
	fp1=fopen("m.txt","r");
	fp2=fopen("whitenoise.txt","r");
	fp3=fopen("递推结果.txt","w");
	for(i=0;i<L;i++)
	{ 
		fscanf(fp1,"%lf",&u[i]);//读入输入
		fscanf(fp2,"%lf",&e[i]);//读入白噪声
	}
	fclose(fp1);
	fclose(fp2);
	y[0]=e[0];
	for(i=1;i<L;i++)
	{  
		if (i<300)
			y[i]=-0.8*y[i-1]+0.5*u[i-1]+e[i];//求出输出
		else 
			y[i]=-0.6*y[i-1]+0.3*u[i-1]+e[i];
	}
	for(i=0;i<2;i++)
		for(j=0;j<2;j++)
		{ 
			if(i==j)
				p[i][j]=pow(a,2);//给P赋初值
			else 
				p[i][j]=0;
		}
	for(i=0;i<2;i++)//给b赋初值
		b[i]=0;
	for(m=0;m<N;m++)//循环计算
	{
		wtpw=0;
   		w[0][0]=-y[1+m];
		wt[0][0]=w[0][0];
		w[1][0]=u[1+m];
		wt[0][1]=w[1][0];
		brmul(wt,p,1,2,2,wtp);
		for(i=0;i<2;i++)
			wtpw=wtpw+wtp[0][i]*w[i][0];
		brmul(p,w,2,2,1,pw);
		for(i=0;i<2;i++)
			k[i][0]=pw[i][0]/(s+wtpw);
		brmul(k,wt,2,1,2,kwt);
		brmul(pw,wtp,2,1,2,pwwtp);
		for(i=0;i<2;i++)
			for(j=0;j<2;j++)
			{  
				p[i][j]=p[i][j]-pwwtp[i][j]/(s+wtpw);
			   	p[i][j]=p[i][j]/s;
			}
		wtb=0;
		for(i=0;i<2;i++)
			wtb=wtb+wt[0][i]*b[i];
		for(i=0;i<2;i++)
		b[i]=k[i][0]*(y[m+2]-wtb)+b[i];
		for(i=0;i<2;i++)
			B[i][m]=b[i];
	}
	for(i=0;i<2;i++)//最后结果
		printf("%lf   ",b[i]);
	printf("\n");
	printf("误差:\n");
	for(i=0;i<2;i++)
		printf("%lf   ",b[i]-d2[i]);
	for(i=0;i<N;i++)
	{ 
		for(j=0;j<2;j++)
			fprintf(fp3,"%lf    ",B[j][i]);
		fprintf(fp3,"\n");  
	}
	fclose(fp3);
}

⌨️ 快捷键说明

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