利用贝叶斯网络评估空间目标威胁(2)

复现论文时,最怕的不是代码报错,而是图看起来相似,但内在逻辑却对不上——例如为了强行匹配文中某个单点数值,反而毁掉了整条曲线的合理性。

书接前文
在这里插入图片描述

在航天器进行贝叶斯网络评估空间目标威胁模型建立后,文中设置了两组实验场景。

五、场景一:抵近绕飞——此一役,先抵近,后绕飞

论文第一个仿真场景是抵近绕飞,一共 20 个时间步。

它的大致过程是:

第 0~1 步:轨道保持

第 2~8 步:抵近

第 9~16 步:绕飞

第 17~19 步:飞离

此外,论文还设置了两个关键条件:

第 10~15 步:出现形态异常

第 12~15 步:光照条件变差

目标类型设为军用卫星,载荷工作状态保持良好。

这一段很像一场分阶段推进的战局。

前两步还算平静。

第 2 步开始,轨道阶段一变,局势马上不同。

5.1 第 2 步:轨道阶段一变,动态威胁立刻抬头

论文结果显示,第 2 步时,由于轨道特征发生转变、相对距离缩短,动态威胁高从约 0.3 上升到约 0.7496。

这一下非常明显。

就像帐中斥候来报:

敌军不再原地驻扎,已转为抵近。
此时即便距离还没到最近,轨道阶段的变化已经足够让模型提高警惕。
在这里插入图片描述

5.2 第 9 步:进入绕飞,威胁并非一路无脑上升
到了第 9 步,目标进入绕飞阶段。

这里很有意思。

综合威胁没有一路无脑上升,而是出现短暂调整。

我的理解是:

绕飞仍然敏感,但它和“直接抵近碰撞”的风险表达不完全一样。

这时相对距离、相对速度、轨道阶段共同作用,曲线会出现阶段性变化。

这也说明模型不是单纯看距离。

如果只看距离,这一段很容易解释得很粗糙。

5.3 第 10~15 步:真正的“伏兵”出现了

在这里插入图片描述

第 10 步之后,形态异常出现。

告警信息升高。

第 12~15 步,光照条件变差。

探测条件受影响,静态威胁也被抬高。

这一段像什么?

像前线已经接近,中军又收到两封急报:

一是目标出现异常动作。

二是观测条件变差,看不清了。

这两个因素叠加后,综合威胁高在这一段达到高位。

论文中图 10 显示,轨道保持转为抵近时,威胁度高从约 0.3941 升至约 0.6225;第 10 步形态异常后,威胁度高又从约 0.6438 提升到约 0.7821;随后在光照恶化影响下进一步升高,最高约 0.7956。
在这里插入图片描述
说明了,威胁升高不只是因为“近了”,还因为“动作变了、观测难了、告警来了”。

5.4 第 17 步以后:飞离,威胁下降
第 17 步以后,目标进入飞离阶段。

相对距离和速度状态都发生变化。

动态威胁和综合威胁随之下降。

这也符合直觉。

所谓“军情有变”,不只是变坏,也可能变好。

目标飞离,威胁自然要降下来。

六、场景二:碰撞——这一战更直接

第二个场景是碰撞,一共 24 个时间步。

设定更直接:

第 0~2 步:轨道保持

第 3~23 步:抵近

相对距离逐渐缩短,最后进入碰撞邻域

光照条件全程良好

载荷工作状态全程良好

目标类型为军用卫星

这次没有那么多绕飞、阴影、异常形态的变化。

它更像一条线:

距离不断缩短,威胁逐渐升高。

但这里仍然有一个关键点:

第 3 步,轨道阶段从保持变成抵近。

这一变,模型立刻响应。

6.1 第 3 步:动态威胁直接跃升
论文图 13 显示,轨道保持阶段,动态威胁高大约是 0.3。

第 3 步轨道阶段变为抵近后,动态威胁高跃升到约 0.7516。

随后相对速度保持“中”,轨道阶段保持“抵近”,动态威胁主要由相对距离推动。

随着距离继续缩短,动态威胁高继续上升,并在相撞前达到约 0.88。
在这里插入图片描述
这一段可以总结成一句话:

轨道阶段负责“突然抬头”,相对距离负责“继续加压”。

这就是场景二的曲线逻辑。

6.2 综合威胁:不是最后一刻才报警
场景二图 14 更直观。

第 0 步时,威胁程度的模糊表达约为:

[0.3120,0.1898,0.4982]

这里三个数分别对应:威胁高、威胁中、威胁低。

第 3 步,轨道阶段由保持变为抵近,威胁程度变为:

[0.5523,0.1838,0.2639]

也就是说,威胁高从约 0.31 升到约 0.55。

到第 23 步,随着相对距离进一步缩短,威胁程度约为:

[0.6192,0.1823,0.1985]
在这里插入图片描述
这说明模型不是等到最后一刻才反应。

当轨道阶段切换为抵近时,它已经明显提高了威胁判断。

七、复现时我踩到的坑:复现不能太“听话”

诸公,论文复现这件事,最怕什么?

