NetLogo中基于magnitudes权重的directions加权均值计算咨询
数学逻辑说明
- 你的推测完全正确,带权重的方向合成本质就是向量叠加,和加权圆形均值的计算逻辑完全一致,不存在适配问题。普通无权重圆形均值只是所有向量幅值为1的特殊场景。
- 具体计算逻辑:
- 把每个方向、幅值对应的作用力向量,分解为x轴和y轴分量:
x分量 = 幅值 * cos(方向),y分量 = 幅值 * sin(方向) - 所有x分量求和得到总x分量
sum-x,所有y分量求和得到总y分量sum-y - 合成后的模长
my-magnitude = sqrt(sum-x² + sum-y²) - 合成后的方向
my-direction = atan(sum-y, sum-x)(NetLogo的atan参数顺序为y在前x在后,直接返回0-360范围的标准朝向)
注:NetLogo内置三角函数默认使用角度而非弧度,不需要手动做单位转换,直接使用列表中存储的heading值即可
- 把每个方向、幅值对应的作用力向量,分解为x轴和y轴分量:
NetLogo实现代码
你只需要在现有代码基础上新增向量合成过程,在populate-lists执行完成后调用即可:
to calculate-patch-vectors ask target-patches [ let sum-x 0 let sum-y 0 ; 成对遍历方向和幅值列表 (foreach directions-list magnitudes-list [ [dir mag] -> set sum-x sum-x + mag * cos dir set sum-y sum-y + mag * sin dir ]) ; 计算合成模长 set my-magnitude sqrt (sum-x ^ 2 + sum-y ^ 2) ; 处理无有效向量的边界情况 ifelse my-magnitude > 0 [ set my-direction atan sum-y sum-x ] [ ; 无外力时的默认方向,可按需调整 set my-direction 0 ] ] end
随后修改setup过程的末尾,调用新增的计算过程即可:
to setup ; ... 原有代码不变 ... populate-lists calculate-patch-vectors ; 新增这一行 end
验证建议
你可以添加简单的可视化逻辑快速验证结果是否符合预期,比如让target-patches的plabel显示my-magnitude数值,朝向my-direction,或者用draw命令画出合成向量。
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

