From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22085 invoked by alias); 3 Jun 2007 08:18:22 -0000 Received: (qmail 22077 invoked by uid 22791); 3 Jun 2007 08:18:21 -0000 X-Spam-Check-By: sourceware.org Received: from wa-out-1112.google.com (HELO wa-out-1112.google.com) (209.85.146.180) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 03 Jun 2007 08:18:20 +0000 Received: by wa-out-1112.google.com with SMTP id k40so1430024wah for ; Sun, 03 Jun 2007 01:18:18 -0700 (PDT) Received: by 10.114.157.1 with SMTP id f1mr3656905wae.1180858697867; Sun, 03 Jun 2007 01:18:17 -0700 (PDT) Received: by 10.114.26.2 with HTTP; Sun, 3 Jun 2007 01:18:17 -0700 (PDT) Message-ID: Date: Sun, 03 Jun 2007 08:18:00 -0000 From: Michael To: gsl-discuss@sources.redhat.com Subject: Help! Questions for the developers of GSL ODE: Complex-valued ODEs and the "jac" function in GSL ODE solver? MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Mailing-List: contact gsl-discuss-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gsl-discuss-owner@sourceware.org X-SW-Source: 2007-q2/txt/msg00025.txt.bz2 Help! Complex-valued ODEs and the "jac" function in GSL ODE solver? Hi all, I am new to GSL ode, I started looking it because I really need to speed my current Matlab program, which runs ODE solvers repeatedly for thousands to millions of times. I found the GSL example ode program difficult to understand, and here are my questions: (1) I have to solve the following complex-valued non-linear ODE numerically, using GSL's ode solver. But it seems that GSL's ode solver only supports real-valued ODE... My ODEs are: y' = c1 * y + c2 + c3*exp(c4* y + c5*i) x' = c6 * y here c1, c2, c3, c4, c5 and c6 are real numbers , and "i" is the unit of imaginary numbers. I am planning to decompose y into yr and yi, x into xr and xi, the real parts and the imaginary parts. And solve separately: yr' = c1 * yr + c2 + c3*exp(c4* yr)*cos(c4* yi + c5) yi' = c1 * yi + c2 + c3*exp(c4* yr)*sin(c4* yi + c5) xr' = c6 * yr xi' = c6 * yi -------------------- Am I right? Is this the best approach to handle the ODEs with a solver only supports real values? My original solutions were already too slow, now by having to solve 4 equations, it is even slower, and double the computing time... Any better approaches? (2) In the sample GSL ode code, there is a function called "jac", how do I define the "jac" function for my ODE equations, as shown above? int jac (double t, const double y[], double *dfdy, double dfdt[], void *params) { double mu = *(double *)params; gsl_matrix_view dfdy_mat = gsl_matrix_view_array (dfdy, 2, 2); gsl_matrix * m = &dfdy_mat.matrix; gsl_matrix_set (m, 0, 0, 0.0); gsl_matrix_set (m, 0, 1, 1.0); gsl_matrix_set (m, 1, 0, -2.0*mu*y[0]*y[1] - 1.0); gsl_matrix_set (m, 1, 1, -mu*(y[0]*y[0] - 1.0)); dfdt[0] = 0.0; dfdt[1] = 0.0; return GSL_SUCCESS; } --------------------- There is no documentation talking about this "jac" function. I really don't know how to define my "jac" function for my own ode equations. Could you please help me? Thanks a lot! Mike