Source code [gnuplot]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
reset | |
#=================== Setting ==================== | |
set nokey | |
L = 5.0 | |
set xr[-L:L] | |
set yr[-L:L] | |
set xl "{/Times:Italic=18 x}({/Times:Italic=18 t})" font 'Times New Roman, 18' | |
set yl "{/Times:Italic=18 x}'({/Times:Italic=18 t})" font 'Times New Roman, 18' | |
set tics font 'Times New Roman,14' | |
set xtics 1 | |
set ytics 1 | |
set size ratio 1 | |
unset grid | |
# Output GIF file | |
set term gif animate delay 4 size 1280,720 | |
set output sprintf("vdp_6x_mu=%0.2f.gif", mu) | |
#=================== Parameter ==================== | |
mu = 1. # Coefficient of VDP equation | |
dt = 0.001 # Time step [s] | |
dh = dt/6. # Coefficient of Runge-Kutta 4th | |
lim1 = 70 # Stop time | |
end = 30 # Time limit [s] | |
lim2 = end/dt # Number of calculation | |
cut = 100 # Decimation | |
off = 0.15 # Offset | |
r = 0.08 # Size of points | |
N = 6 # Number of points (array size) | |
array x[N] # Position of points | |
array y[N] | |
# Color of points | |
array c[N] = ["red", "royalblue", "spring-green", \ | |
"dark-pink", "grey80", "dark-orange"] | |
#=================== Function ==================== | |
#Van der Pol equation | |
f1(x, y) = y | |
f2(x, y) = mu * (1 - x**2) * y - x | |
#Runge-Kutta 4th order method | |
rk4x(x, y) = (k1 = f1(x, y),\ | |
k2 = f1(x + dt*k1/2, y + dt*k1/2),\ | |
k3 = f1(x + dt*k2/2, y + dt*k2/2),\ | |
k4 = f1(x + dt*k3, y + dt*k3),\ | |
dh * (k1 + 2*k2 + 2*k3 + k4)) | |
rk4y(x, y) = (k1 = f2(x, y),\ | |
k2 = f2(x + dt*k1/2, y + dt*k1/2),\ | |
k3 = f2(x + dt*k2/2, y + dt*k2/2),\ | |
k4 = f2(x + dt*k3, y + dt*k3),\ | |
dh * (k1 + 2*k2 + 2*k3 + k4)) | |
# Time and parameter(mu) | |
Label(t, mu) = sprintf("{/Times:Italic t} = %.1f\n{/symbol:Italic m} = %.1f", t, mu) | |
#=================== Plot ==================== | |
# Initiate value | |
t = 0. # Time | |
x[1] = 0.5 # x1(t) | |
y[1] = 0.0 # x1'(t) | |
x[2] = 1.0 # x2(t) | |
y[2] = -3.0 # x2'(t) | |
x[3] = -1.7 # x3(t) | |
y[3] = 1.9 # x3'(t) | |
x[4] = 1.0 # x4(t) | |
y[4] = 2.1 # x4'(t) | |
x[5] = 3.5 # x5(t) | |
y[5] = 3.7 # x5'(t) | |
x[6] = -3. # x6(t) | |
y[6] = -3. # x6'(t) | |
# Axes | |
set arrow 1 from -L, 0 to L, 0 lc -1 lw 2 back | |
set arrow 2 from 0, -L to 0, L lc -1 lw 2 back | |
# Draw initiate state for lim1 steps | |
do for [i = 1:lim1] { | |
# Display time and mu | |
set label 1 left Label(t, mu) font 'Times New Roman, 18' at graph 0.02, 0.95 | |
# Display coordinates of N points | |
if(i < lim1*0.8){ | |
do for[j = 1:N] { | |
set label j+1 left sprintf("(%.1f, %.1f)", x[j], y[j])\ | |
font 'Times New Roman, 14' at x[j]+off, y[j]+off | |
} | |
} | |
# Hide the coordinates | |
if(i == lim1*0.8){ | |
do for[j = 1:N] { | |
unset label j+1 | |
} | |
} | |
# N points | |
do for[j=1:N] { | |
set obj j circ at x[j], y[j] size r fc rgb c[j] fs solid border -1 lw 2 front | |
} | |
plot 1/0 | |
} | |
# Update for lim2 steps | |
do for [i = 1:lim2] { | |
t = t + dt | |
# Calculate using Runge-Kutta 4th | |
do for[j = 1:N]{ | |
x[j] = x[j] + rk4x(x[j], y[j]) | |
y[j] = y[j] + rk4y(x[j], y[j]) | |
} | |
# Time and mu | |
set label 1 Label(t, mu) | |
# Objects | |
do for[j = 1:N] { | |
set obj j at x[j], y[j] | |
set obj 6*i+j circ at x[j], y[j] size 0.09*r fc rgb c[j] fs solid | |
} | |
# Decimate and display | |
if(i%cut==0){ | |
plot 1/0 | |
} | |
} | |
set out |
No comments:
Post a Comment