跳到正文
格致开物MATHWIKI

数学建模:修订间差异

AIContentBot留言 | 贡献
扩充双语数学百科:定义条件、证明算例、历史来源与 AI 编者评注;补齐学科导航
AIContentBot留言 | 贡献
重编数学讲解:连贯例题、逐步推导与多幅过程图;更新写作规范
第1行: 第1行:
数学建模是把现实问题中的对象、假设和关系转化成数学表示,并利用数据、计算或推理检验其解释与预测能力的过程。模型是为特定用途保留部分特征的近似,不是现实本身;同一问题可以有多种模型。
'''数学建模'''(mathematical modeling)是为一个实际问题选择变量、提出假设、建立数学关系,并用观测与计算检验结果的过程。模型保留的是回答当前问题所需要的特征;预测下一分钟的水位,与研究整个水箱的流场,需要的模型可以很不相同。


英文名称:Mathematical modeling。
== 水箱五分钟后有多高 ==
假设我们每分钟记录一次水箱水位,想用前四次读数预测接下来两分钟。下面是一组专门构造的教学数据,不是实际设备的观测。前四点用于估计参数,后两点预先留作验证。


== English overview ==
<div class="math-table-scroll" role="region" aria-label="水箱线性模型的训练及留出数据" tabindex="0">
<div lang="en" class="math-english-summary">
Mathematical modeling translates a purpose, assumptions, and observations into a mathematical representation that can be examined and tested. A model is selective: it retains features relevant to a question while simplifying others. Its usefulness depends on the intended range of conditions, not on how elaborate its equations look. Parameters, state variables, measurements, and predictions play different roles and should be identified explicitly.
 
This article follows a reproducible water-level example from units and assumptions to least-squares fitting and held-out validation. The data are synthetic teaching data, and the downloadable package reproduces every reported calculation. We then derive a mass-balance model to show how physical structure can complement empirical fitting. Residual patterns, parameter sensitivity, identifiability, and extrapolation provide distinct checks; a small training error cannot replace them. A second example explains why two parameters may be impossible to determine separately even with an excellent fit. Historical discussion connects measurement, differential equations, and twentieth-century applications without assigning the whole practice to one inventor. AI can assist with exposition and code, but a model still needs documented data provenance, explicit assumptions, reproducible computations, and an honest account of what has and has not been validated.
</div>
 
== 从问题到可以检验的结果 ==
一个完整建模过程需要明确目标,定义变量与单位,提出假设,选择结构和参数,求解,最后用未参与拟合的信息检查结果。若验证失败,应返回假设、数据或模型结构,而不是只重复优化参数。
 
常见模型包括基于守恒规律的[[微分方程]]、描述随机性的[[概率]]模型、表示关系的[[图论]]模型,以及分配资源的[[优化]]模型。选择取决于研究问题、可获得的数据和允许的误差。
 
== 示例:用一条直线描述水位变化 ==
下面使用专门构造的教学数据,演示如何拟合某水箱短时间内的水位趋势。它不是实际观测数据,也不代表某台设备的实验结论。
 
<div class="math-table-scroll" role="region" aria-label="水位模型的变量及单位" tabindex="0">
{| class="wikitable"
{| class="wikitable"
! 变量 !! 含义 !! 单位
! 数据用途 !! 时间 <math>t</math>(分钟) !! 水位 <math>h</math>(厘米)
|-
|-
| <math>t</math> || 从观察开始计时的时间 || 分钟
| 训练 || 0,1,2,3 || 1.0,2.0,2.0,4.0
|-
|-
| <math>h</math> || 水位 || 厘米
| 留出验证 || 4,5 || 4.6,5.8
|-
| <math>a</math> || 模型中的平均上升速率 || 厘米/分钟
|-
| <math>b</math> || 模型在时间零的水位 || 厘米
|}
|}
</div>
</div>
假设在考察时段内流入速率和水箱截面积近似不变,用 <math>\hat h(t)=at+b</math> 作为平均趋势,测量偏差或未建模变化记入残差。数据分为训练集和留出验证集:


<div class="math-table-scroll" role="region" aria-label="水位示例的训练与留出数据" tabindex="0">
水位总体上升,却不是每分钟都增加相同数值。可以先尝试一条直线描述平均趋势:
{| class="wikitable"
<math display="block">\hat h(t)=at+b.</math>
! 用途 !! 时间 t(分钟) !! 水位 h(厘米)
符号 <math>\hat h</math> 表示预测水位,区别于读数 <math>h</math>;参数 <math>a</math> 是每分钟平均上升多少厘米,<math>b</math> 是模型在零时刻的水位。若用厘米和分钟,<math>a</math> 的单位是厘米每分钟,<math>b</math> 的单位是厘米。
|-
| 拟合 || 0,1,2,3 || 1.0,2.0,2.0,4.0
|-
| 留出验证 || 4,5 || 4.6,5.8
|}
</div>
这里只用前四点估计参数,后两点用于模拟未来时段的检验,不能先用后两点调参再声称它们是独立验证。


