当前位置: 首页 > news >正文

计算机控制系统-达林算法验证

理论课程讲解比较乏味,也可能不在课堂讲,但自己还是得熟悉。

1 问题

 开环传递函数G(s)=e^(-2s)/(2s+1),用达林算法设计数字控制器D(z),使得系统的闭环传递函数phi(s)=e^(-2s)/(2s+1),采样周期T=1s。

2 推导

  偷懒,用的deepseek回答。(如何贴答案 保持公式正确,?我是截图)

3 代码实现

3.1参数定义

%% 参数定义
T = 1;          % 采样周期 (s)
L = 2;          % 纯滞后时间 (s)
N = L / T;      % 离散滞后步数 (N=2)
K = 1;          % 增益
Tp = 2;         % 被控对象时间常数 (s)
lambda = 1;     % 期望闭环时间常数 (s)

3.2 离散化开环传递函数

%% 离散化被控对象
Gp = tf(K, [Tp, 1], 'InputDelay', L)
Gz = c2d(Gp, T, 'zoh')
Gp =1exp(-2*s) * -------2 s + 1Continuous-time transfer function.
Gz =0.3935z^(-2) * ----------z - 0.6065采样时间: 1 seconds
离散时间传递函数。

3.3 设计闭环传递函数

%% 设计期望闭环传递函数(调整lambda=1)
H_cont = tf(1, [lambda, 1], 'InputDelay', L)
Hz = c2d(H_cont, T, 'zoh')

H_cont =1exp(-2*s) * -----s + 1Continuous-time transfer function.
Hz =0.6321z^(-2) * ----------z - 0.3679采样时间: 1 seconds
离散时间传递函数。

3.4 设计DZ 控制器

由于含有延迟环境,无法直接按照定义求,只能通过获得分子、分母系数来求取

%% 计算控制器(数值方法,避免符号运算)
[num_Gz, den_Gz] = tfdata(Gz, 'v');
[num_Hz, den_Hz] = tfdata(Hz, 'v');% 计算D(z) = H(z)/(G(z)(1-H(z)))
num_Dz = conv(num_Hz, den_Gz);
den_Dz = conv(den_Hz, den_Gz) - conv(num_Hz, num_Gz);

% 消除前导零系数(避免数值问题)
num_Dz = num_Dz(find(num_Dz,1):end);
den_Dz = den_Dz(find(den_Dz,1):end);Dz = tf(num_Dz, den_Dz, T)%% 显示结果
disp('修正后的控制器D(z):');
Dz
Dz =0.6321 z - 0.3834------------------------z^2 - 0.9744 z - 0.02559采样时间: 1 seconds
离散时间传递函数。

这个与理论推导有差距

3.5 仿真

%% 步骤4: 验证闭环稳定性
% 闭环传递函数
CL = feedback(Dz*Gz, 1);
disp('闭环系统极点:');
pole(CL)% 判断是否稳定
if all(abs(pole(CL)) < 1)disp('闭环系统稳定');
elsedisp('闭环系统不稳定!');
end%% 步骤5: 仿真阶跃响应
figure;
step(CL, 20);  % 仿真20秒
title('闭环系统阶跃响应');
xlabel('时间 (s)'); ylabel('幅值');
grid on;%% 步骤6: 转换为差分方程(控制器实现)
% 提取D(z)的分子分母系数
num = Dz.Numerator{1};
den = Dz.Denominator{1};% 差分方程形式:
% u(k) = a1*u(k-1) + a2*u(k-2) + ... + b0*e(k) + b1*e(k-1) + ...
a = -den(2:end);  % 分母系数(去除了首项1)
b = num;disp('差分方程:');
fprintf('u(k) = ');
for i = 1:length(a)fprintf('%.4f*u(k-%d) + ', a(i), i);
end
for i = 1:length(b)if i == 1fprintf('%.4f*e(k)', b(i));elsefprintf(' + %.4f*e(k-%d)', b(i), i-1);end
end
fprintf('\n');

