Numpy:ValueError:使用序列设置数组元素

时间:2014-02-08 21:43:50

标签: python numpy matplotlib scipy

我正在玩python的科学库,特别是这里的例子:http://faculty1.coloradocollege.edu/~sburns/toolbox/ODE_II.html

我通过定义“强制函数”对其进行了修改,并尝试制作一个简单(但非物理的例子),其中力取决于对象的x和y位置。另外,我想用quiever绘制力场。问题是我不明白如何使力函数正确依赖于(一个函数)对象位置的x和y分量,特别是我得到下面引用的错误。

from pylab import *
from scipy.integrate import odeint
import numpy as np

## set initial conditions and parameters
g = 9.81            # acceleration due to gravity
th = 91            # set launch angle
th = th * pi/180.   # convert launch angle to radians
v0 = 100           # set speed

x0=0                # specify initial conditions
y0=0
vx0 = v0*sin(th)
vy0 = v0*cos(th)



## define force Funktion

def F_func(x):
    F = zeros(2)
    F[0] = x[1] # 
    F[1] = x[0] #
    return F


## define function to compute f(X,t)
def f_func(state,time):
    f = zeros(4)    # create array to hold f vector
    f[0] = state[2] # f[0] = x component of velocity
    f[1] = state[3] # f[1] = x component of velocity
    f[2] = F_func(state[:2])[0]        # f[2] = acceleration in x direction
    f[3] = F_func(state[:2])[1]      # f[3] = acceleration in y direction
    return f

## set initial state vector and time array
X0 = [ x0, y0, vx0, vy0]        # set initial state of the system
t0 = 0.
tf = 10
tau = 0.1
#tf = input("Enter final time: ")
#tau = input("Enter time step: ")

# create time array starting at t0, ending at tf with a spacing tau
t = arange(t0,tf,tau)   

## solve ODE using odeint
X = odeint(f_func,X0,t) # returns an 2-dimensional array with the 
                        # first index specifying the time and the
                        # second index specifying the component of
                        # the state vector

print X
# putting ':' as an index specifies all of the elements for
# that index so x, y, vx, and vy are arrays at times specified 
# in the time array
x = X[:,0]  
y = X[:,1] 
vx = X[:,2] 
vy = X[:,3]


## plot the trajectory
fig = figure()
ax = fig.add_subplot(1,1,1)

## Enlarge Limits by en Percent
en = 0.05


#xMin,xMax = 0,10
xMin,xMax = min(x),max(x)
yMin,yMax = min(y),max(y)

xMin,xMax = xMin - (xMax-xMin)*en,xMax + (xMax-xMin)*en
yMin,yMax = yMin - (yMax-yMin)*en,yMax + (yMax-yMin)*en


#plot(x,y,[xMin,xMax],[yMin,yMax])
#plot(x,y,[0,10],[0,10])
ax.plot(x,y)
ax.axis('tight')
xlim([xMin,xMax])
ylim([yMin,yMax])


xG,yG = meshgrid(linspace(xMin,xMax,10),linspace(yMin,yMax,5))

ax.quiver(xG,yG,F_func(zip(xG,yG))[0],F_func(zip(xG,yG))[1],pivot='middle',minshaft=5,minlength=1,alpha=0.1)


xlabel('x')
ylabel('y')

show()

使用此代码,我收到以下错误:

ValueError                                Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    176             else:
    177                 filename = fname
--> 178             __builtin__.execfile(filename, *where)

/home/myuser/python/test.py in <module>()
     87 xG,yG = meshgrid(linspace(xMin,xMax,10),linspace(yMin,yMax,5))
     88 
---> 89 ax.quiver(xG,yG,F_func(zip(xG,yG))[0],F_func(zip(xG,yG))[1],pivot='middle',minshaft=5,minlength=1,alpha=0.1)
     90 
     91 

/home/myuser/python/test.py in F_func(x)
     20 def F_func(x):
     21     F = zeros(2)
---> 22     F[0] = x[1] #
     23     F[1] = x[0] #
     24     return F

ValueError: setting an array element with a sequence.

有人可以解释一下以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

尝试使用

def F_func(x):
    F1 = x[1]
    F2 = x[0]
    return array([F1, F2])

而不是F_func。 并用

替换箭袋的调用
ax.quiver(xG,yG,F_func(array([xG,yG]))[0],F_func(array([xG,yG]))[1],pivot='middle',minshaft=5,minlength=1,alpha=0.1)

您可以通过在print x的第一行放置F_func来找出numpy为什么会出错。

F只是一个双元素数组,您正在尝试为其两个元素中的每一个分配数组(因此错误“使用序列设置数组元素”)。

这是因为zip(xG, yG)做了一些你可能不打算做的事情。 (尝试在ipython)中播放。

这是我在运行代码时获得的ODE解决方案的结果图: