#!/usr/bin/env ruby
require("gnuplot")
require("gsl")
dim = 3
roesller = Proc.new { |t, v, dvdt, params|
a = params[0]; b = params[1]; c = params[2]
x = v[0]; y = v[1]; z = v[2]
dvdt[0] = - y - z
dvdt[1] = x + a*y
dvdt[2] = b*x - (c - x)*z
}
a = 0.344
b = 0.4
c = 4.5
solver = GSL::Odeiv::Solver.new(GSL::Odeiv::Step::RKF45, [1e-6, 0.0], roesller, dim)
solver.set_params(a, b, c)
t = 0.0; tend = 100.0
h = 1e-6
v = GSL::Vector[1, 0, 0]
GSL::ieee_env_setup()
N = 1000
x = GSL::Vector[N]
y = GSL::Vector[N]
z = GSL::Vector[N]
i = 0
while t < tend
t, h, status = solver.apply(t, tend, h, v)
x[i] = v[0]
y[i] = v[1]
z[i] = v[2]
i += 1
break if status != GSL::SUCCESS
end
Gnuplot::open do |gp|
Gnuplot::SPlot.new( gp ) do |plot|
plot.title "Roesller equation"
plot.data = [
Gnuplot::DataSet.new( [x.subvector(i), y.subvector(i), z.subvector(i)] ) { |ds|
ds.title = ""
ds.with = "lines"
}
]
end
end
syntax highlighted by Code2HTML, v. 0.9.1