2016-12-12 7 views
1
from __future__ import division 
import numpy as np 
import matplotlib.pyplot as plt 
import math 
from scipy.integrate import odeint 
from scipy.fftpack import fft, ifft 

def pend(y, t, a, b, ohm): 
    theta, omega, phi = y 
    dydt = [omega, -b*omega-np.sin(theta)-a*np.cos(phi), ohm] 
    return dydt 

b = 1.0/2.0  #beta 
ohm = 2.0/3.0  #capital Omega 
period = 2.0*math.pi/ohm  #driving period 

t0 = 0.0  #initial time 
t = np.linspace(t0,t0+period*10**3,10**3+1)  #time for Poincare map 

theta0 = 0.75 
omega0 = 1.6 
phi0 = 0.8 
y0 = [theta0,omega0,phi0]  #initial conditions 
N = 100       #number of transient points to delete 

a_array = np.linspace(0,1.15,50) #varying parameter of a values 

for a in a_array: 
    sol = odeint(pend,y0,t,args=(a,b,ohm))  #numerical integration of differential equation 
    sol = sol[N:10**3-N]  #removing transients 
    w = sol[:,1]    #frequency 
    A = np.full(len(w),a)  #array of a-values 
    plt.plot(A, w) 
    plt.draw() 

Ich versuche derzeit, ein Bifurkationsdiagramm zu erstellen. In dem von uns verwendeten Gleichungssystem ist a der Steuerparameter, den wir für Werte zwischen 0 und 1,15 auf der X-Achse im Vergleich zu einem Array von Werten (genannt w) für einen bestimmten Wert von a zeichnen. Ich bin mir nicht wirklich sicher, wie ich Dinge aus einer For-Schleife wie dieser plotten soll. Ich habe gehört, dass Subplots der beste Weg sind, aber ich bin mit der Implementierung nicht vertraut und könnte Hilfe gebrauchen. Vielen Dank!Plotten mehrerer Unterplots auf demselben Diagramm

+0

Lauf jetzt Ihren Code. Eine Weile dauern, um zu laufen. In der Zwischenzeit verschiebe ich normalerweise die plt.draw() oder plt.show() außerhalb der Schleife. –

Antwort

0

Undenting der letzte Befehl funktionierte für mich.

from __future__ import division 
import numpy as np 
import matplotlib.pyplot as plt 
import math 
from scipy.integrate import odeint 
from scipy.fftpack import fft, ifft 

def pend(y, t, a, b, ohm): 
    theta, omega, phi = y 
    dydt = [omega, -b*omega-np.sin(theta)-a*np.cos(phi), ohm] 
    return dydt 

b = 1.0/2.0  #beta 
ohm = 2.0/3.0  #capital Omega 
period = 2.0*math.pi/ohm  #driving period 

t0 = 0.0  #initial time 
t = np.linspace(t0,t0+period*10**3,10**3+1)  #time for Poincare map 

theta0 = 0.75 
omega0 = 1.6 
phi0 = 0.8 
y0 = [theta0,omega0,phi0]  #initial conditions 
N = 100       #number of transient points to delete 

a_array = np.linspace(0,1.15,50) #varying parameter of a values 

for a in a_array: 
    sol = odeint(pend,y0,t,args=(a,b,ohm))  #numerical integration of differential equation 
    sol = sol[N:10**3-N]  #removing transients 
    w = sol[:,1]    #frequency 
    A = np.full(len(w),a)  #array of a-values 
    plt.plot(A, w) 
plt.show() 

enter image description here

+0

Vielen Dank für die schnelle Antwort. Ich kam auch zu dieser Handlung, aber fast sofort verworfen, da es schien nur Werte für eine zwischen 1,05 und 1,15, was nicht richtig scheint. – infinitylord

+0

Ist das, wonach Sie suchen? –

+0

Solange dies das w-Array für einen bestimmten Wert von a in a_array generiert, und dann das Ergebnis für jeden Wert von a auf dem gleichen Graphen plotten, dann ist das, was ich suche – infinitylord

Verwandte Themen