4 疑问和全部代码

理论计算和实际推导不一样? 主要是z的次数,一个是z-3,一个是z-2? 不知道计算机处理的问题在哪里?

下面是可偷懒复制的全部代码!!

% 修正后的Dahlin算法设计(解决系数过大问题)
clear; clc;%% 参数定义
T = 1;          % 采样周期 (s)
L = 2;          % 纯滞后时间 (s)
N = L / T;      % 离散滞后步数 (N=2)
K = 1;          % 增益
Tp = 2;         % 被控对象时间常数 (s)
lambda = 1;     % 期望闭环时间常数 (s)%% 离散化被控对象
Gp = tf(K, [Tp, 1], 'InputDelay', L)
Gz = c2d(Gp, T, 'zoh')%% 设计期望闭环传递函数(调整lambda=1)
H_cont = tf(1, [lambda, 1], 'InputDelay', L)
Hz = c2d(H_cont, T, 'zoh')%% 计算控制器(数值方法,避免符号运算)
[num_Gz, den_Gz] = tfdata(Gz, 'v');
[num_Hz, den_Hz] = tfdata(Hz, 'v');% 计算D(z) = H(z)/(G(z)(1-H(z)))
%把分子 分母通分计算 
num_Dz = conv(num_Hz, den_Gz)
den_Dz = conv(den_Hz, den_Gz) - conv(num_Hz, num_Gz)% 消除前导零系数(避免数值问题)
num_Dz = num_Dz(find(num_Dz,1):end);
den_Dz = den_Dz(find(den_Dz,1):end);Dz = tf(num_Dz, den_Dz, T)%% 显示结果
disp('修正后的控制器D(z):');
Dz%% 步骤4: 验证闭环稳定性
% 闭环传递函数
CL = feedback(Dz*Gz, 1);
disp('闭环系统极点:');
pole(CL)% 判断是否稳定
if all(abs(pole(CL)) < 1)disp('闭环系统稳定');
elsedisp('闭环系统不稳定!');
end%% 步骤5: 仿真阶跃响应
figure;
step(CL, 20);  % 仿真20秒
title('闭环系统阶跃响应');
xlabel('时间 (s)'); ylabel('幅值');
grid on;%% 步骤6: 转换为差分方程(控制器实现)
% 提取D(z)的分子分母系数
num = Dz.Numerator{1};
den = Dz.Denominator{1};% 差分方程形式:
% u(k) = a1*u(k-1) + a2*u(k-2) + ... + b0*e(k) + b1*e(k-1) + ...
a = -den(2:end);  % 分母系数(去除了首项1)
b = num;disp('差分方程:');
fprintf('u(k) = ');
for i = 1:length(a)fprintf('%.4f*u(k-%d) + ', a(i), i);
end
for i = 1:length(b)if i == 1fprintf('%.4f*e(k)', b(i));elsefprintf(' + %.4f*e(k-%d)', b(i), i-1);end
end
fprintf('\n');


http://www.mrgr.cn/news/96248.html

相关文章:

  • 模拟电子技术-基本放大电路
  • b站c语言鹏哥课程代码内容
  • PostgreSQL数据库迁移到Docker拉取的pg镜像中的
  • STM32基础教程——定时器
  • PyQt6实例_批量下载pdf工具_exe使用方法
  • QCustomPlot入门
  • 【面试八股】:常见的锁策略
  • 小林coding-9道Java虚拟机面试题
  • 4.6js面向对象
  • 【C++游戏引擎开发】《线性代数》(2):矩阵加减法与SIMD集成
  • 有关pip与conda的介绍
  • Centos7 安装 Nginx
  • Linux的例行性工作
  • 关于跨域问题(本地前端访问服务器端接口跨域出错)
  • MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案
  • 关于服务器只能访问localhost:8111地址,局域网不能访问的问题
  • Redis:概念与常用命令
  • Django 项目打包exe本地运行
  • JAVA接口调用限速器
  • 嵌入式学习第二十八天--顺序栈