【问题标题】:I have two errors: 'RuntimeWarning: divide by zero encountered in double_scalars' ; 'RuntimeWarning: invalid value encountered in subtract'我有两个错误:'RuntimeWarning:在 double_scalars 中遇到除以零'; 'RuntimeWarning:减法中遇到无效值'
【发布时间】:2020-04-28 18:26:18
【问题描述】:

我不明白 python 是如何除以零的。这是我的全部代码:

from scipy import optimize
import numpy as np
from sympy import *

from tkinter import *
#import ipdb;ipdb.set_trace()
y=[100,200]
alp=[0.5,0.5]
end=[1,2]
e, t, a, w = symbols('e t a w')
u= ((a ** a) * (24 * (1 - t) * w + e) * ((1 - a) ** (1 - a))) * (((1 - t) * w) ** (a-1))

print(latex(u))
def main(x, n):

    r = 0
    p = 0
    #j=-1 * ((alp[i] ** alp[i]) * (24 * (1 - x[i]) * y[i] + end[i]) * ((1 - alp[i]) ** (1 - alp[i]))) / ((1 - x[1] * y[i]) ** (1 - alp[i]))
    for i in range(len(y)):
        if i >= n:

            r += -1 * ((alp[i] ** alp[i]) * (24 * (1 - x[1]) * y[i] + end[i]) * ((1 - alp[i]) ** (1 - alp[i]))) * (((1 - x[1]) * y[i]) ** (alp[i]-1))


        elif i < n:

            p += -1 * ((alp[i] ** alp[i]) * (24 * y[i] + x[0] + end[i]) * ((1 - alp[i]) ** (1 - alp[i]))) * ((y[i]) ** (alp[i]-1))
    return r + p

def tax_rev(n):
    r = 0
    for i in range(n, len(y)):
        r += y[i]

    return r

bounds = [(0, np.inf), (0, 1)]

mat = np.zeros((len(y), 4))


for i in range(len(y)):
    # print(i)
    def constraint1(x):
        return 1 * (x[1] * tax_rev(i) - x[0] * (len(y) -i))

    cons1 = {'type': 'ineq', 'fun': constraint1}

    def co(x):
        return main(x, i)

    max = optimize.shgo(co, bounds=bounds, constraints=cons1)

    mat[i, 0] = round(max.x[0] ,5)
    mat[i, 1] = round(max.x[1] ,5)
    mat[i, 2] = -1 * round(max.fun ,5)
    mat[i, 3] = max.success

tax_from= np.unravel_index(np.argmax(mat, axis=None), mat.shape)

fin_tex = f'{100 * round(float(mat[tax_from[0] ,1]) ,15)}  % from those endowed with {y[tax_from[0]]}  or more. Transfer {round(float(mat[tax_from[0] ,0]) ,15)} units of money to those endowed with less than  {y[tax_from[0]]} .This would maximize utility in the society.'
print(fin_tex)
print(mat)

我正在使用此代码来优化可以在乳胶中看到的方程(变量 u 中的方程)。我不明白为什么当我不将任何东西除以 0 时,为什么会除以零。我认为这也是我优化时的问题。

除以零,根据我收到的错误信息在这里:

def main(x, n):

    r = 0
    p = 0
    #j=-1 * ((alp[i] ** alp[i]) * (24 * (1 - x[i]) * y[i] + end[i]) * ((1 - alp[i]) ** (1 - alp[i]))) / ((1 - x[1] * y[i]) ** (1 - alp[i]))
    for i in range(len(y)):
        if i >= n:

            r += -1 * ((alp[i] ** alp[i]) * (24 * (1 - x[1]) * y[i] + end[i]) * ((1 - alp[i]) ** (1 - alp[i]))) * (((1 - x[1]) * y[i]) ** (alp[i]-1))


        elif i < n:

            p += -1 * ((alp[i] ** alp[i]) * (24 * y[i] + x[0] + end[i]) * ((1 - alp[i]) ** (1 - alp[i]))) * ((y[i]) ** (alp[i]-1))
    return r + p

这发生在我命名为 r 的变量中。

我是 Python 新手,欢迎对我的代码提供任何帮助/建议 :)

【问题讨论】:

  • 似乎对我有用,我得到了 RuntimeWarning: divide by zero encountered in double_scalars 但没有 ZeroDivisionError。此警告可能来自优化例程。
  • 您正在优化的函数正在评估为inf,这可能是问题所在。

标签: python numpy divide-by-zero scipy-optimize


【解决方案1】:

完整的警告是:

RuntimeWarning: divide by zero encountered in double_scalars
  if __name__ == '__main__':
/usr/local/lib/python3.6/dist-packages/scipy/optimize/slsqp.py:63: RuntimeWarning: invalid value encountered in subtract
  jac[i] = (func(*((x0+dx,)+args)) - f0)/epsilon
/usr/local/bin/ipython3:9: RuntimeWarning: invalid value encountered in double_scalars

所以优化器 (slsqp) 正在评估 jacobian,然后除以 epsilon。并做减法。

这个问题有很多不必要的包袱。例如sympy/latex 业务。您不会在优化中使用它。

根据警告上下文,您需要编写代码来测试优化,而不要使用 i 循环。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2019-04-10
    • 2016-10-13
    • 2021-02-07
    • 2015-03-03
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多