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

📄 dalin.c

📁 计算机控制算法仿真实验,利用C语言编程,适合学习计算机控制原理的学生进行控制算法验证
💻 C
字号:
//本程序是针对G(s)=(8*e^(-4s))/(1+2s)设计的大林算法,可以进行无振铃和有振铃实验,以及有振铃时消除振铃的实验
//L=20,用劳斯判据判断特征根是否在z平面的左半平面的简单方法,特征方程为1-e^(-T/Tm_)*z^(-1)-(1-e^(-T/Tm_))*z^(-21)=0
//即对特征方程为z^(21)-e^(-T/Tm_)*z^(20)-(1-e^(-T/Tm_))=0直接列劳斯阵列表
//判断有几次符号改变,即可知道右半平面极点数,反过来也就知道左半平面极点数,然后用消除振铃现象的方法,进行消除振铃现象的实验
#include	<stdio.h>
#include	<dos.h>
#include	<math.h>
#include	<bios.h>
#include	<conio.h>
#include	<graphics.h>
#define	BASE_LINE1	190
#define	BASE_LINE2	320
#define	BASE_LINE3	420

#define M 10

double	a,b,c,d,p,q,t,y1_t,y1_kT,y1_kT_[20],y1_t_[200];
double	y_kT,e_kT,e_kT_T,u_kT,u_kT_T,u_kT_21T,u_kT_[22],Tm,Tm_,T,l,K;

int	i,j,m,gdrive=VGA,gmode=VGAHI;
unsigned char   exit_f;
int	scan_keyboard_result;

void	ji_suan(void){
	p=1.0-exp(-0.5*t);	q=exp(-0.5*t);
}

void	work0(void)
{	i=1;	j=1;
	do{
		if(j==M)	t=T;
		else	t=T*((double)j/(double)M);
		ji_suan();
		y1_t=p*8.0*u_kT+q*y1_kT;
		for(m=198;m>=0;m--)	y1_t_[m+1]=y1_t_[m];
		y1_t_[0]=y1_t;
		if(j==M){
			y1_kT=y1_t;
			for(m=18;m>=0;m--)	y1_kT_[m+1]=y1_kT_[m];
			y1_kT_[0]=y1_kT;
			y_kT=y1_kT_[19];
			e_kT=1.0-y_kT;
			for(m=20;m>=0;m--)	u_kT_[m+1]=u_kT_[m];
			u_kT_21T=u_kT_[21];
			u_kT_T=u_kT_[1];
			u_kT=a*e_kT+b*e_kT_T+c*u_kT_T+d*u_kT_21T;
			u_kT_[0]=u_kT;
			e_kT_T=e_kT;
		}
		setcolor(GREEN);	moveto(i,250-(int)(150.0*y1_t_[199]));lineto(i,250-(int)(150.0*y1_t_[199]+1));	//对象连续输出响应
		setcolor(BLUE);		moveto(i,250-(int)(150.0*e_kT));lineto(i,250-(int)(150.0*e_kT+1.0));	//离散误差输出响应
		setcolor(YELLOW);	moveto(i,400-(int)(150.0*u_kT));lineto(i,400-(int)(150.0*u_kT+1.0));
		i=i+1;	j+=1;
		if(j==M+1)	j=1;
		if(i>639)	{	exit_f=1;	}
		delay(20);
	}while(exit_f == 0);
	printf("Please press ESC key & Exit!\n");
	exit_f=0;
	do{	delay(20);
		if(bioskey(1)!=0){
			scan_keyboard_result=bioskey(0);
			if(scan_keyboard_result==0x011b)	exit_f=1;
		}
	}while(exit_f == 0);
	closegraph();
}

void	main(void)
{       int n;
	i=0;
	j=0;
	exit_f=0;
//	Tm=2.0;Tm_=0.5;T=0.2;l=20.0;K=8.0;	//Tm_<Tm时,会产生振玲现象,本行是有振玲条件,同学还通过改变Tm_观察波形变化
	Tm=2.0;Tm_=3.0;T=0.2;l=20.0;K=8.0;	//Tm_>Tm时,不会产生振玲现象,本行是无振玲条件,同学还通过改变Tm_观察波形变化
	a=(1-exp(-T/Tm_))/(K*(1-exp(-T/Tm)));
	b=-a*exp(-T/Tm);
	c=exp(-T/Tm_);
	d=(1-exp(-T/Tm_));
	for(n=0;n<200;n++)	y1_t_[n]=0.0;
	for(n=0;n<20;n++)	y1_kT_[n]=0.0;
	for(n=0;n<22;n++)	u_kT_[n]=0.0;
	initgraph(&gdrive,&gmode,"e:\\bc\\bgi");
	u_kT_21T=u_kT_[21];
	u_kT_T=u_kT_[1];
	e_kT_T=0.0;
	y_kT=y1_kT_[19];
	e_kT=1.0-y_kT;
	u_kT=a*e_kT+b*e_kT_T+c*u_kT_T+d*u_kT_21T;
	e_kT_T=e_kT;
	y1_t=0.0;
	y1_kT=0.0;
	y1_t_[0]=y1_t;
	y1_kT_[0]=y1_kT;
	u_kT_[0]=u_kT;
	setcolor(GREEN);	moveto(i,250-(int)(150.0*y1_t));lineto(i,250-(int)(150.0*y1_t+1));	//对象连续输出响应
	setcolor(BLUE);		moveto(i,250-(int)(150.0*e_kT));lineto(i,250-(int)(150.0*e_kT+1.0));	//离散误差输出响应
	setcolor(YELLOW);	moveto(i,400-(int)(150.0*u_kT));lineto(i,400-(int)(150.0*u_kT+1.0));
	work0();
}

⌨️ 快捷键说明

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