控制系统建模仿真(一):掌握控制系统设计的 MAD 流程与 MATLAB 基础运算

前言

最近作者也是要期末考了,正在复习MATLAB,我们的专业课是控制系统建模与仿真,索性决定边写博客边复习,避免自己考完以后就全部忘记了。我们的课本是《控制系统计算机辅助设计--MATLAB语言与应用(第三版)》,但是不同课本其实也差不了多少,如果你想学习控制系统建模仿真,或者你也要进行该科目的考试,欢迎通过看我的博客学习,保证能让你学会或者考试拿高分。

现在我们正式开始,第一章是控制系统计算机辅助设计概述,其实更多是概念性的东西,只有少部分编程知识,这边简单讲讲。

学习目标

本章的主要任务是让你从宏观上认识什么是 CACSD(计算机辅助控制系统设计) ,以及为什么 MATLAB 是该领域事实上的标准工具。它不涉及高深的数学推导,重点在于掌握 MATLAB 的基本操作环境在线帮助系统 以及初步的效率意识


核心原理与知识点

  1. MAD 方法论 :控制系统设计的三个阶段:
    • M (Modeling) 建模:建立数学模型(微分方程、传递函数等)。
    • A (Analysis) 分析:分析系统的稳定性、快速性、准确性。
    • D (Design) 设计:根据性能指标要求,设计控制器(如 PID、超前校正等)。
  1. 交互式语言的优势 :MATLAB 与传统 C/Fortran 的区别在于它不需要复杂的编译过程,可以"即敲即得"。
  2. 工具箱(Toolboxes)概念:MATLAB 不仅仅是一个计算器,它可以通过各种专业工具箱(如 Control System Toolbox)扩展功能。

必会函数清单及实例

虽然第一章以综述为主,但在课后习题中引入了几个非常基础且关键的函数,用于性能测试和基础运算。

(1) helpdoc

  • 功能与用处 :获取函数的帮助信息。help 在命令行窗口快速显示简要说明,doc 在浏览器中打开详尽的说明文档(带示例)。

  • 可执行例子

    matlab 复制代码
    help inv  % 在命令行查看求逆矩阵函数的用法
    doc inv   % 打开 inv 函数的图形化详细文档
  • 源码讲解 :这是学习 MATLAB 最重要的命令,遇到任何不认识的函数,第一时间 help 它。

  • 输出结果 :窗口会打印出 inv 的功能描述,并且因为doc命令打开帮助文档的窗口,可以在文档中查看

(2) tictoc

  • 功能与用处 :用于测量代码运行的时间。tic 开始计时,toc 结束计时并输出耗时(秒)。

  • 可执行例子

    matlab 复制代码
    n = 1000;         % 定义矩阵阶数
    A = rand(n);      % 生成一个 n*n 的随机矩阵
    tic;              % 开始计时
    B = inv(A);       % 计算矩阵的逆
    t = toc;          % 结束计时并获取时间
    fprintf('计算 %d 阶矩阵求逆耗时: %.4f 秒\n', n, t);
  • 源码讲解 :首先定义规模,生成矩阵,然后用 tic/toc 把计算过程包裹起来。

  • 输出结果示例计算 1000 阶矩阵求逆耗时: 0.2987 秒(具体取决于电脑性能)。

(3) randeyenorm

  • 功能与用处

    • rand(n):生成 n 阶均匀分布的随机矩阵。
    • eye(n):生成 n 阶单位矩阵。
    • norm(E):计算矩阵的范数,常用于衡量误差的大小。
  • 可执行例子(验证计算误差):

    matlab 复制代码
    n = 5;
    A = rand(n);
    B = inv(A);
    error_matrix = A * B - eye(n); % 理论上应为 0 矩阵
    err = norm(error_matrix);      % 计算误差的范数
    disp("A矩阵")
    disp(A)
    disp("B矩阵")
    disp(B)
    disp("误差矩阵")
    disp(error_matrix)
    disp(['计算误差为: ', num2str(err)]);
  • 源码讲解 :在计算机中,浮点数运算存在舍入误差,A*inv(A) 并不完全等于单位阵,通过 norm 可以看到这个误差极其微小(通常在 10−1310^{-13}10−13 数量级)。

  • 输出结果示例

(4) symsexpand
  • 功能与用处

    • syms:声明符号变量,使 MATLAB 进行代数运算而非数值运算。
    • expand:对符号表达式进行展开。
  • 可执行例子 (模拟习题1.7.7):

    matlab 复制代码
    syms x;              % 声明符号变量 x
    P = (x + 1)^5;       % 定义一个多项式
    result = expand(P);  % 展开多项式
    disp(result);
  • 源码讲解 :如果没有 syms,MATLAB 会寻找 x 的具体数值。有了 syms,它就像做代数题一样处理公式。

  • 输出结果x^5 + 5*x^4 + 10*x^3 + 10*x^2 + 5*x + 1


MATLAB 语法知识

  • 赋值语句变量名 = 表达式;(加分号表示不显示计算结果,不加则直接打印在屏幕上)。
  • 矩阵定义 :使用方括号 [],同行元素用逗号或空格隔开,跨行用分号 ;
  • 注释 :使用百分号 % 开头。

Simulink 是基于 图形化框图 的仿真环境。

  • 启动方式 :在命令行输入 simulink 即可打开库浏览器。

  • 核心逻辑

    1. 创造空白模型
    2. 从库浏览器拖拽模块(Block)。
    3. 用信号线连接模块。
    4. 设置仿真时间并点击运行。
      注:第一章仅要求知道它是做什么的,具体操作在后续章节。

课后练习建议

如果你现在有 MATLAB 环境,请尝试执行上面代码片段中的第 (2) 和 (3)。

思考题 :当你把矩阵阶数 n 从 5 改为 5000 时,计算时间是线性增长的吗?(可以注释掉矩阵输出的代码)
(你会发现时间增长得非常快,这能帮你建立算法复杂度的初步概念,这在大型控制系统仿真中非常关键。)

准备好进入第二章了吗?第二章将开始系统地讲解程序设计。

相关推荐
2501_944424122 小时前
Flutter for OpenHarmony游戏集合App实战之贪吃蛇食物生成
android·开发语言·flutter·游戏·harmonyos
Lhuu(重开版3 小时前
JS:正则表达式和作用域
开发语言·javascript·正则表达式
仙俊红3 小时前
Java Map 家族核心解析
java·开发语言
浅念-3 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
code_li4 小时前
聊聊支付宝架构
java·开发语言·架构
少控科技5 小时前
QT高阶日记01
开发语言·qt
无限进步_5 小时前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
“抚琴”的人5 小时前
C#上位机工厂模式
开发语言·c#
巨大八爪鱼5 小时前
C语言纯软件计算任意多项式CRC7、CRC8、CRC16和CRC32的代码
c语言·开发语言·stm32·crc