Python:Loop没有给出想要的结果
所以我试图编写一个代码来模拟捕食者和猎物数量很少的捕食者和猎物情况。随着时间的推移,捕食者的数量会不断增加,而猎物的数量会减少,直到猎物数量太少而无法维持捕食者的数量。捕食者人口消失,然后猎物种群能够重新繁殖。当两个种群中的一个达到0时,仿真应该停止,在这种情况下,捕食者群体将随着仿真时间划分两个群体,直到它停止。这是到目前为止我的代码:Python:Loop没有给出想要的结果
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
未定义。
如果我与起始群体和使用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)
所以你看着你的过程/计算,它看起来是正确的,但你看看你的结果,这很有趣。当您打印计数您注意的一件事......
print predatorI, preyI
是有捕食者和猎物其中,在现实世界中,没有意义的分数。你试图模拟现实世界。您所有的费率参数可能基于整体事物,而不是分数事物。所以你决定,有不能在你的模拟小数众生,你只应对人口增长的计算后,整个人类(整数)...
你的函数返回的计数向量。如果要将绘图语句移到该函数之外,则需要将该函数的返回值分配给一个名称,然后将其用于绘图。
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
您可能需要为您使用的语言更定期阅读。
我没有看到在while循环中更新'prey'的代码?这是所需的行为? PS:我对“matplotlib”一无所知 –
你可以在while循环的顶部放一个print语句来看看'''predatorI'''和'''preyI'''发生了什么 - 这可能会给你一个线索。 – wwii
一个问题是,你的条件不起作用。有时候你的条件对待0.4只猎物是有效的,但我想象一只兔子的十分之四已经死了。 – wwii