You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Dymola导入模型后,用Python开展全局敏感性分析的方法及示例咨询

我之前刚好做过类似的Dymola住宅模型转Python做全局敏感性分析的项目,给你梳理下完整的实现流程和实操示例,应该能帮你快速落地:

第一步:把Dymola模型导出为Python可调用的格式

Dymola模型要导出成FMU(Functional Mock-up Unit),这是跨平台模型交互的标准格式,Python有成熟的库支持加载运行。

  • 操作步骤:打开你的单户住宅模型,点击File > Export > Export as FMU,推荐选Model Exchange模式(更适合仿真分析场景),设置好导出路径和文件名后完成导出就行。
第二步:搭建Python分析环境

需要安装几个核心工具库,直接用pip安装:

pip install pyfmi SALib pandas numpy matplotlib
  • pyfmi:负责加载和运行FMU模型
  • SALib:专门做全局敏感性分析的工具,支持Sobol、Morris、FAST等主流方法
  • 剩下的是数据处理和可视化的基础库
第三步:先验证FMU模型的基本仿真

先写一段简单代码,确保模型能在Python里正常跑通全年仿真:

from pyfmi import load_fmu
import numpy as np

# 加载你的FMU模型,替换成实际文件名
model = load_fmu("your_house_model.fmu")

# 设置全年仿真时间(单位秒,8760小时×3600秒/小时)
start_time = 0.0
end_time = 8760 * 3600

# 可选:先设置一组参数测试(比如外墙导热系数)
# model.set("wall_thermal_conductivity", 0.03)

# 运行仿真
res = model.simulate(start_time=start_time, final_time=end_time)

# 获取全年总能耗(替换成你模型里实际的能耗输出变量名)
total_energy = res["total_energy_consumption"][-1]
print(f"测试仿真:全年总能耗为 {total_energy:.2f} kWh")

注意:一定要替换代码里的FMU文件名和能耗输出变量名,这些要和你Dymola模型里的定义完全一致。

第四步:全局敏感性分析(以常用的Sobol方法为例)

Sobol方法能给出每个参数的一阶敏感性(单独影响)和总敏感性(单独+交互影响),很适合探究参数对能耗的全局影响。

1. 定义待分析的参数范围

先把你要研究的参数列出来,比如:

from SALib.sample import saltelli
from SALib.analyze import sobol

# 定义敏感性分析的问题框架
problem = {
    'num_vars': 4,
    'names': ['外墙导热系数', '窗户U值', '室内设定温度', '建筑气密性'],
    'bounds': [[0.02, 0.05],   # 外墙导热系数:W/(m·K)
               [1.0, 3.0],     # 窗户U值:W/(m²·K)
               [18, 24],       # 室内设定温度:℃
               [0.5, 2.0]]     # 建筑气密性:ACH(每小时换气次数)
}

2. 生成全局采样点

用Saltelli方法生成覆盖参数空间的样本点,N建议取1000以上,结果更稳定:

N = 1000
# Saltelli采样会生成 8×N 个样本点
param_values = saltelli.sample(problem, N)

3. 批量仿真计算能耗

遍历每个样本点,设置参数并运行仿真,记录每次的能耗结果:

Y = np.zeros([param_values.shape[0]])

for i, params in enumerate(param_values):
    # 每次仿真前重置模型状态
    model.reset()
    # 依次设置参数(顺序要和problem里的names对应)
    model.set("wall_thermal_conductivity", params[0])
    model.set("window_U_value", params[1])
    model.set("indoor_set_temp", params[2])
    model.set("air_change_rate", params[3])
    # 运行仿真
    res = model.simulate(start_time=start_time, final_time=end_time)
    # 记录能耗结果
    Y[i] = res["total_energy_consumption"][-1]
    print(f"完成第 {i+1}/{len(param_values)} 次仿真")

小提示:如果样本量很大(比如N=1000会生成8000个样本),可以用multiprocessing库做并行仿真,能大幅提速。

4. 分析敏感性结果

用SALib的Sobol分析函数处理结果,直接打印关键指标:

# 分析并打印结果
Si = sobol.analyze(problem, Y, print_to_console=True)

# 提取一阶敏感性S1和总敏感性ST,整理成表格
import pandas as pd
sensitivity_df = pd.DataFrame({
    '参数': problem['names'],
    '一阶敏感性(S1)': Si['S1'],
    '总敏感性(ST)': Si['ST']
})
print("\n敏感性结果汇总:")
print(sensitivity_df)
  • 一阶敏感性S1:数值越大,说明该参数单独对能耗的影响越强
  • 总敏感性ST:如果ST远大于S1,说明该参数和其他参数有显著的交互作用
第五步:结果可视化(可选但推荐)

用matplotlib把敏感性结果画成柱状图,更直观:

import matplotlib.pyplot as plt

x = np.arange(len(problem['names']))
width = 0.35

fig, ax = plt.subplots(figsize=(10, 6))
rects1 = ax.bar(x - width/2, Si['S1'], width, label='一阶敏感性(单独影响)')
rects2 = ax.bar(x + width/2, Si['ST'], width, label='总敏感性(单独+交互影响)')

ax.set_xticks(x)
ax.set_xticklabels(problem['names'])
ax.set_ylabel('敏感性指数')
ax.set_title('各参数对全年总能耗的敏感性分析')
ax.legend()

plt.show()
一些注意事项
  • 导出FMU时,要确保模型里的参数和输出变量都设置为Public属性(Dymola里变量的属性面板可以调整),否则Python无法访问
  • 仿真时间单位要统一,Dymola里如果用小时,Python里要对应转换,避免时间不一致导致结果错误
  • 如果模型仿真速度太慢,可以考虑简化次要部件(比如把一些动态模块改成静态参数),或者用代理模型(比如响应面法)替代原模型,减少计算量

内容的提问来源于stack exchange,提问作者Adnan Muntaseer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:41