Scipy.optimize.newton:RunTimeError

时间:2016-02-04 10:09:25

标签: python optimization scipy

我有一个奇怪的问题,我不知道如何处理它。我有一个函数我想用牛顿方法优化。但它总是给我一个运行时错误:

def zmax_bound_dry(x):
    return 23.56 * (1/0.09) + 30.91*math.log1p(1+(x/30.91))

scipy.optimize.newton(zmax_bound_dry, x0=80)

如果我用我的初始猜测80调用该函数它可以工作,但牛顿优化不会收敛,因为它给出了一个ValueError。我认为这是由于日志但是初始猜测的手动调用有效,所以算法应该至少返回初始猜测,不应该吗?

1 个答案:

答案 0 :(得分:1)

对这些事情进行故障排除的一种简单方法是修补函数以在每次迭代时打印参数的值:

In [9]: def zmax_bound_dry(x):
          print(x)
          return 23.56 * (1/0.09) + 30.91*math.log1p(1+(x/30.91))
   ...: 

In [10]: newton(zmax_bound_dry, 80)
80
80.0081
-1337.1783578

现在它清楚发生了什么:日志的论点变为否定。

为什么这样做是另外一回事。 BTW,optimize.newton试图找到一个根,而不是一个extemum(所以当你说'#34;优化",确保你的意思是指你做什么);使用log1p(1 + x)有点奇怪,因为log1p已经是log(1+x)