2014-02-08 2 views
2

Я просто играл с научными библиотеками Питона EXPECIALLY примеров здесь: http://faculty1.coloradocollege.edu/~sburns/toolbox/ODE_II.htmlNumpy: ValueError: установка элемента массива с последовательностью

Я изменил его, определив функцию «силы» и попытался сделать простой (но не физический пример), где сила зависит от положения 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

Попробуйте использовать

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) 

Вы можете узнать, почему NumPy дает вам ошибку, поставив print x на первой строке F_func.

F - всего лишь двухэлементный массив, и вы пытаетесь назначить массивы для каждого из двух его элементов (следовательно, ошибка «установка элемента массива с последовательностью»).

Это происходит потому, что zip(xG, yG) делает то, что вы, вероятно, не намерены делать. (Попробуйте сыграть с ним в ipython).

Это результирующий график ОДУ решения я получаю при запуске кода:

+0

К сожалению, я забыл еще одну модификацию. Он должен работать, если вы также измените линию ax.quiver (см. Выше) – ibab

Смежные вопросы