资讯动态

系统动力学课件案例分析:从存量流量图到Python仿真实验

发布时间:2026/10/15 7:24:58 来源:尧图企业网站定制
简介这份系统动力学课件与案例分析资料面向管理学、经济学及系统工程方向的学习者与研究者帮助读者理解复杂系统中的反馈机制、延迟效应与因果环路掌握从建模到仿真决策的完整分析思路。压缩包内共1个PPT文件约1.11MB以图文并茂的幻灯片形式梳理了系统动力学的发展脉络、核心原理、分析步骤与基本概念并配有实际案例演示。内容涵盖Forrester教授创立工业动力学的历史沿革、世界模型与国家模型的研究成果以及国内学者在区域规划、企业管理、生态环保等领域的应用实践啤酒游戏等经典教学案例则直观展示了供应链库存动态与需求预测的挑战。目前已有1136人学习下载适合课堂教学、课题研究或自学参考可帮助读者建立系统性思考方式为处理涉及长期影响与整体性的复杂决策问题提供理论工具与方法借鉴。1. 系统动力学课件和案例分析从存量流量图到可复现的仿真实验很多做系统思考的同行第一次接触系统动力学都是被一张存量流量图吸引然后卡在“课件看得懂、模型跑不动”这一步。系统动力学课件和案例分析真正要解决的不是画图好不好看而是把现实里的反馈回路、延迟、非线性翻译成一组能跑、能调、能验证的微分方程。它适合做政策评估、产能规划、库存策略、市场扩散这类“牵一发动全身”的问题。我见过太多人把课件当PPT翻一遍就过结果一到自己建模变量单位对不上、量纲乱套、仿真步长设错跑出来的曲线像玄学。这篇笔记就按我实际带人做案例的顺序把课件里的知识点拆成能落地的步骤从工具选型、方程写法、参数标定一直讲到排错和验证。2. 先选对工具和建模粒度别一上来就写微分方程2.1 课件里不会明说的三种建模粒度系统动力学课件通常从因果回路图讲起再过渡到存量流量图但很少告诉你什么时候该用哪种粒度。我一般把建模分成三档定性回路图、半定量存量流量图、全定量仿真模型。定性回路图只标正负反馈用来和业务方对齐认知不写方程半定量存量流量图会标出存量和流量但参数用区间或相对值适合早期探索全定量仿真模型才需要给每个辅助变量写方程、标单位、设初值。很多案例分析的失败就是拿定性图去回答定量问题或者反过来一上来就写方程结果业务方看不懂自己也没法验证。选粒度的判断标准很简单如果决策需要比较不同策略在时间轴上的累积效果就必须上全定量如果只是确认“有没有反馈回路”定性图足够。我通常先用半小时画一张因果回路图标出关键回路和延迟再决定要不要往下走。这一步省掉后面返工概率极高。2.2 工具选型电子表格、专用仿真软件、通用编程语言课件里常出现的工具无非三类电子表格、专用系统动力学软件、通用编程语言。电子表格适合教学演示和小规模模型存量用单元格累加流量用公式引用优点是透明、易改缺点是回路一多就难以维护而且没有内置的积分器步长控制全靠手动。专用软件内置存量流量图编辑器和多种积分算法适合中等规模模型但授权和迁移成本要考虑。通用编程语言适合需要嵌入优化、批量实验或对接数据的场景缺点是画图得自己来方程得自己写。我自己的习惯是教学和快速原型用电子表格正式案例用Python加科学计算库。原因很实际——课件里的案例往往需要反复调参、做敏感性分析编程语言的循环和并行能力比点鼠标快得多。下面给一个最小可跑的存量流量模型用欧拉法积分对应课件里最常见的“库存-订货”案例。import numpy as np import matplotlib.pyplot as plt # 参数设置对应课件里常见的库存调节案例 desired_inventory 100.0 # 期望库存单位件 adjustment_time 5.0 # 库存调整时间单位周 initial_inventory 20.0 # 初始库存 simulation_weeks 52 # 仿真周期 dt 0.25 # 仿真步长单位周 # 初始化状态变量 inventory initial_inventory inventory_history [inventory] time_history [0.0] # 欧拉法迭代存量 存量 流量 * dt for step in range(int(simulation_weeks / dt)): # 流量方程订货率 (期望库存 - 当前库存) / 调整时间 order_rate (desired_inventory - inventory) / adjustment_time # 更新存量 inventory inventory order_rate * dt inventory_history.append(inventory) time_history.append((step 1) * dt) # 绘制结果 plt.plot(time_history, inventory_history) plt.xlabel(Time (weeks)) plt.ylabel(Inventory (units)) plt.title(Inventory Adjustment Dynamics) plt.grid(True) plt.show()这段代码的逻辑说明存量是库存流量是订货率订货率由期望库存与当前库存的差除以调整时间得到这是课件里最基础的一阶负反馈。参数说明adjustment_time决定系统响应速度值越小调整越快但步长dt必须足够小否则欧拉法会震荡甚至发散。我一般要求dt小于最小时间常数的五分之一这里调整时间是5周dt0.25周是安全的。如果你把dt改成2周会看到库存曲线来回过冲这就是数值不稳定不是模型本身的问题。2.3 从课件案例到可复现模型先定边界再定变量课件里的案例分析通常给一个背景故事然后列出若干变量。我的做法是先把边界画出来哪些变量是内生的哪些是外生的哪些干脆不纳入。边界定错后面全是无用功。比如一个产能规划案例如果把人员招聘周期当成外生常数模型就失去了对招聘策略的反馈但如果把整个劳动力市场都纳入模型又过于庞大。常见做法是只纳入与决策直接相关、且能在合理时间内获取数据的变量。定完边界再列变量表每个变量标单位、初值、方程类型。这一步用表格比用文字清楚得多。变量名类型单位初值方程/来源库存存量件20初始值订货率流量件/周—(期望库存-库存)/调整时间期望库存辅助变量件100外生常数调整时间参数周5外生常数这张表就是课件里存量流量图的文字版写清楚之后代码只是翻译。3. 把课件里的因果回路图翻译成方程四个必须落地的步骤3.1 存量流量图到微分方程的对应规则系统动力学课件会强调存量和流量的区别但落到方程时很多人还是会把辅助变量当成存量。规则其实只有一条存量是状态流量是存量的变化率辅助变量是瞬时计算值。用数学写就是d(存量)/dt 流入 - 流出。所有流量都必须依附于某个存量不能凭空产生。辅助变量可以依赖存量、其他辅助变量、参数和时间但不能被积分。我见过有人把“市场需求”当成存量结果模型里需求自己累积完全失真。市场需求是流量或辅助变量不是存量。另一个常见错误是单位不统一。课件里经常省略单位但仿真时单位必须一致。比如库存单位是件时间单位是周那么订货率必须是件/周。如果某个参数用“件/天”就要乘以7转换。单位检查是建模后第一件要做的事比调参重要得多。3.2 用Python写一个带延迟的二阶库存模型课件里的案例一旦涉及供应链就会出现延迟。延迟在系统动力学里通常用高阶指数延迟或物质延迟表示。下面这个例子在之前一阶模型基础上加了一个运输延迟用三阶指数延迟近似对应课件里“在途库存”的概念。import numpy as np import matplotlib.pyplot as plt # 参数 desired_inventory 100.0 adjustment_time 5.0 shipping_delay 3.0 # 运输延迟单位周 initial_inventory 20.0 initial_in_transit 0.0 simulation_weeks 52 dt 0.1 # 三阶延迟的中间状态 delay_stages 3 stage_state [0.0] * delay_stages stage_output [0.0] * delay_stages inventory initial_inventory in_transit initial_in_transit history {time: [0.0], inventory: [inventory], in_transit: [in_transit]} for step in range(int(simulation_weeks / dt)): # 订货率基于库存缺口 order_rate (desired_inventory - inventory) / adjustment_time # 三阶指数延迟每阶时间常数 总延迟 / 阶数 stage_tau shipping_delay / delay_stages # 第一阶输入是订货率 stage_input order_rate for i in range(delay_stages): # 每阶存量更新 stage_state[i] stage_state[i] (stage_input - stage_state[i] / stage_tau) * dt stage_input stage_state[i] / stage_tau # 到达率是最后一阶的输出 arrival_rate stage_input # 库存更新流入是到达率流出假设为0简化 inventory inventory arrival_rate * dt # 在途库存更新 in_transit in_transit (order_rate - arrival_rate) * dt history[time].append((step 1) * dt) history[inventory].append(inventory) history[in_transit].append(in_transit) plt.plot(history[time], history[inventory], labelInventory) plt.plot(history[time], history[in_transit], labelIn Transit) plt.xlabel(Time (weeks)) plt.ylabel(Units) plt.legend() plt.grid(True) plt.show()逻辑说明三阶指数延迟把运输过程拆成三个串联的一阶延迟每阶的时间常数是总延迟除以阶数。参数说明shipping_delay是总平均延迟delay_stages决定延迟曲线的形状阶数越高越接近纯延迟但计算量也越大。常见做法是取三到六阶。dt必须小于最小时间常数的一半这里最小时间常数是1周dt0.1周足够。如果你把dt改成0.5会看到在途库存出现非物理的负值这就是数值误差。3.3 参数标定课件里的常数从哪来课件里的案例分析通常直接给参数值但实际项目中这些值需要标定。我一般分三步先查历史数据算平均值或回归再用业务访谈定范围最后用敏感性分析确认关键参数。比如调整时间可以从历史订单响应数据里拟合也可以问业务方“从发现缺货到下单通常多久”。如果数据缺失就用区间扫描看模型输出对哪个参数最敏感然后重点标定那个。不要把所有参数都当成精确值系统动力学模型的价值在于趋势和反馈结构不在于小数点后两位。3.4 仿真步长和积分方法欧拉法什么时候会翻车欧拉法简单但只适合步长足够小的情况。课件里很少讲数值稳定性但这是血泪经验。判断标准如果最小时间常数是T步长dt应小于T/5最好小于T/10。如果模型里有振荡回路dt还要更小。另一种做法是用四阶龙格库塔但实现复杂教学案例用欧拉法足够。如果你发现曲线出现锯齿、过冲、负值先检查dt再检查方程。不要急着调参数那只会掩盖数值问题。4. 案例分析避坑从单位错乱到回路遗漏的排查清单4.1 现象库存曲线指数发散越跑越大原因正反馈回路没有限制条件或者流量方程写成了正比于存量且系数为正。解决检查每个回路是否有负反馈约束存量是否有流出。常见于“需求拉动生产”模型里把需求写成存量的正比函数结果需求自己刺激自己。4.2 现象变量单位对不上仿真结果量级离谱原因时间单位混用比如存量按天更新流量按周计算。解决统一时间单位所有流量除以或乘以相应系数。我一般强制所有时间单位用周所有流量用每周。单位检查表要逐项过。4.3 现象延迟环节导致库存永远为负原因延迟阶数太低或时间常数太小导致到达率瞬间超过订货率。解决增加延迟阶数或增大时间常数或减小步长。物理上在途库存不能为负如果出现负值说明数值方法有问题。4.4 现象敏感性分析结果和课件结论相反原因课件里的参数范围可能不适用于你的场景或者模型边界不同。解决不要迷信课件结论先确认自己的边界和单位再重新扫描参数。系统动力学模型是特定假设下的产物换场景就要重新验证。4.5 现象模型跑得通但业务方不认原因变量名太抽象或者回路图和业务语言脱节。解决把存量流量图翻译成业务能懂的词比如“在途库存”叫“已下单未到货”“调整时间”叫“补货反应速度”。案例分析的价值在于沟通不在于数学复杂度。5. 用敏感性分析和情景对比验证课件案例一个可复现的实验模板5.1 单参数扫描找出最敏感的那个旋钮课件里的案例往往只给一条曲线但实际决策需要知道哪个参数最要命。我一般用单参数扫描固定其他参数让目标参数在合理范围内变化看输出曲线的包络。下面这段代码在之前库存模型基础上做调整时间的扫描。import numpy as np import matplotlib.pyplot as plt def simulate(adjustment_time, dt0.1, weeks52): desired 100.0 inv 20.0 history [inv] for _ in range(int(weeks / dt)): order (desired - inv) / adjustment_time inv inv order * dt history.append(inv) return history time np.arange(0, 52 0.1, 0.1) for tau in [2, 5, 10, 20]: plt.plot(time, simulate(tau), labelfadjustment_time{tau}) plt.xlabel(Time (weeks)) plt.ylabel(Inventory (units)) plt.legend() plt.grid(True) plt.show()逻辑说明调整时间越小库存越快接近期望值但过小会导致过冲。参数说明扫描范围一般取基准值的0.5倍到4倍。如果曲线对某个参数特别敏感这个参数就需要重点标定。常见做法是画龙卷风图但教学案例用多条曲线足够。5.2 情景对比把课件里的“政策选项”变成可比较的曲线系统动力学案例分析的最终产出通常是“策略A比策略B好”。要验证这个结论需要把不同策略写成不同参数组合或不同方程结构然后在同一时间轴上对比。我一般用表格列出情景定义再用循环批量仿真。比如库存案例里策略A是固定调整时间策略B是自适应调整时间。对比时除了看最终值还要看累积偏差、最大过冲、恢复时间。这些指标比单条曲线更有说服力。5.3 模型验证历史数据回测与极端条件测试课件里的案例很少讲验证但这是落地必须做的。我一般做两件事一是用历史数据回测把模型输出和实际数据叠在一起看趋势和拐点是否吻合二是极端条件测试把参数推到边界看模型是否出现非物理行为。如果极端条件下模型崩溃说明方程或数值方法有问题。验证通过后再拿去做情景对比结论才可信。我自己的习惯是每建一个模型先跑通最小可复现版本再逐步加回路和延迟每加一步就检查单位和数值稳定性。这样虽然慢但返工少。系统动力学课件和案例分析的价值不在于画出多漂亮的图而在于把反馈结构变成能反复实验的沙盘。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