数学建模与模拟人口问题作业

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()

列表记录

表格节选

作出图像

image

最后修改:2024 年 12 月 13 日
如果觉得我的文章对你有用,请随意赞赏