2016-06-21 18 views
2

Ich versuche ein 3D-Quiver-Plot zu erstellen und es mit Odein zu kombinieren, um eine linearisierte Gleichung zu lösen. Grundsätzlich möchte ich etwas ähnliches wie this aber in 3D. Das besondere Problem, das ich habe, ist, dass nahe dem Ende des Codes, wenn ich den ax.quiver() - Plot mache, ich immer den Fehler bekomme, dass "val eine Float- oder Nicht-Null-Sequenz von Floats sein muss", und ich bin unsicher wie man es löst.Plotten eines 3D-Quiver-Plots und einer 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

Was ist das Ziel von 'M' in' ax.quiver'? Betrachtet man den 'matplotlib' Quellcode, werden dort nur Skalare oder 1D Arrays akzeptiert. – Bart

Antwort

1

Sieht so aus, als hätten Sie ein zusätzliches Argument in ax.quiver(). Von dem, was ich sagen kann, sieht es aus wie "M" ist das zusätzliche Argument. Unter dass aus sieht Ihr Köcher Aufruf wie:

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

Das resultierende Bild wie folgt aussieht: enter image description here

+0

Vielen Dank für Ihre Hilfe. Ich fügte das zusätzliche Argument M für eine Größe hinzu, aber anscheinend funktionierte es nicht wie beabsichtigt – zalba19