3D 图形错误:"The truth value of an array with more than one element is ambiguous"



我正在尝试绘制一个3D图,使用一个重新存在的函数来生成Z值。然而,这产生了误差";具有一个以上元素的数组的真值是不明确的";。这似乎很奇怪,因为我可以使用相同的函数和y,x值生成一个Z值列表,但一旦我包含了3D绘图代码,就会出现错误。

我的绘图代码是:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
from matplotlib import cm

def f(tau,tau_b):                             #re-use society welfare function of tau & tau_b, using corr=0.6
Z = society_welfare2 (0.6, tau, tau_b)
return Z
xgrid=np.linspace(1e-5, 1-1e-5,100)   #tau grid
ygrid=np.linspace(1e-5, 1-1e-5,100)   #tau_b grid
tau,tau_b=np.meshgrid(xgrid,ygrid)
fig=plt.figure(figsize=(8,6))
ax=fig.add_subplot(111,projection='3d')
ax.plot_surface(tau,
tau_b,
f(tau,tau_b),
rstride=2,cstride=2,
cmap=cm.jet,
alpha=0.7,
linewidth=0.25)
ax.set_zlim(-0.5,1.0)
plt.show()

我的社会_福利2功能代码:

def society_welfare2 (corr, tau, tau_b):

cov   = [[1,corr], [corr,1]]   #covariance
epsilon_start,b_start = np.random.multivariate_normal(mean, cov, sample_N).T 
epsilon     = np.exp(epsilon_start)  #to ensure epsilon positive
b     = np.exp(b_start)              #to ensure b positive
indv_welfares = []

def GBC (t_o):
taxes_paid = []
for i in range(sample_N):                     #loop over all agents to find their C1,C2,L
def consumption_functions(Lguess,epsilon=epsilon,b=b):
C2 = (((1-tau)*epsilon[i]*w*Lguess) +(1-tau_b)*b[i] + ((t_o)/(1+r)))/((1/((beta**(1/gamma))*((1+r)**(1/gamma)))) + (1/(1+r)))
C1 = C2 /((beta**(1/gamma))*(1+r)**(1/gamma))
return -Utility(C1,C2,Lguess)
result = minimize_scalar(consumption_functions,bounds=(0,1),method='bounded', args=(epsilon, b))
opt_L = result.x

opt_C1=(((1-tau)*(epsilon[i])*w)/(opt_L**sigma))**(1/gamma)

opt_C2=(opt_C1)*((beta**(1/gamma))*(1+r)**(1/gamma))

income_tax = tau*(epsilon[i])*w*opt_L         
bequest_tax = tau_b*(b[i])                 
taxes_paid.append(income_tax)        
taxes_paid.append(bequest_tax)   

welfare_func = opt_C1**(1-gamma)/(1-gamma)-opt_L**(1+sigma)/(1+sigma) + beta*(opt_C2**(1-gamma)/(1-gamma))
indv_welfares.append(welfare_func)

total_tax_revenue = sum(taxes_paid)  

return total_tax_revenue - (10000*t_o)
result1 = minimize_scalar(GBC,bounds=(1e-5, 100000),method='bounded')

opt_t_o = result1.x

total_welfare = sum(indv_welfares)
return total_welfare   

完整的回溯错误代码:

ValueError                                Traceback (most recent call last)
<ipython-input-19-3633f4a9db76> in <module>
18 ax.plot_surface(tau,
19                 tau_b,
---> 20                 f(tau,tau_b),
21                 rstride=2,cstride=2,
22                 cmap=cm.jet,
<ipython-input-19-3633f4a9db76> in f(tau, tau_b)
7 
8 def f(tau,tau_b):                             #re-use society welfare function of tau & tau_b, using corr=0.6
----> 9     Z = society_welfare2 (0.6, tau, tau_b)
10     return Z
11 
<ipython-input-17-321a709b9684> in society_welfare2(corr, tau, tau_b)
61         return total_tax_revenue - (10000*t_o)
62 
---> 63     result1 = minimize_scalar(GBC,bounds=(1e-5, 100000),method='bounded')
64 
65     opt_t_o = result1.x
/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/_minimize.py in minimize_scalar(fun, bracket, bounds, args, method, tol, options)
798         if isinstance(disp, bool):
799             options['disp'] = 2 * int(disp)
--> 800         return _minimize_scalar_bounded(fun, bounds, args, **options)
801     elif meth == 'golden':
802         return _minimize_scalar_golden(fun, bracket, args, **options)
/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/optimize.py in _minimize_scalar_bounded(func, bounds, args, xatol, maxiter, disp, **unknown_options)
1956     rat = e = 0.0
1957     x = xf
-> 1958     fx = func(x, *args)
1959     num = 1
1960     fmin_data = (1, xf, fx)
<ipython-input-17-321a709b9684> in GBC(t_o)
41                 return -Utility(C1,C2,Lguess)
42 
---> 43             result = minimize_scalar(consumption_functions,bounds=(0,1),method='bounded', args=(epsilon, b))
44 
45             opt_L = result.x
/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/_minimize.py in minimize_scalar(fun, bracket, bounds, args, method, tol, options)
798         if isinstance(disp, bool):
799             options['disp'] = 2 * int(disp)
--> 800         return _minimize_scalar_bounded(fun, bounds, args, **options)
801     elif meth == 'golden':
802         return _minimize_scalar_golden(fun, bracket, args, **options)
/opt/anaconda3/lib/python3.8/site-packages/scipy/optimize/optimize.py in _minimize_scalar_bounded(func, bounds, args, xatol, maxiter, disp, **unknown_options)
2015             print("%5.0f   %12.6g %12.6g %s" % (fmin_data + (step,)))
2016 
-> 2017         if fu <= fx:
2018             if x >= xf:
2019                 a = xf
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

回溯的最低点是

if fu <= fx:

这是比较if中的两个变量。如果fufx是标量或单值数组,这将起作用。但如果其中一个是多值数组,则if将引发此错误。

此时,我们的任务是将这些变量追溯到您的代码中。我怀疑您正在为某个参数提供数组,其中they/is应该是标量。

看看顶部。当你要求绘图时,它会发生,但参数是一个函数调用:

f(tau,tau_b)

并且通过对CCD_ 5函数上的CCD_。我认为GBC就是中的func

fx = func(x, *args)

这就提出了一个问题,GBC究竟返回了什么?它正在_minimize_scalar中使用,所以它应该只返回一个值。

它的返回表达式是什么?

return total_tax_revenue - (10000*t_o)

你认为你可以从那里进行分析吗?

现在你明白我们为什么坚持要看traceback了吗。错误在您的代码中,但到达那里的顺序很长,而且从简单地读取代码来看并不明显。

编辑

哦,我看到了minimize的另一个级别,一个使用的级别

consumption_functions

它有几个参数,epsilonb。我想我们可以推断出它们是什么。但是是什么

Utility

fu <= fx似乎正在针对绑定的fu测试fx返回值。假设边界是标量,则值fx必须是一个数组。是吗???

相关内容

最新更新