我从20世纪70年代充满流程图和微积分示例的weird, old book中得到了这个例子。它编写得不是很好,但我很乐意将流程图写入Python并试图找出这些方程实际上是什么以及它们是如何工作的。
这个特殊的例子声称代表了Malthus和Verhulst人口增长模型的线性近似。 (警告说:我在本书中的方程与所谓的 Verhulst方程或逻辑函数之间找不到任何关系。)
import math
def malthus_verhulst():
a = int(input("please enter a value for a\n:%"))
b = int(input("please enter a value for b\n:%"))
c = int(input("please enter a value for c\n:%"))
p = []
v = []
p1 = float(input("please enter a value for p1\n:%"))
v1 = float(input("please enter a value for v1\n:%"))
p.append(p1)
v.append(v1)
for k in range(50):
p.append((1+c)*p[k])
v.append(v[k]+(a*v[k] - math.pow(b*v[k],2)))
print(p,v)
有没有办法将其重写为适用于a,b,c,p1和v1的各种值的位置?
$ python -i scratchpad.py
>>> malthus_verhulst()
please enter a value for a
:%2
please enter a value for b
:%2
please enter a value for c
:%2
please enter a value for p1
:%2
please enter a value for v1
:%2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "scratchpad.py", line 92, in malthus_verhulst
v.append(v[k]+(a*v[k] - math.pow(b*v[k],2)))
OverflowError: math range error
>>>
答案 0 :(得分:0)
如果在异常处理程序中打印v
的值,您将看到它快速超出范围,最后一个值为-3.1331863238009388e + 206。由于数字的平方值使指数加倍,而float
的最大指数约为308,因此算法会爆炸。确保您的输入值在算法的域内。