数学建模与模拟人口问题作业
2023211742 人工智能学院 任浩天
问题
研究差分方程 $x_{k+1}=bx_{k}(1-x_{k})$ 的的收敛、分岔及混沌现象。
要求:
1.程序源代码
2.列表记录对应 b 的不同取值的收敛点。
3.作出收敛点关于 b 的取值图。
解答
1.程序源码
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 设置matplotlib中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def converge_point(x0, b, n=1000, m=100):
'''计算迭代
参数:
x0: 初值x0
b: 参数b
n: 迭代次数
m: 舍去前m个迭代值
'''
x = x0
res = []
for i in range(n):
x = b * x * (1 - x) #迭代公式
if i >= m:
res.append(x)
return res
# 主程序
if __name__ == '__main__':
# 参数设置
x0 = 0.5
b_min, b_max = 2.5, 3.5
delta_b = 0.01
b_list = np.arange(b_min, b_max + delta_b, delta_b)
# 存储数据
b_plot = [] # 绘图用b值
x_plot = [] # 绘图用x值
all_data = [] # 存储所有数据
max_len = 0 # 最大收敛点个数
# 计算每个b值对应的收敛点
for b in b_list:
x_values = converge_point(x0, b)
conv_points = sorted(set(x_values))
# 存储绘图数据
for x in conv_points:
b_plot.append(b)
x_plot.append(x)
# 存储表格数据
all_data.append({
'b': f'{b:.2f}',
'points': conv_points
})
max_len = max(max_len, len(conv_points))
# 绘制分岔图
plt.figure(figsize=(10, 6))
plt.scatter(b_plot, x_plot, s=0.5, c='black')
plt.xlabel('参数 b')
plt.ylabel('收敛值 x')
plt.title('收敛点关于b的取值图')
plt.grid(True)
plt.savefig('img1.png', dpi=300, bbox_inches='tight')
plt.close()
# 生成完整数据表格
b_cols = [f'{b:.2f}' for b in b_list]
data_rows = [['k'] + b_cols] # 表头
for k in range(max_len):
row = [k]
for i, b in enumerate(b_list):
points = all_data[i]['points']
val = points[k] if k < len(points) else ''
row.append(f'{val:.2f}' if val != '' else '')
data_rows.append(row)
pd.DataFrame(data_rows).to_csv('converge_points.csv',
index=False,
header=False,
encoding='utf-8-sig')
# 生成示例数据表格
test_b = [2.5, 2.7, 2.9, 3.1, 3.3, 3.5] # 选择6个b,不然太多了
test_data = []
# 计算示例数据
for b in test_b:
points = sorted(set(converge_point(x0, b)))[:10] # 取前10个收敛点
test_data.append({
'b': f'{b:.1f}',
'points': points
})
# 生成示例表格
test_rows = []
test_rows.append(['k'] + [f'b={b:.1f}' for b in test_b])
for k in range(10): # 只取前10行
row = [k]
for i, b in enumerate(test_b):
points = test_data[i]['points']
val = points[k] if k < len(points) else ''
row.append(f'{val:.4f}' if val != '' else '')
test_rows.append(row)
# 绘制示例表格
plt.figure(figsize=(12, 6))
plt.axis('off')
tab = plt.table(cellText=test_rows,
cellLoc='center',
loc='center',
colWidths=[0.1] + [0.15]*len(test_b))
tab.auto_set_font_size(False)
tab.set_fontsize(10)
tab.scale(1.2, 1.5)
plt.savefig('img2.png', dpi=300, bbox_inches='tight')
plt.close()
列表记录
作出图像