Python:循环未给出预期结果
Python: Loop not giving desired result
所以我正在尝试编写一个代码来模拟捕食者和猎物的情况,它从少量的捕食者和大量的猎物开始。随着时间的推移,捕食者数量增加,而猎物数量减少,直到猎物数量太少而无法维持捕食者数量。捕食者种群死亡,然后猎物种群能够重新繁殖。只要两个种群之一达到 0,模拟就应该停止,在这种情况下,捕食者种群将随着模拟的时间绘制两个种群,直到它停止。到目前为止,这是我的代码:
import matplotlib.pyplot as plt
def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate):
preyCounts = []
predatorCounts = []
predatorI = initialPred
preyI = initialPrey
predator = predatorI
prey = preyI
while predator > 0 and prey > 0:
predator = predatorI * (1 - predShrink + predFedBirthRate * preyI)
prey = preyI * (1 + preyGrowth - predationRate * predatorI)
predatorCounts.append(predator)
preyCounts.append(prey)
predatorI = predator
preyI = prey
plt.plot(predatorCounts, 'r', preyCounts, 'b')
plt.show()
return preyCounts, predatorCounts
simulate(50,1000,0.25,0.01,0.05,0.00002)
它的输出是这样的
:
但它应该是这样出来的:
有人可以帮我吗?
*除此之外,每当我将我的绘图代码放在函数之外的函数行之后,其中的值如下所示:
simulate(50,1000,0.25,0.01,0.05,0.00002)
plt.plot(predatorCounts, 'r', preyCounts, 'b')
plt.show()
它没有绘制函数的值,并表示 predatorCounts
和 preyCounts
未定义。
所以您查看了您的 process/calcs,它似乎是正确的,但您查看了您的结果,它很有趣。打印计数时您会注意到一件事...
print predatorI, preyI
是有一部分捕食者和猎物在现实世界中是没有意义的。您正在尝试模拟现实世界。您所有的 rate 参数可能都基于整体,而不是小数部分。所以你决定在你的模拟中不能有任何小数生物,你只在人口增长计算后处理整个生物(整数)......
您的函数 return 是计数向量。如果您想将绘图语句移到函数之外,您需要将函数的 return 值分配给一个名称,然后将它们用于绘图。
prey, predator, = simulate(50,1000,0.25,0.01,0.05,0.00002)
plt.plot(predator, 'r', prey, 'b')
plt.show()
以下是有关名称、范围、命名空间的文档中的一些内容
https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects
https://docs.python.org/3/reference/executionmodel.html#naming-and-binding
随着语言的使用增多,您可能需要定期阅读它们。
如果我用起始种群 和 对种群使用 int()
截断来初始化你的绘图数据,我得到你说你应该看到的情节:
import matplotlib.pyplot as plt
def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate):
preyCounts = [initialPrey]
predatorCounts = [initialPred]
predator = initialPred
prey = initialPrey
while predator > 0 and prey > 0:
predatorScaleFactor = 1.0 - predShrink + predFedBirthRate * prey
preyScaleFactor = 1.0 + preyGrowth - predationRate * predator
predator = int(predator * predatorScaleFactor)
prey = int(prey * preyScaleFactor)
predatorCounts.append(predator)
preyCounts.append(prey)
plt.plot(predatorCounts, 'r', preyCounts, 'b')
plt.show()
return preyCounts, predatorCounts
simulate(50, 1000, 0.25, 0.01, 0.05, 0.00002)
所以我正在尝试编写一个代码来模拟捕食者和猎物的情况,它从少量的捕食者和大量的猎物开始。随着时间的推移,捕食者数量增加,而猎物数量减少,直到猎物数量太少而无法维持捕食者数量。捕食者种群死亡,然后猎物种群能够重新繁殖。只要两个种群之一达到 0,模拟就应该停止,在这种情况下,捕食者种群将随着模拟的时间绘制两个种群,直到它停止。到目前为止,这是我的代码:
import matplotlib.pyplot as plt
def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate):
preyCounts = []
predatorCounts = []
predatorI = initialPred
preyI = initialPrey
predator = predatorI
prey = preyI
while predator > 0 and prey > 0:
predator = predatorI * (1 - predShrink + predFedBirthRate * preyI)
prey = preyI * (1 + preyGrowth - predationRate * predatorI)
predatorCounts.append(predator)
preyCounts.append(prey)
predatorI = predator
preyI = prey
plt.plot(predatorCounts, 'r', preyCounts, 'b')
plt.show()
return preyCounts, predatorCounts
simulate(50,1000,0.25,0.01,0.05,0.00002)
它的输出是这样的
:
但它应该是这样出来的:
有人可以帮我吗?
*除此之外,每当我将我的绘图代码放在函数之外的函数行之后,其中的值如下所示:
simulate(50,1000,0.25,0.01,0.05,0.00002)
plt.plot(predatorCounts, 'r', preyCounts, 'b')
plt.show()
它没有绘制函数的值,并表示 predatorCounts
和 preyCounts
未定义。
所以您查看了您的 process/calcs,它似乎是正确的,但您查看了您的结果,它很有趣。打印计数时您会注意到一件事...
print predatorI, preyI
是有一部分捕食者和猎物在现实世界中是没有意义的。您正在尝试模拟现实世界。您所有的 rate 参数可能都基于整体,而不是小数部分。所以你决定在你的模拟中不能有任何小数生物,你只在人口增长计算后处理整个生物(整数)......
您的函数 return 是计数向量。如果您想将绘图语句移到函数之外,您需要将函数的 return 值分配给一个名称,然后将它们用于绘图。
prey, predator, = simulate(50,1000,0.25,0.01,0.05,0.00002)
plt.plot(predator, 'r', prey, 'b')
plt.show()
以下是有关名称、范围、命名空间的文档中的一些内容 https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects https://docs.python.org/3/reference/executionmodel.html#naming-and-binding
随着语言的使用增多,您可能需要定期阅读它们。
如果我用起始种群 和 对种群使用 int()
截断来初始化你的绘图数据,我得到你说你应该看到的情节:
import matplotlib.pyplot as plt
def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate):
preyCounts = [initialPrey]
predatorCounts = [initialPred]
predator = initialPred
prey = initialPrey
while predator > 0 and prey > 0:
predatorScaleFactor = 1.0 - predShrink + predFedBirthRate * prey
preyScaleFactor = 1.0 + preyGrowth - predationRate * predator
predator = int(predator * predatorScaleFactor)
prey = int(prey * preyScaleFactor)
predatorCounts.append(predator)
preyCounts.append(prey)
plt.plot(predatorCounts, 'r', preyCounts, 'b')
plt.show()
return preyCounts, predatorCounts
simulate(50, 1000, 0.25, 0.01, 0.05, 0.00002)