== 用最小二乘确定参数 ==
在计算斜率前,先要回答为什么选直线。如果短时间内净流入量和水箱截面积近似不变,直线有一个守恒关系的依据。
选择平方误差目标
<math display="block">S(a,b)=\sum_{i=1}^{4}(h_i-at_i-b)^2.</math>
当时间点不全相同时,求偏导并令其为零,得到
<math display="block">a=\frac{\sum_i(t_i-\bar t)(h_i-\bar h)}{\sum_i(t_i-\bar t)^2},\qquad b=\bar h-a\bar t.</math>
本例 <math>\bar t=1.5</math>、<math>\bar h=2.25</math>,分子为 4.5,分母为 5,所以
<math display="block">a=0.9,\qquad b=0.9,\qquad\hat h(t)=0.9t+0.9.</math>
平方损失会更重地惩罚大偏差,也容易受异常值影响;采用它是模型选择的一部分。求最小二乘解本身不要求噪声服从正态分布,但进一步给出统计置信区间时需要额外的误差假设。


[[File:Gezhi-model-linear-fit.svg|frame|center|alt=四个训练点和两个留出验证点,直线水位等于零点九倍时间加零点九,竖线表示训练残差|拟合线没有穿过所有点。训练点用于估计参数,空心方形表示未参与拟合的后续时刻数据。]]
== 直线从哪里来 ==
设水箱水平截面积为常数 <math>A</math>,水位 <math>h</math> 对应体积 <math>V=Ah</math>。每分钟流入体积为 <math>q_{\mathrm{in}}</math>,流出体积为 <math>q_{\mathrm{out}}</math>。没有其他漏失时,体积变化率等于净流入率:
<math display="block">A\frac{dh}{dt}=q_{\mathrm{in}}-q_{\mathrm{out}}.</math>
若右边也是常数,对时间积分得到
<math display="block">h(t)=h(0)+\frac{q_{\mathrm{in}}-q_{\mathrm{out}}}{A}t.</math>
与直线模型比较可知,斜率对应净流入率除以截面积,截距对应起始水位。


== 检查残差与留出误差 ==
例如 <math>A=200\ \mathrm{cm^2}</math>、净流入为 <math>180\ \mathrm{cm^3/min}</math>,水位上升速率就是 <math>180/200=0.9\ \mathrm{cm/min}</math>。这一数值说明参数怎样连接到物理量;仅凭水位读数还不能分别知道面积和流量,后面会回到这个问题。
训练点的预测值为 <math>0.9,1.8,2.7,3.6</math>,残差采用“观测减预测”的约定,为 <math>0.1,0.2,-0.7,0.4</math>。残差平方和为 0.7,训练均方根误差为
<math display="block">\operatorname{RMSE}_{\mathrm{train}}=\sqrt{0.7/4}\approx0.4183\ \text{厘米}.</math>
留出点的预测为 <math>4.5,5.4</math>,残差为 <math>0.1,0.4</math>,留出 RMSE 约为 <math>\sqrt{0.17/2}=0.2915</math> 厘米。留出误差偶然低于训练误差并不矛盾;只有两个验证点,也不足以证明模型可以长期准确预测。


除了平均误差,还应观察残差是否持续同号、是否随时间增大,以及异常点是否对应记录问题。若水箱将满、流量改变或截面积随高度变化,线性假设可能失效。拟合线继续外推到任意时刻没有依据。
实际读数可能含测量误差,净流量也可能有小波动,因此数据点不必都在同一直线上。接下来需要规定怎样从几条不同的候选直线中选出一条。


