我不明白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
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
循环。