:Safeti™ 与 QRA 原理——事件树、点火概率、暴露与风险度量)
PHAST-SAFETI二次开发教程09Safeti™ 与 QRA 原理——事件树、点火概率、暴露与风险度量版本声明块工具/软件Phast™ / Safeti™版本主线 9.x具体以官方发布说明为准Safeti™ 与 Phast™ 同版本节奏发布共用同一后果模型内核语言/环境Python ≥ 3.11用于复现事件树与风险度量的算法骨架Safeti™ 侧设置以官方 User Manual 为准本文目标不依赖任何界面先把 QRA 的数学骨架讲透再谈怎么在 Safeti™ 里配置一句话结论QRA 的核心恒等式是「风险 Σ 频率 × 后果 × 暴露」——事件树把一次泄漏的起始频率分解为各后果分支频率同一起始事件下所有分支概率之和恒为 1Individual Risk 与 LSIR 是空间点的年化死亡概率FN curve 是死亡人数与累计频率的二维社会风险曲线而 PLL 是该曲线的期望值Σ 频率 × 期望死亡人数单位 死亡/年三者互为投影不能互相替代。本篇铁律适用三级标注取自系列登记的 10 条[硬约束] 铁律 8 物理量不臆造点火概率、人员在场率、脆弱性参数一律取自项目依据文件法规/客户标准/官方文档本文只讲结构与算法不给经验常数。[硬约束] 铁律 9 风险标准可追溯风险度量与判据的来源必须可追。[强约束] 铁律 10 能力边界不越界本篇只讲原理与桌面侧配置不宣称 Safeti™ 侧具备未经官方证据的公开 API。[提示] 铁律 7 改完必验算法骨架算出的 IR/PLL 需与 Safeti™ 结果回归对齐。〇、本篇要解决的认知问题QRA 由哪些要素构成与纯后果分析的边界在哪事件树如何把「一次泄漏的频率」变成「每个后果的频率」分支概率为什么要归一点火概率为什么要分「即时」与「延迟」两条腿9.0 的点火模型是什么暴露exposure在计算里以什么形式进入在场率与建筑脆弱性各管什么Individual Risk、LSIR、FN curve、PLL 的精确区别与相互关系是什么风险排序点RRP与风险度量是什么关系以下「认知问题回显FAQ」与上列问题一一对应、同序作答。一、机制解析1.1 QRA 的五个要素要素回答的问题在 Safeti™ 中的落点危险识别与起始事件什么会泄漏、泄漏多大、多频繁Study / Scenario 组的频率设定事件树泄漏后可能发生什么后果分支与分支概率后果每种分支的物理影响复用 Phast™ 后果模型扩散/火灾/爆炸/毒性频率每种后果一年发生几次起始频率 × 分支概率暴露与脆弱性人在哪里、在多久、会不会死受体、在场率、建筑脆弱性OBRA后果分析止于第三步QRA 的增量正是第四、五步。理解这一点就理解了「Safeti™ 与 Phast™ 共用同一后果内核」这句话的含义风险层的差异全部来自频率与暴露而不是物理模型。1.2 事件树的结构┌─ 即时点火 ──▶ 喷射火 / 火球分支频率 f1 │ 起始泄漏事件 ──┬─ 有泄漏 ───────┼─ 延迟点火 ──▶ 闪火 / 爆炸分支频率 f2 起始频率 F0 │ │ │ └─ 未点火 ────▶ 有毒扩散 / 无后果分支频率 f4 │ └─ 无泄漏 ──────────────────▶ 无后果分支频率 f3 归一化约束f1 f2 f4 F0 有泄漏分支内 F0 × P(无泄漏) F0 × P(有泄漏) F0三个必须写进脚本的归一化断言同一节点的所有分支概率之和为 1所有叶节点的后果频率之和等于起始频率F0同一后果例如爆炸若由多条路径到达其总频率是各路径频率之和——这里最容易犯的错是漏加或重复加。1.3 点火概率两条腿点火概率必须拆成两个独立问题类型物理含义影响后果官方相关能力即时点火immediate ignition泄漏瞬间即被点燃喷射火 / 火球Safeti™ 场景点火设置延迟点火delayed ignition云团形成后才点燃闪火 / 爆炸MISOF / HYEX / Outside plant boundary9.0 新增源自挪威 DSB 指南延迟点火的三种方法适用于不同空间语义场内设施区的点火源分布MISOF、更具体的点火源建模HYEX、以及厂界之外的点火Outside plant boundary。方法选择本身就是一个敏感性维度应在脚本里作为显式字段管理而不是埋在一个全局默认值里。此外要区分「点火概率」与「点燃后的后果类型概率」延迟点火后是闪火还是爆炸取决于云团所处位置的阻塞/受限程度这属几何条件不属于点火概率。1.4 暴露与脆弱性暴露有三层缺一层结果就会系统性偏移空间在场率occupancy fraction某受体位置一年中有人在场的时间比例遮蔽与保护室内、防护墙、避难所对致死概率的折减脆弱性vulnerability给定影响强度下的致死概率毒性的 probit、热辐射与超压的致死判据。建筑类型与占用者脆弱性对应官方的OBRAOccupied Buildings Risk Assessment能力。1.5 风险度量的定义与关系度量精确定义单位空间/社会Individual Risk (IR)特定位置上一个个体因事故致死的年化概率含场景频率、后果概率与该点致死概率1/年空间点LSIRLocation-Specific Individual Risk特定位置处假设个体「始终在场且无保护」的年化致死概率常绘制为等值线1/年空间场FN curve社会风险曲线横轴为死亡人数 N纵轴为死亡人数 ≥ N 的累计频率F1/年社会PLLPotential Loss of Life期望年死亡人数 Σ后果频率 × 该后果的期望死亡人数死亡/年社会标量IRPAIndividual Risk Per Annum年化个体风险度量Safeti™ 9.1 起引入的表述1/年空间点RRPRisk Ranking Points用于在任意位置定位风险并识别主要风险贡献辅助量空间点关系要写清三条IR(x) Σ_i f_i × P_fatality(x | 后果 i) 点度量无保护个体 LSIR(x) 同式但固定「始终在场、无保护」的假设个体 IR 的一个规范化特例 FN: N→F(N)Σ_{i: N_i ≥ N} f_i 社会度量累计频率 PLL Σ_i f_i × N_i ≈ ∫ N dF FN 曲线的一阶矩/期望也就是说LSIR 是 IR 在「始终在场且无保护」假设下的规范形式PLL 是 FN 曲线的期望值同一组场景下二者必须自洽PLL 不可由 IR 直接推出因为 IR 不含人数。IR 等值线、社会风险与 PLL 是 Safeti™ 的三类典型结果表达。二、完整操作与脚本逐段剖析2.1 第一段事件树频率分解器含归一化断言# -*- coding: utf-8 -*-# 演示事件树频率分解。所有概率与频率均为输入量取自项目依据文件fromdataclassesimportdataclass,field# 标准库数据结构fromtypingimportList,Dict# 类型标注dataclassclassBranch:事件树的一条分支条件概率与后果类型。 概率取值必须来自项目依据法规/客户标准/官方文档本类不做任何缺省填充。 name:str# 分支名如 即时点火probability:float# 条件概率须落在 [0, 1]outcome:str# 后果类型jet_fire / explosion / toxic 等probability_source:str# 概率来源追溯铁律 9dataclassclassReleaseCase:一个起始泄漏场景。case_id:str# 唯一键与后果工况表对齐frequency:float# 起始频率单位 1/年frequency_source:str# 频率来源如 失效数据库/法规branches:List[Branch]field(default_factorylist)# 分支列表defvalidate(case:ReleaseCase)-None:校验概率归一与取值合法性不通过直接抛错避免错误静默传播。ifcase.frequency0:# 频率必须为正raiseValueError(case.case_id起始频率必须为正)totalsum(b.probabilityforbincase.branches)# 分支概率合计ifabs(total-1.0)1e-9:# 归一化硬约束raiseValueError(case.case_id分支概率合计str(total)不为 1)forbranchincase.branches:# 逐分支取值范围ifnot(0.0branch.probability1.0):raiseValueError(case.case_idbranch.name 概率越界)defexpand(case:ReleaseCase)-Dict[str,float]:把起始频率分解为各后果类型的总频率同后果多路径求和。validate(case)# 先校验再分解outcome_freq:Dict[str,float]{}# 后果类型 → 累计频率forbranchincase.branches:# 遍历分支contributioncase.frequency*branch.probability# 分支频率outcome_freq[branch.outcome]outcome_freq.get(branch.outcome,0.0)contribution totalsum(outcome_freq.values())# 各后果频率合计ifabs(total-case.frequency)1e-9:# 守恒断言合计必须等于起始频率raiseValueError(case.case_id后果频率合计与起始频率不符)returnoutcome_freq# 返回 {后果: 频率}# —— 示例装配一条泄漏场景、三个互斥分支概率为占位示意实际须来自依据文件——demoReleaseCase(case_idLOC-001,# 场景标识frequency0.02,# 起始频率 1/年占位值须替换frequency_source项目依据文件-失效频率表,# 来源追溯branches[Branch(即时点火,0.30,jet_fire,项目依据-点火概率表),# 占位概率Branch(延迟点火,0.40,explosion,项目依据-MISOF 方法),# 占位概率Branch(未点火,0.30,toxic,项目依据-未点火比例),# 占位概率],)print(expand(demo))# 输出各后果频率这段把「QRA 最难对账的部分」变成了可断言的算法任何概率笔误都会在归一化或守恒断言处立刻暴露。同时每个数值都带*_source字段满足风险标准可追溯。2.2 第二段从后果频率算 IR 与 PLL# -*- coding: utf-8 -*-# 演示由分支频率 致死概率 人数算 IR 与 PLL并构造 FN 曲线importmath# 标准库defindividual_risk(outcome_freq:dict,fatality:dict)-float:计算某空间点的 Individual Risk无保护个体、始终在场。 outcome_freq: {后果类型: 频率 1/年} fatality: {后果类型: 该点致死概率}来自脆弱性/probit 或致死判据 returnsum(outcome_freq[outcome]*fatality.get(outcome,0.0)foroutcomeinoutcome_freq)# Σ 频率 × 致死概率deffn_curve(outcome_freq:dict,fatalities:dict)-list:构造 FN 曲线返回按死亡人数降序的 (N, 累计频率 F) 列表。 fatalities: {后果类型: 该后果导致的期望死亡人数 N_i} events[]# (N_i, f_i) 事件集合foroutcome,freqinoutcome_freq.items():# 遍历后果nfatalities.get(outcome,0.0)# 该后果的死亡人数iffreq0:# 只保留有效事件events.append((n,freq))# 收集events.sort(keylambdaitem:item[0],reverseTrue)# 按人数降序curve,cumulative[],0.0# 累积频率累加器forn,freqinevents:# 逐事件累积cumulativefreq# F(N) Σ f_i, N_i Ncurve.append((n,cumulative))# 记录一个折点returncurve# 返回曲线折点defpotential_loss_of_life(outcome_freq:dict,fatalities:dict)-float:PLL Σ 频率 × 期望死亡人数单位 死亡/年。returnsum(outcome_freq[outcome]*fatalities.get(outcome,0.0)foroutcomeinoutcome_freq)# 一阶矩求和defpll_from_fn_curve(events:list,upper_n:float,steps:int20000)-float:由 FN 曲线反算 PLL验证与 Σ f_i N_i 的一致性。 恒等式PLL ∫₀^∞ F(N) dN其中 F(N) Σ_{i: N_i ≥ N} f_i累计频率。 events[(N_i, f_i)] 事件列表upper_n积分上界取事件最大人数。 dnupper_n/steps# 积分步长integral0.0# 累积面积forkinrange(steps):# 中值法逐格积分n(k0.5)*dn# 格子中点人数f_nsum(freqforn_i,freqineventsifn_in)# 该点处的累计频率integralf_n*dn# 面积累加returnintegral# 返回积分值defcheck_consistency(events:list,pll:float)-float:自洽检查曲线积分得到的期望值应与直接求和得到的 PLL 一致。ifnotevents:# 空集合直接返回 0return0.0upper_nmax(n_iforn_i,_inevents)# 积分上界取最大人数integralpll_from_fn_curve(events,upper_n)# 曲线积分returnabs(integral-pll)# 返回偏差应趋近 0outcome_freqexpand(demo)# 复用上一段的分支频率fatality{jet_fire:0.9,explosion:0.7,toxic:0.2}# 占位致死概率须来自依据文件铁律 8fatalities{jet_fire:2.0,explosion:5.0,toxic:1.0}# 占位人数须来自受体建模irindividual_risk(outcome_freq,fatality)# 计算该点 IRcurvefn_curve(outcome_freq,fatalities)# 构造 FN 曲线折点pllpotential_loss_of_life(outcome_freq,fatalities)# 计算 PLLprint(IR %.3e /年%ir)# 点风险print(FN 曲线折点 ,curve)# 社会风险曲线print(PLL %.3e 死亡/年%pll)# 期望年死亡人数events[(fatalities.get(k,0.0),v)fork,vinoutcome_freq.items()]# 组装 (N_i, f_i) 事件print(PLL 一致性偏差 %.3e%check_consistency(events,pll))# 应趋近 0关键纪律IR 与 PLL 的公式形状相同但语义不同——IR 对应的是单个个体的致死概率PLL 对应的是人数规模把两者混算例如用人数乘 IR在数值上可能看似合理在概念上已经错了。2.3 第三段把点火模型作为敏感性维度# -*- coding: utf-8 -*-# 演示延迟点火方法MISOF / HYEX / Outside plant boundary作为敏感维度做对照importcopy# 标准库深拷贝避免污染基准IGNITION_METHODS[MISOF,HYEX,OUTSIDE_PLANT_BOUNDARY]# 9.0 官方点火模型方法名defwith_delayed_probability(case,new_probability:float,source:str):返回一个把延迟点火概率替换后的新场景基准场景不变。clonecopy.deepcopy(case)# 深拷贝保证基准可复现forbranchinclone.branches:# 定位延迟点火分支ifbranch.name延迟点火:# 按语义名匹配deltanew_probability-branch.probability# 概率增量branch.probabilitynew_probability# 替换概率branch.probability_sourcesource# 更新来源追溯# 为维持归一化把增量从「未点火」分支扣回示例策略实际按依据文件规定forotherinclone.branches:# 寻找互补分支ifother.name未点火:# 语义匹配other.probabilityother.probability-delta# 保持合计为 1validate(clone)# 归一化校验returnclone# 返回新场景formethodinIGNITION_METHODS:# 逐方法对照# 概率取值须来自项目依据文件此处仅为结构演示prob{MISOF:0.40,HYEX:0.45,OUTSIDE_PLANT_BOUNDARY:0.35}[method]# 占位值scenariowith_delayed_probability(demo,prob,项目依据-method)# 构造场景freqexpand(scenario)# 频率分解print(method,→ 爆炸频率 %.4f /年%freq.get(explosion,0.0))# 对照打印敏感性归因才是点火模型的正确用法方法选择不改物理模型改的是频率分配因此风险差异必须在频率层解释。三、常见报错与排查现象 1分支概率之和不等于 1Safeti™ 计算出的总频率与起始频率对不上。根因分支集合不完备漏了「无泄漏」或「未点火」路径或两条路径重复计入同一结果。解法用 2.1 段的validate()与守恒断言作为门禁先画完整事件树再填概率。现象 2把 IR 等值线当成 LSIR 使用对客户论证时口径不一致。根因IR 含在场率与保护假设LSIR 固定「始终在场且无保护」。二者数值必然不同。解法明确报告口径——LSIR 用于场地布局与等值线对比IR 用于具体人员风险评估两者都以官方 User Manual 的定义为准。现象 3FN 曲线画出来形状怪异或与社会风险结论矛盾。根因纵轴用了单事件频率而非累计频率 FN ≥ 阈值或同一后果的多路径频率被漏加。解法如 2.2 段按人数降序累积对同一后果多路径先求和再入曲线。现象 4PLL 与 FN 曲线不自洽。根因曲线上漏掉了死亡人数为 0 但有频率的事件或人数取整导致一阶矩偏移。解法保留小人数事件在计算内只在绘图时裁剪人数使用期望值而非取整值。现象 5改了点火模型方法IR 完全不变。根因后果类型未随之重映射例如延迟点火的后果仍全部记为闪火而爆炸分支未生成。解法把「点火方法 → 后果类型映射」显式配置化并断言爆炸频率随方法变化而变。四、动手练习把demo的起始频率从 0.02 改为 0.05验证 IR 与 PLL 按线性比例变化频率是线性因子。增加一条「有泄漏但落在无点火源区域」的分支重新归一化观察 FN 曲线折点数与 PLL 的变化方向。对同一后果类型构造两条路径不同起始事件验证expand()会把频率相加并在 FN 曲线上只出现一个更高频的折点。五、小结与下一篇预告本篇建立了 QRA 的数学骨架事件树的归一化与守恒、点火概率的即时/延迟二分9.0 的 MISOF/HYEX/Outside plant boundary、暴露的三层结构以及 IR / LSIR / FN curve / PLL / IRPA 的定义与相互关系并强调「LSIR 是 IR 的规范化特例、PLL 是 FN 的一阶矩」。下一篇10 Safeti™ 研究设置将把本篇的原理落到工程配置布局与地图、敏感受体、风险排序点RRP布点策略以及 LSIR/FN/PLL 三类结果的读取与风险贡献分解。本篇认知问题回显FAQQ1QRA 由哪些要素构成与纯后果分析的边界在哪答五要素起始事件与危险识别、事件树、后果、频率、暴露与脆弱性。边界在于——后果分析止于「给定场景的物理影响」Phast™ 侧完成QRA 在此之上再做两件事把起始频率按事件树分解为后果频率再把频率与人员在场/脆弱性相乘得到风险。Safeti™ 与 Phast™ 共用同一后果模型内核因此风险层的全部差异来自频率与暴露假设而非物理模型。Q2事件树如何把一次泄漏的频率变成每个后果的频率分支概率为什么必须归一答分支频率 起始频率 × 该分支的条件概率同一后果若由多条路径到达则其总频率为各路径频率之和。必须归一的原因是对账同一节点所有分支概率之和为 1等价于所有叶节点频率之和等于起始频率这是频率守恒的充要表达一旦不归一后续 IR/FN/PLL 全部偏移且难以定位。Q3点火概率为什么要分即时与延迟两条腿9.0 的点火模型是什么答因为两者导致的后果截然不同——即时点火直接形成喷射火或火球延迟点火在云团形成后点燃可能形成闪火或爆炸且后者的后果类型还取决于云团所在位置的阻塞/受限程度。Safeti™ 9.0 新增的点火模型方法为 MISOF 与 HYEX以及厂界之外点火Outside plant boundary官方口径为基于挪威 DSB 指南方法选择属敏感性维度应显式配置而非依赖默认值。Q4暴露以什么形式进入计算在场率与建筑脆弱性各管什么答三层进入。空间在场率occupancy fraction回答「人在不在」作为乘性因子作用在致死概率上遮蔽与保护室内、防护墙、避难所对致死概率做折减脆弱性probit 或致死判据回答「给定强度下会不会死」。建筑类型与占用者脆弱性对应官方的 OBRA 能力用于建筑选址与占用建筑风险评价。Q5IR、LSIR、FN curve、PLL 的区别与相互关系是什么答IR 是特定位置上一个个体的年化致死概率1/年是空间点度量LSIR 是同一位置在「个体始终在场且无保护」这一固定假设下的年化致死概率因此是 IR 的一个规范化特例常用于等值线与平面布局比较FN curve 是横轴死亡人数、纵轴累计频率死亡人数 ≥ N 的频率的社会风险曲线PLL 是期望年死亡人数Σ 频率 × 期望死亡人数单位 死亡/年即 FN 曲线的一阶矩。彼此关系可概括为LSIR 是 IR 的规范形式PLL 是 FN 的期望值IR 与 PLL 公式同形但语义不同个体 vs 人数规模。Q6风险排序点RRP与风险度量是什么关系答RRP 是 Safeti™ 中用于在任意位置定位风险并识别主要风险贡献的功能它本身不是一种独立的风险度量而是对风险度量做空间采样与归因的手段在关注位置上把总风险分解为各场景/各后果的贡献从而回答「这个点的风险主要来自哪里」。因此 RRP 常与 IR 等值线配合使用——等值线给空间格局RRP 给贡献结构。