离散时间模型构建与代码排错:党派支持率动态模拟
支持率动力学模型:报错修复、实现与分析
1. 代码报错根源与修复
你的代码存在5个核心错误,逐一修正如下:
- 覆盖内置函数:第一行
max=()将内置的max()函数覆盖为元组,导致调用max()时报错tuple object is not callable,直接删除该行。 - 初始值不合法:初始化时
pr=1.、pd=1.、pi=1.总和为3,违反支持率总和为1的约束,需改为符合pr+pd+pi=1的初始值(如pr=0.4, pd=0.3, pi=0.3)。 - 未定义变量:
update()函数中nextpi未定义,需根据支持率定义nextpi = 1 - nextpr - nextpd补充计算。 - 变量名不匹配:绘图时使用
rresult、dresult、iresult,但实际存储结果的变量是prresult、pdresult、piresult,需统一变量名。 - 动力学方程错误:原方程未正确实现“从X转向Y的比例与(pY-pX)成正比”的规则,需重新推导转换逻辑。
2. 离散时间动力学模型推导
根据规则,定义比例系数k(控制转换速率,设为0.1),每类转换的计算逻辑如下:
若
pY > pX,则X中转向Y的比例为k*(pY-pX);否则无转换。
基于此,推导三个群体的支持率更新公式:
- 共和党支持率更新:
nextpr = pr - pr * k * max(pd - pr, 0) # 共和党转民主党(民主党支持率更高时) - pr * k * max(pi - pr, 0) # 共和党转无党派(无党派支持率更高时) + pd * k * max(pr - pd, 0) # 民主党转共和党(共和党支持率更高时) + pi * k * max(pr - pi, 0) # 无党派转共和党(共和党支持率更高时) - 民主党支持率更新:
nextpd = pd - pd * k * max(pr - pd, 0) # 民主党转共和党(共和党支持率更高时) - pd * k * max(pi - pd, 0) # 民主党转无党派(无党派支持率更高时) + pr * k * max(pd - pr, 0) # 共和党转民主党(民主党支持率更高时) + pi * k * max(pd - pi, 0) # 无党派转民主党(民主党支持率更高时) - 无党派支持率更新:
直接由总和约束推导:nextpi = 1 - nextpr - nextpd
3. 修正后的完整仿真代码
from pylab import * # 转换速率系数,控制立场转换的快慢 k = 0.1 def initialize(): global pr, pd, pi, prresult, pdresult, piresult # 初始化支持率,满足pr+pd+pi=1 pr = 0.4 pd = 0.3 pi = 0.3 prresult = [pr] pdresult = [pd] piresult = [pi] def observe(): global pr, pd, pi, prresult, pdresult, piresult prresult.append(pr) pdresult.append(pd) piresult.append(pi) def update(): global pr, pd, pi # 计算下一轮支持率 nextpr = pr - pr * k * max(pd - pr, 0) - pr * k * max(pi - pr, 0) + pd * k * max(pr - pd, 0) + pi * k * max(pr - pi, 0) nextpd = pd - pd * k * max(pr - pd, 0) - pd * k * max(pi - pd, 0) + pr * k * max(pd - pr, 0) + pi * k * max(pd - pi, 0) nextpi = 1 - nextpr - nextpd # 更新当前支持率 pr, pd, pi = nextpr, nextpd, nextpi # 初始化并运行仿真 initialize() for t in range(100): update() observe() # 绘制结果 plot(prresult, 'm-', label='Republican') plot(pdresult, 'g--', label='Democrat') plot(piresult, 'y-.', label='Independent') legend() xlabel('Time Step') ylabel('Support Rate') show()
4. 稳态结果分析
由于共和党与民主党吸引力无差异,长期稳态会呈现以下特征:
- 两党支持率相等:
pr = pd = 0.5,此时两党之间无立场转换(pY-pX=0)。 - 无党派支持率归零:当
pr=pd=0.5时,无党派支持率pi始终小于0.5,因此无党派人群会持续向两党转换,最终pi=0。 - 收敛速度:由系数
k决定,k越大,收敛到稳态的速度越快。
内容的提问来源于stack exchange,提问作者Jeffery Benson
相关产品推荐
相关产品推荐

