我试图使用scipy.optimize.curve_fit
将一些数据放入一个函数中,但是仍然会得到一个值错误,类似于this post中描述的错误,但是按照注释中的建议将所有输入输入到numpy数组中似乎并不能解决我的问题。在
以下是我的基本代码:
def RamanHamiltonian(k, omega, delta, epsilon):
H = np.array([[(k+2.0)**2.0 - delta, omega/2.0, 0.0],
[omega/2.0, k**2.0-epsilon,omega/2.0],
[0.0,omega/2.0,(k-2.0)**2.0 + delta]])
return H
def propagateHamiltonianTest(t, omega, delta, epsilon):
k = 0.0
psi0 = np.array([0+1j*0.0, 1.0+1j*0.0, 0.0+1j*0.0])
H = RamanHamiltonian(k, omega, delta ,epsilon)
Energy, V = LA.eig(H)
V = V + 1j*0.0
Vinv = np.conjugate(np.transpose(V))
U = np.diag(np.exp(-1j*np.array(Energy)*t))
a =np.dot(Vinv,psi0)
b = np.dot(U,a)
psi = np.dot(V,b)
pop0 = np.absolute(psi[0])**2.0
return pop0
popt, pcov = optimize.curve_fit(propagateHamiltonianTest,
np.array(tRecoils),
np.array(frac0),
p0=(3.0,0.05,0.03))
下面是tRecoils
和frac0
的值,它们的长度都是24个数组:
我得到了这个错误:
U = np.diag(np.exp(-1j*np.array(Energy)*t))
ValueError: operands could not be broadcast together with shapes (3) (24)
因此,出于某些原因,curve_nfit读取整个tRecoil
数组,而不是按元素方式进行读取,我似乎无法通过更改输入格式来纠正这一点。在
我认为问题在于如何计算函数
propagateHamiltonianTest
存在歧义。它可以应用于t
的单个值(这就是您对它的看法),也可以应用于整个数组,在这种情况下,numpy将整个数组传递到参数t
并尝试向量化。在事实上,当我在数组
tRecoil[0]
的一个元素上测试你的函数时,它可以工作,但是当你在整个数组上尝试它时,它失败了,并出现了相同的错误。所以问题与curve_fit
无关。如果你可以让你的函数接受整个数组,然后返回一个数组,那么它应该与curve_fit
一起工作。在为了做到这一点,我不得不使用一个小技巧,使用
scipy.linalg.block_diag
。这使得我们可以创建一个更大的块对角矩阵,它基本上有每个3x3矩阵,这些矩阵是沿着对角线的每个时间步产生的。在下面是您的
propagateHamiltonianTest
函数的修改版本及其注释。我已经测试过了,应该可以用了。在输出:
^{pr2}$相关问题 更多 >
编程相关推荐