ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Vensim系统动力学建模:从因果回路到动态仿真实战

Vensim系统动力学建模:从因果回路到动态仿真实战 搞数学建模的人一提到建模脑子里蹦出来的多半是回归、神经网络、决策树那一套。可如果你面对的问题是某项政策推下去未来五年系统会怎么演化某个新产品扩散到多少比例会触发正反馈静态模型往往很难给出让人信服的答案。Vensim系统动力学建模恰恰是补上这块短板的工具它把时间、存量、流量、反馈回路这些动态基因直接装进模型在数学建模竞赛和实际行业分析里都相当能打。这篇文章我会从一个完整的案例出发把理论、建模、仿真到优化全链路拆开讲适合正在备赛的建模队伍、写论文需要做动态仿真的同学以及想在行业分析中用系统动力学的人参考。1. 为什么动态反馈模型能解决静态模型解决不了的问题1.1 静态模型和动态模型的分水岭在哪里先说一个我在实际评审中经常看到的现象很多队伍拿到一个预测类赛题第一反应是收集历史数据然后跑一个ARIMA或者随机森林把未来几十期数值预测出来。这本身没有错但问题是很多系统的问题根本不是趋势外推能解决的。举个例子你要分析充电桩建设对新能源汽车销量的影响。用回归模型你大概率会得到充电桩数量每增加1%销量增长0.3%这样一条单调关系。但现实中这个系统是这样的销量增加 → 路上跑的新能源车变多 → 车主对充电便利性的抱怨变多 → 政府和企业加大充电桩投入 → 充电便利性提升 → 更多人愿意买新能源车。这是一个循环不是一条直线。你把它强行压成回归方程等于把一个反馈系统当成单向因果链来处理。系统动力学System DynamicsSD从诞生起就是为这种问题准备的。它把系统看成一个个存量Stock、流量Flow和反馈回路Feedback Loop的组合透过变量之间的因果关系去模拟系统随时间的演化行为。你不是去拟合历史数据而是去还原系统结构然后让结构自己产生行为。这是SD和大多数统计机器学习方法最本质的区别。1.2 系统动力学擅长处理的三类场景我自己的经验是下面三类问题用系统动力学特别合适长周期政策模拟比如碳减排政策、人口老龄化、产业补贴退坡时间跨度往往是5到20年很难用历史数据直接外推因为政策会改变系统结构。多主体相互作用的复杂性比如新能源汽车—充电桩—电网负荷—用户接受度之间的相互影响变量之间不是独立的而是互为因果。数据稀疏但有清晰因果逻辑很多竞赛题给出的数据量很小或者关键变量根本没有历史数据。但你能画出因果回路图知道变量之间大概的增强/削弱关系这种情况下SD模型也能搭起来用参数敏感性分析来弥补数据不足。1.3 本文的贯穿案例新能源汽车市场扩散模型为了不让理论悬空我选定一个典型场景作为全文案例区域新能源汽车保有量与充电基础设施协同演化。这个案例好在哪里它包含了一个典型的成长上限结构一开始新能源车少、充电桩也少用户观望情绪重随着政策补贴和基础设施投入销量上升但销量上升后充电服务压力变大如果不能及时配套充电桩用户体验下降又会抑制销量。这种增长—瓶颈—再增长的动态静态模型很难表现而Vensim可以很自然地刻画出来。如果你是做数学建模竞赛的也可以把这个模型改一改去套某区域新能源汽车渗透率预测共享单车投放优化分布式光伏推广之类的问题思路完全通用。2. 建模前先画因果回路图把思维模型变成结构图2.1 因果回路图不是随便画画的很多初学者拿到Vensim就直接开始拖存量流量图这是错误的习惯。因果回路图Causal Loop Diagram, CLD是建模的第一步它不涉及精确的数学方程只表达变量之间的因果影响方向。它的价值在于把脑子里的模糊想法外化成结构方便你检查逻辑有没有闭环。画CLD要注意几个规范有向弧表示从因到果。弧线旁用表示同向变化因增大导致果增大用-表示反向变化。闭合回路里负号个数为偶数回路是正反馈增强回路负号个数为奇数回路是负反馈平衡回路。2.2 新能源汽车案例的因果回路图拆解我先画几条核心回路方便后面搭存量流量图时对照R1口碑增强回路保有量增加 → 市场可见度提高 → 潜在用户转化率提高 → 年销量增加 → 保有量进一步增加。这是一个正反馈回路也是扩散的核心动力。B1基础设施约束回路保有量增加 → 充电需求压力增加 → 车桩比恶化 → 充电便利性下降 → 用户购买意愿下降 → 年销量减少 → 保有量增速放缓。这是一个负反馈回路它会限制系统无限增长。B2补贴约束回路保有量增加 → 财政补贴支出增加 → 补贴压力增大 → 补贴退坡 → 购车成本上升 → 销量增速下降。这三条回路同时存在系统最后呈现的行为取决于不同阶段哪条回路占据主导。前期R1主导销量指数增长中后期B1和B2主导增速放缓甚至出现平台期。这就是系统动力学中典型的S形增长行为任何一条回归曲线都很难同时捕捉这两个阶段。2.3 从CLD到存量流量图一个关键的思维转换CLD画完之后要转成存量流量图Stock-Flow Diagram。这个转换是新手最容易懵的地方。我总结了一个口诀存量是水箱里的水流量是进水管和出水管。你问自己一个问题图像里哪个变量是可以累加的比如保有量每年新增的销量会累积到存量里所以它是存量年销量本身不会累加它是一个速率所以它是流量。再比如充电桩数量也是存量每年的新建桩数量是流量。潜在用户规模可以被看成存量但它会随着已有用户增加而减少。这样一拆存量流量图的基本骨架就出来了。这里有一个我见过很多人翻车的细节有人把充电便利性画成存量。充电便利性是一个即时感知变量不是累积量它应该作为辅助变量取决于车桩比或其他状态。犯这种错误后面的方程会写得非常别扭。3. 用Vensim把模型落到能跑的方程从画图到仿真3.1 Vensim的版本选择与界面基础Vensim有几个版本PLE个人学习版免费但有限制DSS/Professional功能最全支持敏感性分析、寻优、C类函数等。数学建模竞赛和论文仿真用PLE其实也能完成大部分工作但如果你做敏感性分析比较频繁建议用DSS版本效率高很多。界面布局上Vensim有点像画图工具左侧是绘图工具栏包括变量、存量、流量、箭头等。中间是建模画布。上方是仿真控制栏可以设置时间范围、时间步长运行仿真。右侧或下方有输出窗口显示方程和错误信息。基本操作流程是先放存量Box变量再接流量Rate变量再连辅助变量和常量最后给每个元素输入方程和初始值然后Run。3.2 搭建新能源汽车扩散模型的完整步骤我把这个模型拆成一步一步你可以照着在Vensim里拖出来。第一步定义模型边界。我们关注的核心是区域新能源汽车保有量EV_Stock和充电桩数量CS_Stock两个存量。系统边界设定为不考虑细分车型差异不考虑跨区域流动只研究这个封闭区域内的扩散过程。时间单位为年仿真时长20年。第二步画核心存量流量。EV_Stock新能源汽车保有量单位万辆流入EV_Adoption_Rate年新增销量单位万辆/年初始值1.2万辆模拟区域起步阶段CS_Stock充电桩数量单位万根流入CS_Construction_Rate年新增充电桩单位万根/年初始值0.6万根第三步写辅助变量方程。这是模型的关键也是最需要花心思的地方。总潜在市场 Total_Market 50万辆代表区域内潜在购车家庭数潜在购车者 Potential_Users Total_Market - EV_Stock单位万辆市场转化率 Base_Adoption_Fraction 0.08每年有8%的潜在用户会购车这是在没有口碑效应和基础设施瓶颈时的基准值口碑效应 Word_of_Mouth (EV_Stock / Total_Market) * 1.5口碑效应的含义是存量越大、可见度越高越能带动转化率提升。1.5是放大系数表示口碑最强时可以把基础转化率提高1.5倍。便利度因子 Convenience_Factor WITH LOOKUP (CS_per_EV, ([(0,0)-(5,2)],(0,0.3),(0.5,0.6),(1,1),(2,1.4),(3,1.6)))其中 CS_per_EV CS_Stock / EV_Stock单位根/辆。这个查找函数的含义是车桩比在1左右是便利度1的基线状态车桩比低于1时便利度下降高于1时便利度上升但有上限。第四步写流量方程。EV_Adoption_Rate Potential_Users * Base_Adoption_Fraction * (1 Word_of_Mouth) * Convenience_FactorCS_Construction_Rate MAX(0, Target_CS - CS_Stock) / Construction_Delay这里Target_CS EV_Stock * Target_CS_per_EVTarget_CS_per_EV 1.2根/辆Construction_Delay 1.5年表示从规划到建成有1.5年延迟。为什么CS的流量方程要这样写它体现的是一种追赶策略目标充电桩数量取决于当前保有量保有量涨了目标就涨然后系统用一个延迟时间去逼近目标。这比每年固定建多少桩更贴切也更容易和后文的政策分析衔接。第五步单位与模型设置。Vensim里每个变量都可以填单位我强烈建议你填上。Vensim的单位检查功能会提示维度不一致的地方比如把万辆/年当成了万辆马上就能查出来。仿真设置上时间边界Initial Time 0Final Time 20Time Step 0.0625年即1/16年。很多人图省事把Time Step设为1这在很多情况下会带来明显的数值误差后面我会专门讲。3.3 延迟函数让模型更贴近现实的细节在上面的CS_Construction_Rate里我用了一个延迟的思想但Vensim里更专业做法是用DELAY1或DELAY3函数。比如你可以把计划建桩量Plan_Built作为输入然后用SMOOTH或DELAY1来模拟从计划到建成的滞后。Effective_Construction_Rate SMOOTH(Plan_Built, Construction_Delay)为什么用SMOOTH而不是直接除一个Delay因为SMOOTH把延迟表现为存量的调整过程更符合基建项目的实际节奏。如果你做更深层的模型遇到人口老龄化、技术扩散、供应链库存等问题SMOOTH和DELAY3几乎是标配。这里记住一个经验一阶延迟SMOOTH适合库存调节、技术采用等过程三阶延迟DELAY3适合需要经过多个阶段的系统比如规划→审批→建设→投运。3.4 第一次跑通后先别急着高兴我见过很多队伍第一次跑通模型出来的曲线是一根单调上升的直线就觉得仿真成功了。这个判断太早了。你要看曲线的形状、拐点、是否出现平台期甚至某些参数下是否出现震荡。如果模型只有两种结果——直线上升或直线下降多半是反馈回路没闭合或者方程写成了纯线性外推。以我这个模型为例合理的仿真结果应该是EV_Stock先加速增长然后增速逐步放缓出现S形趋势。CS_Stock也会跟着涨但可能会在某个阶段跟不上EV_Stock导致车桩比先降后升。如果你跑出来的曲线没有这种追赶-滞后的动态回到因果回路图检查一下很可能是某个负反馈回路没被激活。4. 从基线仿真到政策优化真正把模型用起来4.1 基线仿真先读懂曲线再动手调参模型跑通之后第一件事是跑基线情景也就是当前政策不变、参数取基准值的仿真结果。用这个结果来建立对系统行为的直觉。以我们的模型为例跑完20年仿真你需要重点盯三张图EV_Stock的曲线形状是S形还是近似直线拐点出现在第几年CS_per_EV的变化车桩比是越来越健康还是越来越恶化Convenience_Factor的变化便利度在哪个时间窗口下降最厉害我记得第一次完整跑通这个模型时EV_Stock在前8年涨得很好第8到12年增速明显放缓原因就是CS_Stock跟不上车桩比掉到了0.8以下便利度因子成了主要抑制项。这个增长放缓的节点就是政策优化要瞄准的痛点。4.2 敏感性分析哪些参数在悄悄支配结果Vensim的敏感性分析功能值得用好。做法是选定一个或几个参数设定变化范围比如补贴力度从0.8到1.5倍让Vensim自动跑多次仿真输出结果分布。我在这个案例里做过一次比较完整的敏感性分析结论很有意思Base_Adoption_Fraction基准转化率对20年末保有量的影响远大于CS_Construction_Delay建设延迟。也就是说要推广新能源车短期刺激购车意愿的效果比单纯加快建桩更明显。但如果你把仿真时间拉到30年结论又会反转长期看建桩延迟才是决定天花板的因素。所以做敏感性分析不只是为了走个流程而是为了搞清楚不同时期、不同目标条件下的关键杠杆点在哪里。我建议你在论文里把敏感性分析结果做成表格或者分布图这样评审老师一眼就能看出你对模型机理理解的深度。下面是我当年跑的一组简化敏感性结果供你参考参数组合时的思路情景基准转化率建设延迟(年)20年末保有量(万辆)20年末车桩比基线0.081.528.61.02强补贴0.121.539.40.72基建提速0.080.531.81.31双管齐下0.120.542.71.10看这张表很有意思强补贴情景能把保有量顶得很高但车桩比恶化基建提速虽然保有量增幅有限但车桩比健康很多双管齐下则兼得。这个结果说明光靠单一政策会带来结构性失衡组合拳才有价值——这种结论放在论文里就是一条清晰的模型指导实践的证据链。4.3 政策情景对比优化结论不能拍脑袋政策情景分析的关键是你要设定可解释、可对比的参数组合而不是随便改一堆参数看结果。我建议这三步走定义政策杠杆每个情景对应明确的政策含义。比如购置补贴退坡对应Base_Adoption_Fraction下调充电基础设施先行对应Construction_Delay缩短和Target_CS_per_EV提高。设定参数区间参数变化范围要说明依据是历史数据、政策文件还是合理假设。对比多维指标不要只看保有量一个指标要把车桩比、便利度、财政支出成本放一起看。我们上面那个强补贴vs基建提速vs双管齐下的三情景对比就是按这个逻辑做的。最后得到的优化建议是补贴保持温和退坡的同时把建设提前量从1.5年压缩到0.8年并把目标车桩比提到1.3能在20年内实现保有量和基础设施的较优平衡。这种优化结论不是靠调参调到好看得到的而是通过多情景仿真之后在结果对比中找到结构性原因论文里这样写说服力完全不同。5. Vensim实战中那些文档里不会写的坑5.1 时间步长和积分方法数值误差比你想象的大这是Vensim新手最容易踩的坑。我见过不少人直接把Time Step设成1结果模型跑出来的曲线毛刺特别多甚至出现数值震荡。Vensim默认的积分方法是Euler它其实是一种比较简单的一步积分法当时间步长过大时误差会积累。我的经验是对于大多数社会经济模型Time Step至少取1/8到1/16如果模型里有快速反馈回路或者延迟环节取到0.031251/32更稳。步长太大会导致延迟环节的精度明显下降步长太小又会让仿真变慢。还有一个很多人不知道的细节Vensim里可以切换积分方法在Model Settings里把Integration Type改成Runge-Kutta 4它比Euler在平滑性上更好适合非线性较强、延迟环节多的模型。但对于含不连续函数比如IF THEN ELSE的模型RK4反而可能引入振荡这时候Euler反而更稳。所以不要无脑用RK4。5.2 存量初始值定不好结果直接崩系统动力学对存量的初始值极其敏感因为存量的初始值决定了系统是从哪个状态开始演化的。如果EV_Stock初始值设为50已经趋近总市场模型跑出来的就是一直下滑的曲线因为没有增长空间了。我的建议是初始值一定要有数据支撑或合理假设。如果没有区域数据也可以通过稳态校准的方式反推。比如假设模型起始年份市场处于低速增长状态倒推出合理的初始值。这个方法在数据不足时特别实用。另外注意存量的初始值和流量方程要自洽。如果初始时刻流量方程算出的净变化率是负数模型会一开始就往下走容易让人误以为模型错了。跑仿真前先在0时刻手算一遍各流量值确认方向和量级都合理再开始跑20年。5.3 单位检查不是走形式我在前面反复提到单位这里必须再强调一次。Vensim的单位检查Check Model Units Check是排查方程错误最快速的手段。很多时候模型跑不通不是逻辑错而是单位混了比如把万根/年填成了万根系统在追踪单位一致性的时候就会报错。更微妙的是有些变量本身没有明确的物理单位比如Convenience_Factor这种无量纲变量在Vensim里要标注为Dmnl否则单位检查会报一个警告。很多人一开始不知道这个老是看到Units are not consistent的提示其实原因就是辅助变量没标Dmnl。5.4 论文和汇报中怎么展示系统动力学模型最后聊一点和竞赛、论文直接相关的展示经验。第一个建议因果回路图和存量流量图不要重复放你画了CLD就不需要再把CLD和SFD两张几乎一样的图贴满整篇文章。更好的做法是CLD用来讲定性逻辑SFD用来展示定量方程两者各司其职。第二个建议方程展示不要贴一大堆Vensim截图要把核心方程整理成规范数学形式配上参数表。评审老师最关心的是方程是否有明确含义参数怎么来的而不是你用了哪个软件。第三个建议仿真结果图务必标注横纵轴、单位、图例不同情景用不同线型或颜色。很多队伍的图没有图例或者曲线颜色接近评审根本看不清。这些小细节比你模型多复杂更能影响评价。老实说我在实际给队伍评审和辅导的时候看一个系统动力学模型做得好不好很少一上来就抠方程细节而是先看两样东西因果回路图能不能讲清楚仿真曲线是否体现了预期中的反馈行为。这两点做到了模型基本靠谱做不到方程再复杂也是空中楼阁。这也是我这些年反复用Vensim做建模后最深的体会——系统动力学模型的核心不是拟合而是理解系统的结构而Vensim的价值就是把你的理解变成能跑、能测、能优化的仿真实验。希望这篇文章能帮你少走些弯路直接上手做出自己的动态模型。
返回列表