温度控制实习(大林算法C语言)

1、实习概述

       温度控制实习是一个用单片机控制温度的系统。首先通过温度传感器DS18B20检测到电热杯内水的温度,然后把温度数据送入单片机进行数据处理,与设定值进行比较,把采集到的温度送到数码显示管上显示,同时,通过调节可控硅导通角来控制电热杯的温度和升温速率,从而达到对电热杯的温度进行控制的目的。

2、实习原理

    (1)通过温度传感器DS18B20检测到电热杯的温度;

    (2)把采集到的温度送到数码显示管上显示;

    (3)通过调节可控硅占空比来控制电热杯的温度和升温速率,从而达到对电热杯的温度进行控制的目的。

3、大林算法

       大林算法是运用于自动控制领域中的一种算法,是一种先设计好闭环系统的响应再反过来综合调节器的方法。设计的数字控制器(算法)使闭环系统的特性为具有时间滞后的一阶惯性环节,且滞后时间与被控对象的滞后时间相同。此算法具有消除余差、对纯滞后有补偿作用等特点。

       本次的温度控制系统可以等价为一阶有迟滞系统,而这种系统的大林算法表达式形式一般一样,只是参数不一样,所以我们可以先假定出系统的表达式,然后进行设计,得到大林算法的一般表达式,然后带入我们的实验系统进行参数整定。

假定温度控制系统传递函数为:

 

首先定义中间变量,然后根据前面计算得到的大林算法公式,用C语言实现,同时还有进行限幅,以免超过PWM的周期。
long DaLin(float mubiao,float shiji)
{
	int b0=0.4,b1=0.2,a0=12,a1=8;
	static float error,last_error;
	static long DaLin_u,last_DaLin_u,last_DaLin_u1,DaLin_result;
	error = mubiao - shiji;
	DaLin_u = b0*last_DaLin_u + b1*last_DaLin_u1 + a0*error+a1*last_error;大林算法表达式
	last_error = error;
	last_DaLin_u1 = last_DaLin_u;
	last_DaLin_u = DaLin_u;
	DaLin_result = DaLin_u;
	if(error>=-0.6&&error<=0.6)				 //开始保温计时
	{
	    if(wendu<=49.5)		flag=1;
	    if(wendu>49.5&&wendu<=59.5)		flag=3;
			if(wendu>59.5)		flag=5;
	}
	if(DaLin_result > 60)	 		//离目标温度太大(实际温度过小)
		DaLin_result = 60;       //限幅
	if(DaLin_result < 0)			//超过目标温度
		DaLin_result = 0;
		DaLin_result=(int)DaLin_result;      //强制转换成整数
	return DaLin_result;
	
}

 

大林算法(Dulmage-Mendelsohn decomposition)是一种图论算法,用于将一个二分图(或称双向图)分解为一组最大匹配和一组最小点覆盖。 以下是一个基于C语言实现的大林算法示例: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAXN 100 // 最大顶点数 #define INF 0x7fffffff // 无穷大 int n; // 顶点数 int w[MAXN][MAXN]; // 邻接矩阵 int llink[MAXN], rlink[MAXN]; // 左、右侧顶点所连的顶点编号 bool visited[MAXN]; // 判断右半边的顶点是否被访问过 bool dfs(int u) { int v; for (v = 0; v < n; v++) { if (w[u][v] && !visited[v]) { visited[v] = true; if (rlink[v] == -1 || dfs(rlink[v])) { llink[u] = v; rlink[v] = u; return true; } } } return false; } int bipartite_matching() { int ans = 0; int i, j; for (i = 0; i < n; i++) { llink[i] = -1; rlink[i] = -1; } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { visited[j] = false; } if (dfs(i)) { ans++; } } return ans; } int min_vertex_cover() { int ans = bipartite_matching(); int i, j; bool left[MAXN], right[MAXN]; for (i = 0; i < n; i++) { left[i] = right[i] = false; } for (i = 0; i < n; i++) { if (llink[i] == -1) { left[i] = true; } } for (i = 0; i < n; i++) { if (llink[i] != -1) { for (j = 0; j < n; j++) { if (w[i][j] && rlink[j] == -1) { right[j] = true; } } } } for (i = 0; i < n; i++) { if (left[i]) { printf("%d ", i + 1); } } for (i = 0; i < n; i++) { if (right[i]) { printf("%d ", i + 1); } } printf("\n"); return ans; } int main() { int i, j; scanf("%d", &n); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &w[i][j]); } } printf("The size of minimum vertex cover is %d.\n", min_vertex_cover()); return 0; } ``` 注意,大林算法的时间复杂度是 $O(n^3)$,适用于顶点数较少的二分图分解。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值