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

Tommy Nordgren tommy.nordgren@comhem.se
Sun Jun 3 11:50:00 GMT 2007


On 3 jun 2007, at 10.18, Michael wrote:

> 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?
>

	The jac function in this case, is what is more specifically called  
the hessian:
In pseudo math notation:    with <y'> = <f(<y>>,
jac [i][j] = df[i] / d[y[i]

> 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

------
What is a woman that you forsake her, and the hearth fire and the  
home acre,
to go with the old grey Widow Maker.  --Kipling, harp song of the  
Dane women
Tommy Nordgren
tommy.nordgren@comhem.se





More information about the Gsl-discuss mailing list