---
title: 动态建模
url: https://doc.liz6.com/theory/02-control-theory/02-dynamic-models
locale: zh
area: theory
tags:
- 控制理论
- 基础理论
date: 2026-09-10
modified: 2026-09-10
description: 固定功率下的最终温度可以用代数算出，但“多久达到”“中途怎样变化”需要动态模型。本篇从热量收支建立一个状态，再把同一关系写成连续与离散形式。前置是反馈与控制。
---

# 动态建模

固定功率下的最终温度可以用代数算出，但“多久达到”“中途怎样变化”需要动态模型。本篇从热量收支建立一个状态，再把同一关系写成连续与离散形式。前置是[反馈与控制](01-feedback-and-control.md)。

## 从守恒关系写出导数

温度变化需要能量。热容 $C_{\mathrm{th}}$ 表示升高 1 K 所需的能量；若一小段时间 $\Delta t$ 内净入热功率为 $p_{\mathrm{net}}$，则 $C_{\mathrm{th}}\Delta\theta\approx p_{\mathrm{net}}\Delta t$。两边除以时间，再取极限：

$$C_{\mathrm{th}}\dot\theta=P_{\max}u-k(\theta-\theta_a)+d.$$

这里 $\dot\theta$ 是温度变化率，单位 K/s；$C_{\mathrm{th}}$ 是 J/K；$P_{\max}$、额外入热 $d$ 的单位为 W；$k$ 为 W/K；$u$ 无量纲。左边单位是 J/s，与右边相同。正 $d$ 表示额外加热，负 $d$ 表示额外移走热量。

本系列基线为 $C_{\mathrm{th}}=2000$ J/K、$P_{\max}=1000$ W、$k=20$ W/K。取 $\theta=30$、$\theta_a=20$、$u=0.4$、$d=0$，净入热是 $400-200=200$ W，故 $\dot\theta=0.1$ K/s。这个导数描述当前趋势，不表示未来每秒都增加 0.1 K；温度升高后散热也会增加。

## 状态为什么能概括过去？

在这个集中参数模型里，给定当前温度与后续输入，就能计算后续温度，所以 $\theta$ 是状态。状态不是“所有历史记录”，而是模型中预测未来所需的当前信息。

假如容器壁和内部液体温度不同，仅知道液体温度就不够：相同液温、不同壁温会产生不同的后续换热。此时需要至少两个温度状态。模型的维数来自被保留的动态，不来自传感器数量。[状态反馈篇](10-state-feedback-and-observers.md)会进一步区分状态与可测输出。

## 时间常数是怎样出现的？

当 $u,\theta_a,d$ 恒定时，令导数为零得到

$$\theta_\infty=\theta_a+\frac{P_{\max}u+d}{k},\qquad
\tau=\frac{C_{\mathrm{th}}}{k}.$$

把方程改写成 $\dot\theta=-(\theta-\theta_\infty)/\tau$。偏离最终值越多，回归速度越大；解为

$$\theta(t)=\theta_\infty+[\theta(0)-\theta_\infty]e^{-t/\tau}.$$

基线 $\tau=100$ s。从 20 °C、$u=0.4$ 开始，最终是 40 °C。100 s 后为 $40-20/e\approx32.64$ °C，完成变化量的 63.2%；300 s 后约 39.00 °C，完成 95.0%。时间常数不是“恰好到达终点所需时间”。

**动态建模 · 实验**

从20 °C开始，室温20 °C，固定加热400 W。解析解同时显示温度和净入热；热容改变动态，散热系数还会改变终值。


先把热容加倍，再把散热系数加倍。前者只改变时间常数，后者同时改变时间常数与最终温升。读图时区分“绝对温度较低”和“相对于自身终值收敛较快”。

## 连续方程怎样变成递推？

最直接的前向 Euler 近似是

$$\theta_{j+1}=\theta_j+\frac{h}{C_{\mathrm{th}}}[P_{\max}u_j-k(\theta_j-\theta_{a,j})+d_j].$$

$h$ 是数值计算步长。若这一段时间内输入保持不变，可以直接使用精确解：

$$\theta_{j+1}=a\theta_j+(1-a)\theta_{\infty,j},\qquad a=e^{-h/\tau}.$$

例如 $h=10$ s，从 20 °C 开始，Euler 得到 22 °C，精确递推得到 21.903 °C。两者的差别来自近似方法。对于无输入偏差方程，Euler 的离散系数是 $1-h/\tau$，只有 $0<h<2\tau$ 才渐近稳定；不能把过大步长造成的发散解释成真实对象失稳。[数字控制篇](07-sampling-and-delay.md)再区分仿真步长与真实控制周期。

## 线性化保留了什么？

选定平衡点 $(\theta_0,u_0)$，用 $x=\theta-\theta_0$、$v=u-u_0$ 表示偏差。在环境与热负载不变时，得到

$$\dot x=-\frac{k}{C_{\mathrm{th}}}x+\frac{P_{\max}}{C_{\mathrm{th}}}v.$$

本模型本来就是仿射关系，偏差变换后是精确线性方程。若换成辐射散热、温度相关热容或非线性执行器，通常只能在工作点附近用导数近似。对一般 $\dot x=f(x,u)$，局部矩阵来自 $A=\partial f/\partial x$、$B=\partial f/\partial u$，并不是对所有温度都成立的同一组常数。

RC 电路的 $C\dot V=(V_{\mathrm{in}}-V)/R$ 也有储能和泄放，时间常数为 $RC$。这种对应帮助迁移数学结构；电压、温度、能量和执行器约束仍有各自单位与物理意义。可回看[电容](../../hardware/02-passive-components/02-capacitor.md)。

## 自检

只把热容从 2000 增加到 4000 J/K，固定输入下最终温度与 100 s 时温度分别怎样变化？

<details><summary>参考思路</summary>

终值不变，时间常数变为200 s。原来的20→40 °C过程在100 s时变为$40-20e^{-0.5}\approx27.87$ °C，升温更慢。

</details>

两杯液体当前都为 40 °C，但一个容器壁更热。为什么一个温度状态的模型可能预测错误？

<details><summary>参考思路</summary>

壁温是被遗漏的储能状态。相同测量值不保证相同内部状态。应增加壁温及换热关系，或说明何种快速平衡近似允许合并两者。

</details>

## 延伸

[python-control 的连续到离散转换](https://python-control.readthedocs.io/en/stable/generated/control.sample_system.html)提供包括零阶保持在内的转换方法。选择方法前，先明确“输入在采样间隔内保持不变”是否符合实际实现。
