鱼C论坛

 找回密码
 立即注册
查看: 1992|回复: 8

[已解决]传入多个值报错

[复制链接]
发表于 2023-5-14 16:41:52 | 显示全部楼层 |阅读模式
25鱼币
  1. #导入模块
  2. import numpy as np
  3. import random
  4. import math
  5. import matplotlib.pyplot as plt

  6. #使用蒙特卡洛方法模拟传染
  7. def transmission(p):
  8.     '''p: float, 传染率
  9.        如果生成的随机数比p小,则被感染
  10.        反之则不被感染'''
  11.     if random.random() < p:
  12.         return True
  13.     else:
  14.         return False


  15. def SIS(N, infecteds, alpha_number, beta, gamma, tmin=0, tmax=100):
  16.     '''
  17.     N: 总人口数, int
  18.     infetceds: 初始感染人数, int
  19.     alpha_number: 传染人数,int, 每个人能接触到的人数
  20.     beta: 感染率, float
  21.     gamma: 恢复率, float
  22.     tmin: 初始时间, int
  23.     tmax: 最大时间步长, int
  24.     '''
  25.     # 初始状态所有人均为感染,用数组表示,为全零数组
  26.     state = [0] * N  # 创建一个长度为N的全零数组

  27.     # 随机从数组选infected个人,将他们的状态改为1
  28.     for i in range(infecteds):  # 循环infecteds次
  29.         index = random.randint(0, N - 1)  # 随机选择一个数组下标
  30.         state[index] = 1  # 将该下标对应的元素设为1

  31.     # 创建两个空列表,分别统计当前0和1的人数
  32.     S_list = []  # 创建一个空列表,用于存储易感者的人数
  33.     I_list = []  # 创建一个空列表,用于存储感染者的人数

  34.     # 循环从tmin到tmax,每次增加1
  35.     for t in range(tmin, tmax + 1):
  36.         # 统计当前0和1的人数,并添加到对应的列表中
  37.         S = state.count(0)  # 计算数组中0的个数,即易感者的人数
  38.         I = state.count(1)  # 计算数组中1的个数,即感染者的人数
  39.         S_list.append(S)  # 将S添加到S_list中
  40.         I_list.append(I)  # 将I添加到I_list中

  41.         # 对每个感染者进行操作
  42.         for i in range(N):  # 循环遍历数组
  43.             if state[i] == 1:  # 如果当前元素为1,即当前人为感染者
  44.                 # 随机选择alpha_number个人接触,并判断是否传染或恢复
  45.                 for j in range(alpha_number):  # 循环alpha_number次
  46.                     k = random.randint(0, N - 1)  # 随机选择一个数组下标
  47.                     if state[k] == 0 and transmission(beta):  # 如果该下标对应的元素为0,即易感者,并且以beta的概率返回True
  48.                         state[k] = 1  # 将该元素设为1,即感染
  49.                 if transmission(gamma):  # 如果以gamma的概率返回True
  50.                     state[i] = 0  # 将当前元素设为0,即恢复

  51.     return S_list, I_list  # 返回两个列表


  52. def PlotAxes(ax, xlabel, ylabel, title, mode=False):
  53.     '''
  54.     Decorate the axes

  55.     Parameters
  56.     ----------
  57.     ax : axes
  58.         axes.
  59.     xlabel : str
  60.         set the xlabel.
  61.     ylabel : str
  62.         set the ylabel.
  63.     title : str
  64.         set the title.
  65.     mode : bool, optional
  66.         whether to show the legend. The default is False.

  67.     Returns
  68.     -------
  69.     None.

  70.     '''
  71.     fontsize = 16
  72.     font_label = {'family': "Arial", 'size': fontsize}

  73.     n_legend = 12
  74.     ax.set_xlabel(xlabel, fontdict=font_label)
  75.     ax.set_ylabel(ylabel, fontdict=font_label)
  76.     ax.set_title(title, loc='left', fontdict={'family': "Arial", 'size': fontsize})
  77.     ax.tick_params(direction='out', which='both', length=4, width=1, pad=1, labelsize=n_legend)

  78.     # ax.minorticks_on()
  79.     if mode == True:
  80.         ax.legend(loc='best', framealpha=0, fontsize=n_legend)

  81. # 调用SIS函数,传入参数,得到两个列表
  82. N = 1000 # 总人口数
  83. beta = 0.3 # 感染率
  84. gamma = 0.1 # 恢复率
  85. tmin = 0 # 初始时间
  86. tmax = 100 # 最大时间步长
  87. S_list, I_list = SIS(N, beta, gamma, tmin, tmax, infecteds=10, alpha_number=5)

  88. # 创建一个图形对象
  89. fig = plt.figure()
  90. # 添加一个子图,设置为3D模式
  91. ax = fig.add_subplot(111)
  92. # 调用PlotAxes函数,为子图添加标签、标题和图例
  93. PlotAxes(ax, 'Time', 'Population', 'SIS model', mode=True)
  94. # 生成一个时间序列,与两个列表对应
  95. t = np.arange(tmin, tmax + 1)
  96. # 在子图上绘制两条曲线,分别表示易感者和感染者的人数随时间的变化
  97. ax.plot(t, S_list, label='Susceptible')
  98. ax.plot(t, I_list, label='Infected')
  99. # 显示图形
  100. plt.show()
