2016-06-21 3 views
2

Я пытаюсь сделать 3D-колчан и объединить его с odeint для решения линеаризованного уравнения. В принципе, я хочу нечто похожее на this, но в 3D. Особая проблема, с которой я сталкиваюсь, заключается в том, что в конце кода, когда я делаю сюжет ax.quiver(), я продолжаю получать ошибку, что «val должен быть float или nonzero sequence of floats», и я не уверен как его решить.Построение графика 3D-колчана и ode

from scipy.integrate import odeint 
from numpy import * 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax =fig.add_subplot(1, 1, 1, projection='3d') 
ax.set_xlabel('x') 
ax.set_ylabel('u') 
ax.set_zlabel('u1') 

def testplot(X, t=0,c=0.2): 
    x = X[0] 
    u = X[1] 
    u1=X[2] 
    dxdt =x**2*(-1+x+u)*(1-x+(-1+c)*u**2) 
    du1dt =c**2*u*(2+x*(-4+2.25*x)+(-4 + 4*x)*u**2 + 2*u**4 + x**2*u*u1) 
    dudt=u1*dxdt 
    return [dxdt, dudt,du1dt] 
X0 = [0.01,0.995,-0.01]#initial values 
t = linspace(0, 50, 250) 
c=[0.2,0.5,1,2]#changing parameter 

for m in c: 
    sol = odeint(testplot,X0,t,mxstep=5000000,args=(m,))#solve ode 
    ax.plot(sol[:,0],sol[:,1],sol[:,2],lw=1.5,label=r'$c=%.1f$'%m) 

x = linspace(-3,3,15) 
y = linspace(-4,4,15) 
z= linspace(-2,2,15) 
x,y,z = meshgrid(x,y,z) #create grid 
X,Y,Z = testplot([x,y,z]) 
M = sqrt(X**2+Y**2+Z**2)#magnitude 
M[M==0]=1. 
X,Y,Z = X/M, Y/M, Z/M 

ax.quiver(x,y,z,X,Y,Z,M,cmap=plt.cm.jet) 
ax.minorticks_on() 
ax.legend(handletextpad=0,loc='upper left') 
setp(ax.get_legend().get_texts(),fontsize=12) 
fig.savefig("testplot.svg",bbox_inches="tight",\ 
     pad_inches=.15) 
+0

Какова цель 'M' в' ax.quiver'? Глядя на исходный код 'matplotlib', там принимаются только скаляры или 1D массивы. – Bart

ответ

1

Похоже, у вас есть дополнительный аргумент в ax.quiver(). Из того, что я могу сказать, похоже, что «М» - дополнительный аргумент. Исходя из этого, ваши колчан вызов выглядит следующим образом:

ax.quiver(x,y,z,X,Y,Z,cmap=plt.cm.jet) 

Полученное изображение выглядит следующим образом: enter image description here

+0

Благодарим вас за помощь. Я добавил дополнительный аргумент M для величины, но, по-видимому, он не работал должным образом – zalba19