不是报错。

报错至少摆在明处。

最怕的是:

图看起来像,逻辑却没对上。

这次复现里,我最明显的感受是:不能只盯一张图,也不能只盯一个数。

7.1 坑一:场景二初始速度状态
场景二里,论文图 13 的初始动态威胁高大约是 0.3。

但如果代码里把第 0~2 步的相对速度设得过小,它就会落到“相对速度慢”的状态。

这样动态威胁高会偏低,可能只有约 0.15 左右,就和论文趋势对不上。

后来我按论文场景描述,把场景二相对速度处理为“中”,这样第 0~2 步的动态威胁才回到 0.3 附近。

这不是简单调参。这是在检查输入初值是否真的符合论文描述。

7.2 坑二:图 13、图 14 和表 9 不是随便能同时满足
另一个更微妙的问题是:

图 13、图 14 和表 9 之间,存在轻微不可完全同时满足的地方。

如果严格按照图 13 的动态威胁,再直接套表 8、表 9,有时图 14 的初始综合威胁会偏高。

这里就不能硬说“完全一致”。而是在论文没有公开完整原始仿真输入时,只能在公开表格、正文数值和曲线形态之间做最合理的反向约束。

这不是造数据。这是复现必须交代清楚的地方。

复现论文,贵在如实;不因一图合而掩其疑,不因一点差而弃全局。

7.3 坑三:不要为了一个点,毁掉一条曲线
场景一复现时,我一开始也想过把某些点强行拉到论文文字里的数值。

但很快发现:一个点看起来对了,整条曲线反而不自然。

后来我优先保证整体趋势、关键转折和模型逻辑,而不是为某个单点硬拟合。

这点很重要。论文复现不是照着结果画一遍曲线,而是要问:

输入是否合理?
条件概率表是否用对?
图像趋势和文字描述是否互相支撑?
代码实现有没有隐藏问题?

这些问题问清楚,复现才有价值。

八、这次代码复现做了什么?

这次复现主要有两套代码。

一套是C 语言工程,它可以直接运行,也可以输出 CSV 数据。
另一套是MATLAB脚本。它可以生成中英文图表、CSV 数据和论文关键数值对照表。

本篇分享不是读完摘要就结束。而是把公式变成代码,把代码跑成图,再拿图反过来质疑公式和输入。

九、我从这篇论文里学到了什么?

这篇论文最值得学习的,不是某一个威胁数值。

而是一套可解释的建模流程。

我总结成三句话。

9.1 第一,连续变量不要急着硬切
距离、速度都是连续变化的。

直接硬切阈值,容易造成边界跳变。

模糊隶属度的价值就在于:

让状态变化有过渡。

9.2 第二,威胁评估不能只看一个指标
只看距离不够。

还要看速度、轨道阶段、形态异常、历史行为、目标类型、探测条件、光照条件、载荷状态。

这就像帐中议事。

一人之言,只能作参考。

多路军情合议,才可能接近真实判断。

9.3 第三,可解释模型也有代价
贝叶斯网络的好处是清楚。

节点关系清楚,条件概率清楚,推理链条也清楚。

但代价是:

条件概率表依赖专家知识,不同场景可能要重新校准。

所以我不会把它说成万能系统。

更准确的说法是:

它是一套适合学习和复现的可解释概率融合框架。

纸上得来终觉浅,代码跑过方知难。 诸公若有高见,欢迎留言交流。 愿与诸公共读、共学、共思、共进。 今日跑通一图,明日再破一关。

参考论文

曲宗华,魏春岭。

《一种空间目标异动威胁评估的贝叶斯网络模型》。

《航天控制》,2023 年第 41 卷第 4 期。

说明

本文基于公开论文内容和本人复现过程整理,仅用于学习交流。

文中讨论范围限于论文给出的合成仿真场景、贝叶斯网络模型、模糊隶属度方法和代码复现过程。

本文不涉及真实在轨目标识别、实时轨道数据、规避策略或任何操作性对抗方案。

部分代码:

function results = Bayes_model_reproduction(scene, makePlots)
%两个空间目标威胁评估场景。

% scene=0 表示一次运行两个场景;makePlots=false 时只生成数据和对照表。
if nargin < 1 || isempty(scene)
    scene = 0;
end
if nargin < 2 || isempty(makePlots)
    makePlots = true;
end

if scene == 0
    results.scene1 = runScenario(1);
    results.scene2 = runScenario(2);
    writeScenario(results.scene1, 'bayes_scene1_results.csv');
    writeScenario(results.scene2, 'bayes_scene2_results.csv');
    writeAlignmentReport(results);
    if makePlots
        plotPaperFigures(results.scene1, results.scene2);
    end
elseif scene == 1 || scene == 2
    results = runScenario(scene);
    writeScenario(results, sprintf('bayes_scene%d_results.csv', scene));
    writeAlignmentReportForOne(results);
    if makePlots
        plotPaperFiguresForOne(results);
        plotPaperFiguresChineseForOne(results);
    end
else
    error('scene must be 0, 1, or 2.');
end
end

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值