复制代码
最佳答案
2023-5-14 16:41:53
在调用SIS函数时,传入的参数顺序有误。应该按照函数定义的顺序传入参数。正确的调用方式如下:

S_list, I_list = SIS(N, infecteds=10, alpha_number=5, beta=0.3, gamma=0.1, tmin=0, tmax=100)

这样就可以避免传入多个值报错的问题了。

最佳答案

查看完整内容

在调用SIS函数时,传入的参数顺序有误。应该按照函数定义的顺序传入参数。正确的调用方式如下: S_list, I_list = SIS(N, infecteds=10, alpha_number=5, beta=0.3, gamma=0.1, tmin=0, tmax=100) 这样就可以避免传入多个值报错的问题了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 16:41:53 | 显示全部楼层    本楼为最佳答案   
在调用SIS函数时,传入的参数顺序有误。应该按照函数定义的顺序传入参数。正确的调用方式如下:

S_list, I_list = SIS(N, infecteds=10, alpha_number=5, beta=0.3, gamma=0.1, tmin=0, tmax=100)

这样就可以避免传入多个值报错的问题了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-14 16:42:21 | 显示全部楼层
Traceback (most recent call last):
  File "C:\Users\何嘉凯\Desktop\python\数据分析\基于个体的SIS建模.py", line 103, in <module>
    S_list, I_list = SIS(N, beta, gamma, tmin, tmax, infecteds=10, alpha_number=5)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: SIS() got multiple values for argument 'infecteds'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 16:43:46 | 显示全部楼层
陈落轩 发表于 2023-5-14 16:42
Traceback (most recent call last):
  File "C:%users\何嘉凯\Desktop\python\数据分析\基于个体的SIS建 ...

这个错误提示表明 SIS() 函数接收到了多个相同的参数 "infecteds" 值。

为了修复这个错误,请确保:

在调用函数时删除额外的参数。
定义新的一组参数并在调用函数时使用。
在您的情况下,需要从 SIS() 函数调用中删除一个名为 "infecteds" 的参数。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 16:45:33 | 显示全部楼层
请在调用SIS函数时按照函数定义的参数顺序传入所有必需的参数,并保持参数名称与定义时一致。例如:


  1. S_list, I_list = SIS(N=1000, infecteds=10, alpha_number=5, beta=0.3, gamma=0.1, tmin=0, tmax=100)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 16:46:21 | 显示全部楼层
这是一个基于 SIS(易感-感染-易感)模型的疾病传播模拟程序。其中,通过蒙特卡洛方法模拟传染,使用 SIS 函数可以得到在一定时间内易感者和感染者的数量列表,其余参数包括总人口数、传染率、恢复率、初始时间、最大时间步长、初始感染人数和每个人接触到的人数。程序还提供了 PlotAxes 函数,用于添加子图标签、标题和图例,并绘制易感者和感染者随时间的变化曲线。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-14 16:49:38 | 显示全部楼层
谢谢各位大佬!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 16:50:29 | 显示全部楼层

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 17:51:53 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 20:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表