This is the mail archive of the gsl-discuss@sourceware.org mailing list for the GSL project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Help! Questions for the developers of GSL ODE: Complex-valued ODEs and the "jac" function in GSL ODE solver?


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]