我有一个代码,使用numpy
和hermval
以及多个函数来计算最终给定参数的psi
。但我一直收到错误numpy.ndarray object not callable
,我真的不明白为什么会这样。以下是我的代码的相关部分:
import numpy as np
import math
from numpy.linalg import eigh
from numpy.polynomial.hermite import hermval
def matrices(N, lam):
H_0 = np.zeros([N+1, N+1])
x_four_matrix = np.zeros([N+1, N+1])
for n in range(N+1):
for m in range(N+1):
if n == m:
H_0[n][m] = n + 0.5
x_four_matrix[n][m] = (6.0*n**2 + 6.0*n + 3.0)/4.0
elif n == m-2:
x_four_matrix[n][m] = np.sqrt((n+1)*(n+2))*(n+1.5)
elif n == m+2:
x_four_matrix[n][m] = (n-0.5)*np.sqrt(n*(n-1))
elif n == m-4:
x_four_matrix[n][m] = np.sqrt((n+1)*(n+2)*(n+3)*(n+4))/4.0
elif n == m+4:
x_four_matrix[n][m] = np.sqrt((n-3)*(n-2)*(n-1)*n)/4.0
return H_0, x_four_matrix
def H_lam(N, lam):
return matrices(N, lam)[0] + lam*matrices(N, lam)[1]
# Solve for eigenvalues (energies)
def lowest_eigenvals(N, n, lam):
lowest_eigs = []
eigenvals = eigh(H_lam(N, lam))[0]
eigenvals.sort()
for i in range(n):
lowest_eigs.append(eigenvals[i])
return lowest_eigs
# Solve for eigenvectors
def lowest_eigenvectors(N, n, lam):
lowest_vecs = []
for i in range(len(lowest_eigenvals(N, n, lam))):
for j in range(len(eig(H_lam(N, lam))[0])):
if lowest_eigenvals(N, n, lam)[i] == eigh(H_lam(N, lam))[0][j]:
lowest_vecs.append(eigh(H_lam(N, lam))[1][j])
return np.array(lowest_vecs)
def N_coeff(i):
return 1.0/np.sqrt(2**i*math.factorial(i)*np.sqrt(np.pi))
# for E_0 (first eigenfunction):
def psi(x, lowest_eigenvectors, i):
herm_coeffs = [element*N_coeff(i) for element in lowest_eigenvectors(N, n, lam)[i]]
return np.exp((x**2)/2.0)*hermval(x, herm_coeffs)
print [element*N_coeff(0) for element in lowest_eigenvectors(100, 4, 0.1)[0]]
print psi(1.0, lowest_eigenvectors(100, 4, 1.0), 0) # for lambda = 1
然后在我的上一个print
语句中,我得到TypeError: 'numpy.ndarray' object is not callable
来自我上一个函数中的herm_coeffs
行。但是我不确定为什么会发生这种情况,因为第二个到最后一个print
语句打印正确!这是怎么回事?
这是追溯:
TypeError Traceback (most recent call last)
<ipython-input-350-04692f269a26> in <module>()
13 # print [element*N_coeff(0) for element in lowest_eigenvectors(100, 4, 0.1)[0]]
14
---> 15 print psi(1.0, lowest_eigenvectors(100, 4, 0.1), 0)
<ipython-input-350-04692f269a26> in psi(x, lowest_eigenvectors, i)
7 # for E_0 (first eigenfunction):
8 def psi(x, lowest_eigenvectors, i):
----> 9 herm_coeffs = [element*N_coeff(i) for element in lowest_eigenvectors(N, n, lam)[i]]
10 return np.exp((x**2)/2.0)*hermval(x, herm_coeffs)
11
TypeError: 'numpy.ndarray' object is not callable
答案 0 :(得分:3)
lowest_eigenvectors
中的 psi
参数名称与函数lowest_eigenvectors
发生冲突。
编辑:由于psi
函数位于同一个lowest_eigenvectors
内,因此您似乎无需通过psi
函数lowest_eigenvectors
3}}为import matplotlib.pyplot as plt
import numpy as np
#create x and y values
xval = np.arange(1,10)
yval = np.square(xval)
#define error bars and markersize
yerrmi = np.abs(np.cos(xval) * xval)
yerrpl = np.abs(np.sin(xval) * xval)
yerr = np.stack([yerrpl, yerrmi])
markerpl = 5 * yval
#plot error bars
plt.errorbar(xval, yval, yerr = yerr, ls = "None", color = "r")
#plot scatter plot
plt.scatter(xval, yval, s = 5 * yval, marker = "h", color = "r")
plt.show()
。
答案 1 :(得分:1)
建立@Scott建议的内容,我认为psi
应该更改为:
def psi(x, vectors, i):
herm_coeffs = [element*N_coeff(i) for element in vectors[i]]
return np.exp((x**2)/2.0)*hermval(x, herm_coeffs)
print psi(1.0, lowest_eigenvectors(100, 4, 1.0), 0)
换句话说,您计算vectors = lowest_eigenvectors(100, 4, 1.0)
,并将其传递给psi
。即使你有这个数组与函数命名正确,使用:
lowest_eigenvectors(N, n, lam)
psi
中的会出现问题,因为N, n, lam
未在函数中定义或全局定义。
我想知道这个功能是否可以通过以下方式进一步简化:
herm_coeffs = N_coeff(i)*vectors[i]