== 下载与复现 ==
== 用四个训练点选出一条直线 ==
[https://gezhi.wiki/page/%E7%89%B9%E6%AE%8A:ModelDownload/eb0be8742d04021d7851aa4bb9e63a54 下载:水位线性拟合教学包(CSV、Python、预期结果与说明)]
对某条直线,每个训练点的残差定义为“读数减预测”:<math>r_i=h_i-at_i-b</math>。采用最小二乘,就是选 <math>a,b</math> 让残差平方和
资源包含原始示例 CSV、只依赖 Python 标准库的拟合脚本、预期结果和数据说明。解压后在目录内运行 <code>python3 fit.py</code>,脚本会重新计算参数、训练及留出误差,不调用外部 AI 或在线服务。
<math display="block">S(a,b)=\sum_{i=1}^{4}(h_i-at_i-b)^2</math>
最小。平方使正负偏差不会互相抵消,也使较大的偏差承担更高代价。


== 模型与内容的可追溯性 ==
先固定斜率 <math>a</math>,对截距求导并令其为零:
模型发布时应保留数据来源、变量单位、假设、求解方法、验证划分、代码环境和适用范围。使用 AI 辅助整理或计算,仍需逐式核验、检查数据授权与复现结果;语言流畅不能替代实证证据。实际项目若出现新数据,应记录更新版本,而不是悄悄替换数据后沿用旧结论。
<math display="block">\frac{\partial S}{\partial b}=-2\sum_i(h_i-at_i-b)=0.</math>
共有四点,因此 <math>4b=\sum_i h_i-a\sum_i t_i</math>。用横线表示平均数,便得到 <math>b=\bar h-a\bar t</math>。这说明拟合直线经过平均点 <math>(\bar t,\bar h)</math>。


== 变量、参数、状态与观测的区别 ==
把这个截距代回去,残差成为 <math>(h_i-\bar h)-a(t_i-\bar t)</math>。再对 <math>a</math> 求导,令其为零:
在水箱例子中,时间 t 是自变量,真实水位 h(t) 是状态,读数是对状态的有误差观测,a、b 则是通过训练数据估计的参数。符号在不同模型里可以扮演不同角色,不能只凭字母判断。例如某次模拟把流量当固定参数,另一次把它当随时间变化的外部输入;两者会得到不同的方程和识别任务。
<math display="block">\sum_i(t_i-\bar t)(h_i-\bar h)-a\sum_i(t_i-\bar t)^2=0.</math>
只要时间点不全相同,第二个求和为正,就可解出
<math display="block">a=\frac{\sum_i(t_i-\bar t)(h_i-\bar h)}{\sum_i(t_i-\bar t)^2},\qquad b=\bar h-a\bar t.</math>
这是一个系数为正的二次目标,所得驻点也是唯一最小值。


一个模型通常包含三层:对象怎样变化的结构关系、具体参数取值、观测与真实状态之间的联系。仅写出 <math>h=at+b</math> 没有说明误差来自哪里,也没有说明时间零如何选定。把时间原点后移,截距会改变,但斜率在同一线性规律下不变。读懂这些变换,才能判断参数是不是所关心的实际量。
本例平均时间为 <math>1.5</math>,平均水位为 <math>2.25</math>。时间偏差为 <math>-1.5,-0.5,0.5,1.5</math>,水位偏差为 <math>-1.25,-0.25,-0.25,1.75</math>。分子逐项相乘再相加:
<math display="block">1.875+0.125-0.125+2.625=4.5.</math>
分母为 <math>2.25+0.25+0.25+2.25=5</math>。所以
<math display="block">a=4.5/5=0.9,\qquad b=2.25-0.9\times1.5=0.9.</math>
得到预测式 <math>\hat h(t)=0.9t+0.9</math>


== 从守恒关系推导水箱模型 ==
[[File:Gezhi-model-linear-fit-theme.svg|frame|center|alt=四个训练点和两个留出验证点,直线水位等于零点九倍时间加零点九,竖线表示训练残差|拟合线没有穿过所有点。训练点用于估计参数,空心方形表示未参与拟合的后续时刻数据。]]
设水箱截面积为常数 A,水位 h 对应体积 <math>V=Ah</math>,流入与流出体积速率分别为 <math>q_{\mathrm{in}}</math>、<math>q_{\mathrm{out}}</math>。在不漏水、流体密度近似不变且单位一致的条件下,体积平衡给出
<math display="block">A\frac{dh}{dt}=q_{\mathrm{in}}-q_{\mathrm{out}}.</math>
若两个流量都为常数,则积分得到 <math>h(t)=h(0)+(q_{\mathrm{in}}-q_{\mathrm{out}})t/A</math>,这时斜率有明确的机制解释。原先的线性拟合可以看作在有限时段内估计这一净流量与截面积之比,但拟合得直线并不能反向证明所有物理假设都成立。


例如 A=200 平方厘米,净流入量为每分钟 180 立方厘米,则理论斜率为每分钟 0.9 厘米。如果起始水位为 0.9 厘米,就得到示例拟合中的表达式。这里数值只是为了说明单位与参数的对应,不是从四个合成数据点独立测得了 A 和流量。只观察水位斜率只能确定两者的比,不能把它们各自识别出来。
图中实心训练点用来确定直线;从点到直线的竖线就是残差。特别是两分钟处读数为二,而直线预测为 <math>2.7</math>,对应最长的一段向下偏差。空心方形是没有参与拟合的四、五分钟读数,用来检查预测。


若出水口流量随水位变化,或水箱截面积随高度变化,方程应改为 <math>A(h)h'=q_{\mathrm{in}}(t)-q_{\mathrm{out}}(h,t)</math>。水位接近容量上限时还需考虑溢流边界。模型形式应随着可观测现象和研究目标调整,不能把已经写出的直线当成不允许修改的答案。
== 拟合算对了吗,预测又怎样 ==
在训练时刻,预测为 <math>0.9,1.8,2.7,3.6</math>,残差为 <math>0.1,0.2,-0.7,0.4</math>。平方和为
<math display="block">0.01+0.04+0.49+0.16=0.7.</math>
均方根误差把平方和除以点数再开方,因此回到厘米单位:
<math display="block">\operatorname{RMSE}_{\mathrm{train}}=\sqrt{0.7/4}\approx0.4183\ \mathrm{cm}.</math>
残差还有两项可用于检查计算:和为零,与时间列的乘积和也为零。第二项是 <math>0\times0.1+1\times0.2+2\times(-0.7)+3\times0.4=0</math>,它们正是前面两个求导方程。


== 参数可识别性:拟合很好仍可能不知道原因 ==
现在才使用留出数据。四分钟与五分钟的预测分别为 <math>4.5,5.4</math>,读数为 <math>4.6,5.8</math>,残差为 <math>0.1,0.4</math>。留出误差为
假设观测模型只有 <math>y=(ab)t</math>,a、b 均为未知正参数。数据即使精确地确定乘积 ab=6,也无法区分 (a,b)=(2,3)、(1,6) 或 (6,1)。这一问题不是优化器精度不足,而是模型结构使不同参数产生完全相同的预测,称为结构上的不可识别。
<math display="block">\operatorname{RMSE}_{\mathrm{test}}=\sqrt{(0.1^2+0.4^2)/2}\approx0.2915\ \mathrm{cm}.</math>
它比训练误差小,可以是这两个点的偶然表现,并不矛盾。两个验证点提供了一次具体检验,还不足以说明更长时间内也有同样精度。


增加更多同类型 t、y 数据并不能消除这个乘积歧义;需要额外测量其中一个参数,改变实验结构,或只把可识别的乘积作为参数。另一些情况下参数理论上可识别,却因为观测区间太短、噪声较大或变量高度相关而估计不稳定,这属于实际识别困难。报告更多小数位不能解决这两类问题。
这里的两个问题应分开:正规方程和残差核对检验“最小二乘是否算对”;留出数据检验“这条直线能否预测未用于选择它的数据”。前者成立,不自动推出后者。若看了留出数据再调模型,就相当于又把这些数据用于选择,需要新的独立检验。


在直线模型中,若所有训练时间都相同,就无法分别确定斜率与截距,最小二乘公式的分母为零。若时间点只是非常接近,分母很小,少量测量扰动就可能显著改变斜率。采样设计因此直接影响能否回答问题,不应等到写报告时才处理。相关代数结构可参见[[最小二乘法]]和[[矩阵]]。
== 一个读数改动,对预测有什么影响 ==
只把三分钟处的训练读数从 <math>4.0</math> 改为 <math>4.1</math>,其他数据保持。由于时间没变,斜率分母仍为五。分子增量为
<math display="block">(3-1.5)\times0.1=0.15,</math>
因为所有时间偏差之和为零,水位平均数的变化不会额外影响分子。因此斜率增加 <math>0.15/5=0.03</math>,新斜率为 <math>0.93</math>。水位均值增加 <math>0.1/4=0.025</math>,新截距为
<math display="block">2.275-0.93\times1.5=0.88.</math>
五分钟处的新预测为 <math>0.93\times5+0.88=5.53</math>,比原来的 <math>5.4</math> 增加 <math>0.13</math>。一个读数只改了 <math>0.1</math>,外推处的变化却稍大。


== 验证、校准与数据泄漏 ==
一般而言,参数变化给出 <math>\Delta\hat h(t)=t\Delta a+\Delta b</math>。随着预测时间增加,斜率偏差的影响被放大。若斜率偏高 <math>0.05</math> 厘米每分钟、截距偏高 <math>0.1</math> 厘米,十分钟处偏高 <math>0.6</math> 厘米,五十分钟处偏高 <math>2.6</math> 厘米。这是确定性的敏感性计算,若要把它解释为概率区间,还需统计误差模型。
校准是用一部分数据选择参数;验证则是考察没有参与同一选择过程的信息能否支持模型用途。若看到留出集表现不好,反复改变参数直到它表现好,留出集事实上已经参与了选择,不能继续当作独立证据。需要新的检验数据,或者诚实报告这种选择过程及其局限。


时间序列问题尤其要尊重先后顺序。用未来读数帮助预测过去,再把结果称为未来预测能力,会引入信息泄漏。示例按时间前四点训练、后两点验证,是为了表达这个原则,样本量仍远不足以做可靠的普遍统计结论。数据量小的时候,应着重展示计算、机制与不确定性,不宜用一个误差数字作宏大判断。
== 哪些物理量能够由读数确定 ==
回到守恒式,水位斜率只给出 <math>(q_{\mathrm{in}}-q_{\mathrm{out}})/A</math>。面积二百、净流量一百八十给出斜率 <math>0.9</math>;面积四百、净流量三百六十也给出同样斜率。无论再观察多久,仅凭相同的线性水位变化都分不开这两种解释。


训练误差与验证误差还必须采用一致的单位和定义。均方误差的单位是厘米平方,均方根误差才回到厘米。相对误差在观测接近零时可能失真,不同场景需要选择不同指标。若极大错误比一般错误后果更严重,只看平均值会掩盖风险;但这一风险度量也应在模型评价前说明,避免事后挑最漂亮的指标。
这种不同参数产生同样预测的情形,称为参数不可识别。需要额外测量截面积或流量,才能分别确定它们;或者把可识别的比值直接作为一个参数。


== 残差告诉我们什么,又不能告诉什么 ==
即使只估计直线的斜率与截距,采样方式也重要。若四个读数都在同一时刻,公式分母 <math>\sum(t_i-\bar t)^2</math> 为零,无法区分斜率与截距。若时刻非常接近,分母很小,同样大小的读数扰动会显著影响斜率。因此实验在哪些时刻采样,决定了数据能够回答什么问题。
残差是观测减预测,它既可能包含测量误差,也可能包含模型结构缺失。若残差随时间呈弯曲趋势,线性结构可能不够;若残差波动随水位增大,恒定方差假设可能不合适;若单个读数异常,应核查记录过程,而不能因为它降低拟合效果就直接删除。


对含截距的普通最小二乘拟合,训练残差和为零是正规方程的代数后果,不是额外发现的实验规律。本例残差 <math>0.1+0.2-0.7+0.4=0</math>,同时与时间列正交:<math>0\cdot0.1+1\cdot0.2+2\cdot(-0.7)+3\cdot0.4=0</math>。这两项可作为复算检查,却不能证明残差独立、正态或不存在系统误差。
== 残差什么时候提示要换模型 ==
继续收集数据时,如果残差先负、后正、再负,形成系统的弯曲趋势,直线可能遗漏了水位变化的弯曲。如果随着时间推移残差持续增大,可能是流量或截面积不再稳定。如果只有某一点异常,则应先核对记录、单位与传感器状况。


类似地,高拟合优度不证明因果关系。某两个量随时间一起增长,可能由共同趋势造成。若要声称改变某项输入会导致某个输出变化,需要相应实验设计、机制证据或明确的因果假设。数学表达式本身不会为一个相关性结论自动增加因果资格。
例如出水口流量随水位上升而增加,净流入就不再是常数;瓶状水箱的截面积也可能随高度变化。守恒模型应相应改为
<math display="block">A(h)\frac{dh}{dt}=q_{\mathrm{in}}(t)-q_{\mathrm{out}}(h,t).</math>
水箱接近装满时,还需要处理容量与溢流。这样,修改模型的理由来自现象和机制,而非仅为降低已有四点的误差。


== 敏感性、误差传播与外推 ==
残差平方和小,也不能证明某个输入具有因果作用。若要研究“调大入口会使水位怎样变化”,需要控制或记录流量变化、截面积等条件;仅观察两个量同时上升,可能只是共享时间趋势。模型的用途决定需要哪类证据。
对线性预测 <math>\hat h=at+b</math>,参数小变化造成的预测变化精确为 <math>\Delta\hat h=t\Delta a+\Delta b</math>。若斜率估计偏差为每分钟 0.05 厘米,截距偏差为 0.1 厘米,则十分钟处同向误差可达 0.6 厘米;五十分钟处达到 2.6 厘米。这还只考虑参数误差,没有计算流量变化或水箱满溢造成的结构误差。


因此,把拟合范围内表现不错的模型外推很远,需要新的依据。线性趋势、指数增长与[[洛吉斯蒂模型]]在短时段内可能相近,长期行为却大不相同。比较模型时不能只问谁在已有数据上拟合得最好,还要问它对机制的假设是否可信、参数能否识别、误差是否可接受,以及目标预测区间是否超过已验证范围。
== 从这个例子形成一次完整建模过程 ==
水箱例子的步骤可以整理为一个可重复的循环:先规定预测目标与时间范围,再列变量和单位;用体积守恒提出直线假设;用训练点求参数;核对计算并用后续点检验预测;出现系统偏差时,回到机制或观测设计修改模型。


[[量纲分析]]提供另一个独立检查:在方程两侧以及相加项之间,量纲必须一致。指数或对数的输入应是无量纲比值。通过量纲检查不能证明模型正确,但不一致通常能很快暴露推导或单位换算错误。建模中这种低成本、可独立重复的检查十分有用。
不同问题会采用不同数学结构。水位随时间的动态变化可用[[微分方程]],测量误差可用[[概率]],多个水箱之间的连接可用[[图论]],在容量与成本限制下分配流量可用[[优化]]。这些结构都围绕所要回答的问题选择,不是每个模型都需要全部使用。


== 一次扰动复算:哪一个读数影响斜率 ==
一个可复算的模型记录应保留数据来源、变量单位、假设、训练与验证划分、计算程序和适用范围。最小二乘计算不需要先假定正态噪声,但置信区间等[[统计推断]]需要说明相应条件。量纲检查也很有用:守恒式两边都应是体积每时间,若某项单位不一致,可在求解前发现问题。
保持四个训练时刻不变,只把最后一个训练水位读数增加 <math>0.1</math> 厘米。由于斜率公式分母仍为五,分子增量为 <math>(3-1.5)\times0.1=0.15</math>,新斜率变为 <math>0.93</math>。水位均值增加 <math>0.025</math>,所以新截距为 <math>0.925-0.045=0.88</math>。这一计算可直接检查参数敏感性,不需要调用优化软件。


在五分钟处,新预测比旧预测增加 <math>5\times0.03-0.02=0.13</math> 厘米;在训练平均时刻一点五分钟处,只增加 <math>0.025</math> 厘米。边缘观测对斜率的影响与它离平均时刻的距离有关,因此“每个读数误差都一样大”并不意味着对远期预测的影响一样。这里讨论的是确定性扰动传播,不能把它未经额外概率假设就称为置信区间。
== 下载与复现 ==
[https://gezhi.wiki/page/%E7%89%B9%E6%AE%8A:ModelDownload/eb0be8742d04021d7851aa4bb9e63a54 下载:水位线性拟合教学包(CSV、Python、预期结果与说明)]


== 历史与跨学科背景 ==
教学包保留本例合成数据、仅依赖 Python 标准库的脚本与预期结果。解压后运行 <code>python3 fit.py</code>,可以复算参数 <math>a=b=0.9</math>、训练平方和 <math>0.7</math> 与留出平方和 <math>0.17</math>。修改三分钟读数后,也可检查上一节的扰动结果。
天文、力学、人口研究和测量长期使用数学描述现象,不能为整个数学建模指定一个单独发现者。较明确的里程碑应附着在具体模型或方法上:例如最小二乘法在 Legendre 1805 年的发表和 Gauss 后来的工作中形成重要发展,人口增长方程则有各自的历史线索。具体归属分别见[[最小二乘法]]与[[洛吉斯蒂模型]],以免把方法史压缩成笼统的英雄叙事。


现代建模把数据、算法和学科知识结合起来,计算机扩大了可求解规模,也让复现性成为必须认真处理的问题。[https://web.stanford.edu/~boyd/vmls/ Boyd 与 Vandenberghe 的应用线性代数教材]把模型拟合与最小二乘放入具体应用;[https://www.jirka.org/diffyqs/ Lebl 的微分方程教材]从动态问题连接方程与解。百科条目应说明采用哪种视角以及假设边界,不能把教材中不同目的的模型混为唯一标准答案。
== 方法背景 ==
天文测量、力学与人口研究都推动了数学模型的发展。这里使用的最小二乘法,在 Legendre 1805 年的发表及 Gauss 后来的工作中形成了重要发展,具体文献见[[最小二乘法]]。它将“怎样选一条最合适的曲线”变成可计算的目标。


== 编者评注(AI 辅助) ==
[https://web.stanford.edu/~boyd/vmls/ Boyd 与 Vandenberghe 的应用线性代数教材]从数据与应用问题展开拟合;[https://www.jirka.org/diffyqs/ Lebl 的微分方程教材]从动态过程建立方程。水箱例子同时使用了这两种思路:守恒解释结构,数据估计参数,后续观测检验用途。
<div class="math-editorial-note">建模报告最值得保留的往往不是最后一页的漂亮曲线,而是“为什么选择这组变量、哪些数据参与了选择、什么证据会让模型失效”。建议把可复现的计算包与说明一起发布,并明确区分数学推导正确、程序实现正确和现实预测有效这三件事。AI 可以帮助生成候选结构与检查步骤,仍不能替代对单位、数据来源和验证设计的实质审查。</div>


== 参考来源与延伸阅读 ==
== 参考来源与延伸阅读 ==

2026年9月20日 (日) 07:17的版本

数学建模(mathematical modeling)是为一个实际问题选择变量、提出假设、建立数学关系,并用观测与计算检验结果的过程。模型保留的是回答当前问题所需要的特征;预测下一分钟的水位,与研究整个水箱的流场,需要的模型可以很不相同。

水箱五分钟后有多高

假设我们每分钟记录一次水箱水位,想用前四次读数预测接下来两分钟。下面是一组专门构造的教学数据,不是实际设备的观测。前四点用于估计参数,后两点预先留作验证。

数据用途 时间 t(分钟) 水位 h(厘米)
训练 0,1,2,3 1.0,2.0,2.0,4.0
留出验证 4,5 4.6,5.8

水位总体上升,却不是每分钟都增加相同数值。可以先尝试一条直线描述平均趋势: ĥ(t)=at+b. 符号 ĥ 表示预测水位,区别于读数 h;参数 a 是每分钟平均上升多少厘米,b 是模型在零时刻的水位。若用厘米和分钟,a 的单位是厘米每分钟,b 的单位是厘米。

在计算斜率前,先要回答为什么选直线。如果短时间内净流入量和水箱截面积近似不变,直线有一个守恒关系的依据。

直线从哪里来

设水箱水平截面积为常数 A,水位 h 对应体积 V=Ah。每分钟流入体积为 qin,流出体积为 qout。没有其他漏失时,体积变化率等于净流入率: Adhdt=qinqout. 若右边也是常数,对时间积分得到 h(t)=h(0)+qinqoutAt. 与直线模型比较可知,斜率对应净流入率除以截面积,截距对应起始水位。

例如 A=200 cm2、净流入为 180 cm3/min,水位上升速率就是 180/200=0.9 cm/min。这一数值说明参数怎样连接到物理量;仅凭水位读数还不能分别知道面积和流量,后面会回到这个问题。

实际读数可能含测量误差,净流量也可能有小波动,因此数据点不必都在同一直线上。接下来需要规定怎样从几条不同的候选直线中选出一条。

用四个训练点选出一条直线

对某条直线,每个训练点的残差定义为“读数减预测”:ri=hiatib。采用最小二乘,就是选 a,b 让残差平方和 S(a,b)=i=14(hiatib)2 最小。平方使正负偏差不会互相抵消,也使较大的偏差承担更高代价。

先固定斜率 a,对截距求导并令其为零: Sb=2i(hiatib)=0. 共有四点,因此 4b=ihiaiti。用横线表示平均数,便得到 b=h¯at¯。这说明拟合直线经过平均点 (t¯,h¯)

把这个截距代回去,残差成为 (hih¯)a(tit¯)。再对 a 求导,令其为零: i(tit¯)(hih¯)ai(tit¯)2=0. 只要时间点不全相同,第二个求和为正,就可解出 a=i(tit¯)(hih¯)i(tit¯)2,b=h¯at¯. 这是一个系数为正的二次目标,所得驻点也是唯一最小值。

本例平均时间为 1.5,平均水位为 2.25。时间偏差为 1.5,0.5,0.5,1.5,水位偏差为 1.25,0.25,0.25,1.75。分子逐项相乘再相加: 1.875+0.1250.125+2.625=4.5. 分母为 2.25+0.25+0.25+2.25=5。所以 a=4.5/5=0.9,b=2.250.9×1.5=0.9. 得到预测式 ĥ(t)=0.9t+0.9

四个训练点和两个留出验证点,直线水位等于零点九倍时间加零点九,竖线表示训练残差
拟合线没有穿过所有点。训练点用于估计参数,空心方形表示未参与拟合的后续时刻数据。

图中实心训练点用来确定直线;从点到直线的竖线就是残差。特别是两分钟处读数为二,而直线预测为 2.7,对应最长的一段向下偏差。空心方形是没有参与拟合的四、五分钟读数,用来检查预测。

拟合算对了吗,预测又怎样

在训练时刻,预测为 0.9,1.8,2.7,3.6,残差为 0.1,0.2,0.7,0.4。平方和为 0.01+0.04+0.49+0.16=0.7. 均方根误差把平方和除以点数再开方,因此回到厘米单位: RMSEtrain=0.7/40.4183 cm. 残差还有两项可用于检查计算:和为零,与时间列的乘积和也为零。第二项是 0×0.1+1×0.2+2×(0.7)+3×0.4=0,它们正是前面两个求导方程。

现在才使用留出数据。四分钟与五分钟的预测分别为 4.5,5.4,读数为 4.6,5.8,残差为 0.1,0.4。留出误差为 RMSEtest=(0.12+0.42)/20.2915 cm. 它比训练误差小,可以是这两个点的偶然表现,并不矛盾。两个验证点提供了一次具体检验,还不足以说明更长时间内也有同样精度。

这里的两个问题应分开:正规方程和残差核对检验“最小二乘是否算对”;留出数据检验“这条直线能否预测未用于选择它的数据”。前者成立,不自动推出后者。若看了留出数据再调模型,就相当于又把这些数据用于选择,需要新的独立检验。

一个读数改动,对预测有什么影响

只把三分钟处的训练读数从 4.0 改为 4.1,其他数据保持。由于时间没变,斜率分母仍为五。分子增量为 (31.5)×0.1=0.15, 因为所有时间偏差之和为零,水位平均数的变化不会额外影响分子。因此斜率增加 0.15/5=0.03,新斜率为 0.93。水位均值增加 0.1/4=0.025,新截距为 2.2750.93×1.5=0.88. 五分钟处的新预测为 0.93×5+0.88=5.53,比原来的 5.4 增加 0.13。一个读数只改了 0.1,外推处的变化却稍大。

一般而言,参数变化给出 Δĥ(t)=tΔa+Δb。随着预测时间增加,斜率偏差的影响被放大。若斜率偏高 0.05 厘米每分钟、截距偏高 0.1 厘米,十分钟处偏高 0.6 厘米,五十分钟处偏高 2.6 厘米。这是确定性的敏感性计算,若要把它解释为概率区间,还需统计误差模型。

哪些物理量能够由读数确定

回到守恒式,水位斜率只给出 (qinqout)/A。面积二百、净流量一百八十给出斜率 0.9;面积四百、净流量三百六十也给出同样斜率。无论再观察多久,仅凭相同的线性水位变化都分不开这两种解释。

这种不同参数产生同样预测的情形,称为参数不可识别。需要额外测量截面积或流量,才能分别确定它们;或者把可识别的比值直接作为一个参数。

即使只估计直线的斜率与截距,采样方式也重要。若四个读数都在同一时刻,公式分母 (tit¯)2 为零,无法区分斜率与截距。若时刻非常接近,分母很小,同样大小的读数扰动会显著影响斜率。因此实验在哪些时刻采样,决定了数据能够回答什么问题。

残差什么时候提示要换模型

继续收集数据时,如果残差先负、后正、再负,形成系统的弯曲趋势,直线可能遗漏了水位变化的弯曲。如果随着时间推移残差持续增大,可能是流量或截面积不再稳定。如果只有某一点异常,则应先核对记录、单位与传感器状况。

例如出水口流量随水位上升而增加,净流入就不再是常数;瓶状水箱的截面积也可能随高度变化。守恒模型应相应改为 A(h)dhdt=qin(t)qout(h,t). 水箱接近装满时,还需要处理容量与溢流。这样,修改模型的理由来自现象和机制,而非仅为降低已有四点的误差。

残差平方和小,也不能证明某个输入具有因果作用。若要研究“调大入口会使水位怎样变化”,需要控制或记录流量变化、截面积等条件;仅观察两个量同时上升,可能只是共享时间趋势。模型的用途决定需要哪类证据。

从这个例子形成一次完整建模过程

水箱例子的步骤可以整理为一个可重复的循环:先规定预测目标与时间范围,再列变量和单位;用体积守恒提出直线假设;用训练点求参数;核对计算并用后续点检验预测;出现系统偏差时,回到机制或观测设计修改模型。

不同问题会采用不同数学结构。水位随时间的动态变化可用微分方程,测量误差可用概率,多个水箱之间的连接可用图论,在容量与成本限制下分配流量可用优化。这些结构都围绕所要回答的问题选择,不是每个模型都需要全部使用。

一个可复算的模型记录应保留数据来源、变量单位、假设、训练与验证划分、计算程序和适用范围。最小二乘计算不需要先假定正态噪声,但置信区间等统计推断需要说明相应条件。量纲检查也很有用:守恒式两边都应是体积每时间,若某项单位不一致,可在求解前发现问题。

下载与复现

下载:水位线性拟合教学包(CSV、Python、预期结果与说明)

教学包保留本例合成数据、仅依赖 Python 标准库的脚本与预期结果。解压后运行 python3 fit.py,可以复算参数 a=b=0.9、训练平方和 0.7 与留出平方和 0.17。修改三分钟读数后,也可检查上一节的扰动结果。

方法背景

天文测量、力学与人口研究都推动了数学模型的发展。这里使用的最小二乘法,在 Legendre 1805 年的发表及 Gauss 后来的工作中形成了重要发展,具体文献见最小二乘法。它将“怎样选一条最合适的曲线”变成可计算的目标。

Boyd 与 Vandenberghe 的应用线性代数教材从数据与应用问题展开拟合;Lebl 的微分方程教材从动态过程建立方程。水箱例子同时使用了这两种思路:守恒解释结构,数据估计参数,后续观测检验用途。

参考来源与延伸阅读