From fae4d2ec359b596a775973956daf4636856f0141 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Wed, 6 Sep 2006 20:32:21 +0000 Subject: cleanups svn path=/trunk/externals/tb/; revision=5880 --- chaos/src/chua.hpp | 262 ++++++++++++++++++++++++++--------------------------- 1 file changed, 131 insertions(+), 131 deletions(-) (limited to 'chaos/src/chua.hpp') diff --git a/chaos/src/chua.hpp b/chaos/src/chua.hpp index f8c6e31..7669a24 100644 --- a/chaos/src/chua.hpp +++ b/chaos/src/chua.hpp @@ -1,18 +1,18 @@ -// -// +// +// // chaos~ // Copyright (C) 2004 Tim Blechmann -// +// // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, @@ -23,143 +23,143 @@ // chua system: dx1/dt = alpha * (x2 - x1 - h(x1)) // dx2/dt = x1 - x2 + x3 // dx3/dt = - beta * x2 -// +// // with h(x) = b*x + a - b (for x > 1) // a*x (for -1 <= x <= 1 // b*x - a + b (for x < -1) -// +// // taken from Viktor Avrutin: lecture notes class chua: - public ode_base<3> + public ode_base<3> { public: - chua() - { - CHAOS_PAR_INIT(method,2); - CHAOS_PAR_INIT(dt,0.05); - - CHAOS_SYS_INIT(x1,1,1); - CHAOS_SYS_INIT(x2,1,1); - CHAOS_SYS_INIT(x3,1,1); - - CHAOS_PAR_INIT(a,140); - CHAOS_PAR_INIT(b,30); - CHAOS_PAR_INIT(alpha,30); - CHAOS_PAR_INIT(beta,30); - } - - virtual void m_system(data_t* deriv, data_t* data) - { - data_t x1 = data[0]; - data_t x2 = data[1]; - data_t x3 = data[2]; - - data_t a = CHAOS_PARAMETER(a), b = CHAOS_PARAMETER(b); - - data_t h; - - if (x1 > 1) - h = b*x1 + a - b; - else if (x1 < -1) - h = b*x1 - a + b; - else - h = a*x1; - - deriv[0] = CHAOS_PARAMETER(alpha) * (x2 - x1 - h); - deriv[1] = x1 - x2 + x3; - deriv[2] = - CHAOS_PARAMETER(beta) * x2; - } - - virtual void m_verify() - { - data_t x1 = m_data[0]; - data_t x2 = m_data[1]; - data_t x3 = m_data[2]; - - if ( CHAOS_ABS(x3) < 1e-10) - x3 = 0; - - if (x1 == 0 && x2 == 0 && x3 == 0) /* fixpoint at (0,0,0) */ - { - reset(); - return; - } - else - { - data_t c = m_c; - if (m_c) - { - data_t mc = - c; - if (x1 == c && x3 == mc) /* fixpoint at (c,0,-c) */ - { - reset(); - return; - } - if (x1 == mc && x3 == c) /* fixpoint at (-c,0,c) */ - { - reset(); - return; - } - } - } - } - - inline void reset() - { - m_data[0] = rand_range(-1,1); - m_data[1] = rand_range(-1,1); - m_data[2] = rand_range(-1,1); - } - - CHAOS_SYSVAR_FUNCS(x1, 0); - CHAOS_SYSVAR_FUNCS(x2, 1); - CHAOS_SYSVAR_FUNCS(x3, 2); - - /* due to stability issues, we hook into the predicates */ - data_t m_c; - bool m_pred_a(data_t a) - { - data_t b = CHAOS_PARAMETER(b); - m_c = (b - a) / (b + 1); - return true; - } - - bool m_pred_b(data_t b) - { - if (b == -1) - m_c = 0; - else - { - data_t a = CHAOS_PARAMETER(a); - m_c = (b - a) / (b + 1); - } - return true; - } - - CHAOS_SYSPAR_FUNCS_PRED(a, m_pred_a); - CHAOS_SYSPAR_FUNCS_PRED(b, m_pred_b); - CHAOS_SYSPAR_FUNCS(alpha); - CHAOS_SYSPAR_FUNCS(beta); + chua() + { + CHAOS_PAR_INIT(method,2); + CHAOS_PAR_INIT(dt,0.05); + + CHAOS_SYS_INIT(x1,1,1); + CHAOS_SYS_INIT(x2,1,1); + CHAOS_SYS_INIT(x3,1,1); + + CHAOS_PAR_INIT(a,140); + CHAOS_PAR_INIT(b,30); + CHAOS_PAR_INIT(alpha,30); + CHAOS_PAR_INIT(beta,30); + } + + virtual void m_system(data_t* deriv, data_t* data) + { + data_t x1 = data[0]; + data_t x2 = data[1]; + data_t x3 = data[2]; + + data_t a = CHAOS_PARAMETER(a), b = CHAOS_PARAMETER(b); + + data_t h; + + if (x1 > 1) + h = b*x1 + a - b; + else if (x1 < -1) + h = b*x1 - a + b; + else + h = a*x1; + + deriv[0] = CHAOS_PARAMETER(alpha) * (x2 - x1 - h); + deriv[1] = x1 - x2 + x3; + deriv[2] = - CHAOS_PARAMETER(beta) * x2; + } + + virtual void m_verify() + { + data_t x1 = m_data[0]; + data_t x2 = m_data[1]; + data_t x3 = m_data[2]; + + if ( std::abs(x3) < 1e-10) + x3 = 0; + + if (x1 == 0 && x2 == 0 && x3 == 0) /* fixpoint at (0,0,0) */ + { + reset(); + return; + } + else + { + data_t c = m_c; + if (m_c) + { + data_t mc = - c; + if (x1 == c && x3 == mc) /* fixpoint at (c,0,-c) */ + { + reset(); + return; + } + if (x1 == mc && x3 == c) /* fixpoint at (-c,0,c) */ + { + reset(); + return; + } + } + } + } + + inline void reset() + { + m_data[0] = rand_range(-1,1); + m_data[1] = rand_range(-1,1); + m_data[2] = rand_range(-1,1); + } + + CHAOS_SYSVAR_FUNCS(x1, 0); + CHAOS_SYSVAR_FUNCS(x2, 1); + CHAOS_SYSVAR_FUNCS(x3, 2); + + /* due to stability issues, we hook into the predicates */ + data_t m_c; + bool m_pred_a(data_t a) + { + data_t b = CHAOS_PARAMETER(b); + m_c = (b - a) / (b + 1); + return true; + } + + bool m_pred_b(data_t b) + { + if (b == -1) + m_c = 0; + else + { + data_t a = CHAOS_PARAMETER(a); + m_c = (b - a) / (b + 1); + } + return true; + } + + CHAOS_SYSPAR_FUNCS_PRED(a, m_pred_a); + CHAOS_SYSPAR_FUNCS_PRED(b, m_pred_b); + CHAOS_SYSPAR_FUNCS(alpha); + CHAOS_SYSPAR_FUNCS(beta); }; -#define CHUA_CALLBACKS \ -ODE_CALLBACKS; \ -CHAOS_SYS_CALLBACKS(alpha); \ -CHAOS_SYS_CALLBACKS(beta); \ -CHAOS_SYS_CALLBACKS(a); \ -CHAOS_SYS_CALLBACKS(b); \ -CHAOS_SYS_CALLBACKS(x1); \ -CHAOS_SYS_CALLBACKS(x2); \ +#define CHUA_CALLBACKS \ +ODE_CALLBACKS; \ +CHAOS_SYS_CALLBACKS(alpha); \ +CHAOS_SYS_CALLBACKS(beta); \ +CHAOS_SYS_CALLBACKS(a); \ +CHAOS_SYS_CALLBACKS(b); \ +CHAOS_SYS_CALLBACKS(x1); \ +CHAOS_SYS_CALLBACKS(x2); \ CHAOS_SYS_CALLBACKS(x3); -#define CHUA_ATTRIBUTES \ -ODE_ATTRIBUTES; \ -CHAOS_SYS_ATTRIBUTE(a); \ -CHAOS_SYS_ATTRIBUTE(b); \ -CHAOS_SYS_ATTRIBUTE(alpha); \ -CHAOS_SYS_ATTRIBUTE(beta); \ -CHAOS_SYS_ATTRIBUTE(x1); \ -CHAOS_SYS_ATTRIBUTE(x2); \ +#define CHUA_ATTRIBUTES \ +ODE_ATTRIBUTES; \ +CHAOS_SYS_ATTRIBUTE(a); \ +CHAOS_SYS_ATTRIBUTE(b); \ +CHAOS_SYS_ATTRIBUTE(alpha); \ +CHAOS_SYS_ATTRIBUTE(beta); \ +CHAOS_SYS_ATTRIBUTE(x1); \ +CHAOS_SYS_ATTRIBUTE(x2); \ CHAOS_SYS_ATTRIBUTE(x3); -- cgit v1.2.1