绘制函数的输出会产生此错误 - TypeError:unhashable type:'numpy.ndarray'

时间:2015-05-13 19:04:15

标签: python plot sympy

我尝试绘制相对于z的已定义函数的输出。但是会显示错误TypeError:unhashable type:'numpy.ndarray'。请帮忙。

import numpy as np
import matplotlib.pyplot as plt 
import sympy as sp

a=1.48185562
b=0.57081914
c=-0.25098188
H0=70.32724312

z=np.linspace(0.0,1.5,100)

omega_m0=0.3

dlabel= 'w(z) vz z'

def func(z):    
    sp.var('z+1')
    H=((2/H0)*((b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)*(1-0.5*a*(z+1)**(-0.5)) - ((z+1)-a*(z+1)**0.5-1.0+a)*(b+c*0.5*(z+1)**(-0.5)))/(b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)**2)**(-1) 
    return ((2*(z+1)/3)*(sp.diff(sp.log(H)))-1)/(1-(H/H0)**2*omega_m0*(z+1)**3)

wz=func(z)

plt.plot(z,wz)
plt.xlabel('z')
plt.ylabel('w(z)')
plt.show()

2 个答案:

答案 0 :(得分:3)

我不确定你想用sp.var('z+1')做什么...至少我希望你不是要创建一个名为z + 1的变量。我得到了运行的代码,但是我让你确保它能做你想做的事情,如果没有,我会抱怨:)

import numpy as np
import matplotlib.pyplot as plt 
import sympy as sp

a=1.48185562
b=0.57081914
c=-0.25098188
H0=70.32724312

x=np.linspace(0.0,1.5,100)

omega_m0=0.3

dlabel= 'w(z) vz z'

sp.var('z')

def func(z):    
  H=((2/H0)*((b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)*(1-0.5*a*(z+1)**(-0.5)) - ((z+1)-a*(z+1)**0.5-1.0+a)*(b+c*0.5*(z+1)**(-0.5)))/(b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)**2)**(-1) 
  return ((2*(z+1)/3)*(sp.diff(sp.log(H)))-1)/(1-(H/H0)**2*omega_m0*(z+1)**3)

wz = [func(z).evalf(subs = {z : y}) for y in x]

plt.plot(x,wz)
plt.xlabel('z')
plt.ylabel('w(z)')
plt.show()

编辑:为了获得wz,以下内容要快得多(参见Evaluate sympy expression from an array of values):

from sympy.utilities.lambdify import lambdify
func_np_ready = lambdify(z, func(z),'numpy') # returns a numpy-ready function
wz = func_np_ready(x)

答案 1 :(得分:1)

你可能最好用sympy标记你的问题 - 这可能是导致问题的其中一个函数的行为,而其他人可能知道它的全部内容。

将这些非常长的公式分成多行(至少在调试时)以帮助您追踪错误可能是个好主意。也放一些印刷品等。

我知道这不是你想要实现的,但是如果我切断了这个问题(我没有安装它!)并调整数组长度,它会没有错误地绘制:

    ...
    H=((2/H0)*((b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)*(1-0.5*a*(z+1)**(-0.5)) - ((z+1)-a*(z+1)**0.5-1.0+a)*(b+c*0.5*(z+1)**(-0.5)))/(b*(z+1)+c*(z+1)**0.5+2.0-a-b-c)**2)**(-1) 
    return ((2*(z[:-1]+1)/3)*(np.diff(np.log(H)))-1)/(1-(H[:-1]/H0)**2*omega_m0*(z[:-1]+1)**3)

wz=func(z)

plt.plot(z[:-1],wz)

enter image description here

相关问题