help-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-gsl] problem


From: caoj
Subject: Re: [Help-gsl] problem
Date: Thu, 25 Aug 2005 15:33:31 -0500
User-agent: Internet Messaging Program (IMP) 3.2-cvs

I realize that when some of paramter(in the ODE functions) are negative, the 
infinite loop happens. When I keep all paramters(in the ODE functions) to be 
nonegative, this situation can not happen. 

By the way, when I change the step function into gsl_odeiv_step_gear1 or 
others, I get the same results.

Thanks all for your suggestions.


Jun Cao


Quoting Tommy Nordgren <address@hidden>:

> I've looked at the function It have about 90 independent variables,  
> and contains some nonelinear terms.
> The problem is probably stiff. That' when a diff eqn have particular  
> solutions thats varying on vastly differnt
> scale. When that happens, Runge-Kutta have to reduce the step size to  
> the shortest scale on which any
> particular solution vary, or suffer a disastrous loss of precision.
> Stiff equations require special methods for stepping, such as  
> Buerlich-Stoer. There is an implementation of it in GSL
> Aug 24, 2005 kl. 7:55 PM skrev address@hidden:
> 
> > Thanks a lot. Attached is my function.
> >
> > Jun Cao
> >
> >
> >
> > Quoting Pau Cervera Badia <address@hidden>:
> >
> >
> >> I think it means that gsl_odeiv_evolve_apply is trying to adjust h to
> >> obtain the prescribed presicion in the integration of the  
> >> equations, but
> >> the step-size value seems too large to obtain that precision, so the
> >> routine chooses a smaller step (see [1]). It seems like if one or  
> >> more
> >> of your variables or derivatives is unboundedly growing, so your
> >> solutions are diverging, but I'm not sure if it is the only reason
> >> because I don't know you're equations.
> >>
> >> Maybe you can post your *func* function and we can take a look.
> >>
> >> [1] http://www.gnu.org/software/gsl/manual/gsl-ref_25.html#SEC384
> >>
> >> address@hidden wrote:
> >>
> >>
> >>> Hi Pau Cervera Badia:
> >>>
> >>> I check h. I found that h is becoming smaller and smaller and  
> >>> finally get to
> >>>
> >>
> >>
> >>> 0.0. What does it mean? Does it mean my program is wrong? Thanks  
> >>> again.
> >>>
> >>> Jun Cao
> >>>
> >>>
> >>> Quoting Pau Cervera Badia <address@hidden>:
> >>>
> >>>
> >>>
> >>>
> >>>> Maybe is changing only a little.
> >>>> Can you monitor the h values, something as
> >>>>
> >>>> while (t < t1) {
> >>>>
> >>>>    int status = gsl_odeiv_evolve_apply(e,c,s,&sys,&t,t1,&h,y);
> >>>>
> >>>>    printf("%.5e %.5e %.5e\n", t, t1, h);
> >>>>
> >>>>    if (status != GSL_SUCCESS)
> >>>>       break;
> >>>>
> >>>> }
> >>>>
> >>>> will do. If h is becoming smaller and smaller, something wrong is
> >>>>
> >> happening
> >>
> >>>> (maybe your ecuations are diverging somewhere).
> >>>>
> >>>>
> >>>> address@hidden wrote:
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>> Hi Pau Cervera Badia:
> >>>>>
> >>>>> Thank you for your response. I check my program again. It stuck in
> >>>>>
> >>>>>
> >>>>>
> >>>> t=5.790250,
> >>>>
> >>>>
> >>>>
> >>>>> t1=6.467000.  After gsl_odeiv_evolve_apply, t always is  
> >>>>> 5.790250 and does
> >>>>>
> >>>>>
> >>>>>
> >>>> not
> >>>>
> >>>>
> >>>>
> >>>>> change. So the program stuck in the "while" loop. I try to  
> >>>>> change h to
> >>>>>
> >> 1e-2
> >>
> >>>>>
> >>>>>
> >>>>>
> >>>> and
> >>>>
> >>>>
> >>>>
> >>>>> 1e-10. I get the same result. Do you have anoter idea? Thanks  
> >>>>> again.
> >>>>>
> >>>>> Jun Cao
> >>>>>
> >>>>>
> >>>>> Quoting Pau Cervera Badia <address@hidden>:
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>> gsl_odeiv_evolve_apply(e,c,s,&sys,&t,t1,&h,y) will advance  
> >>>>>> from time t
> >>>>>> to the next integration time with an optimum step-size,  
> >>>>>> provided that
> >>>>>> the next time is less than t1. Otherwise it will integrate the  
> >>>>>> system to
> >>>>>>
> >>
> >>
> >>>>>> t1 exactly. So after some iterations the while condition will  
> >>>>>> be false.
> >>>>>>
> >>>>>> You can check that gsl_odeiv_evolve_apply is running properly  
> >>>>>> with:
> >>>>>>
> >>>>>> while (t < t1) {
> >>>>>>
> >>>>>>   int status = gsl_odeiv_evolve_apply(e,c,s,&sys,&t,t1,&h,y);
> >>>>>>
> >>>>>>   printf("%.5e %.5e\n", t, t1); // this should print t less  
> >>>>>> than t1
> >>>>>>
> >>>>>>   if (status != GSL_SUCCESS)
> >>>>>>      break;
> >>>>>>
> >>>>>> }
> >>>>>> printf("%.5e %.5e\n",t,t1); // this should print t equal to t1
> >>>>>>
> >>>>>> If I'm not missing something, your program should work. Maybe the
> >>>>>> problem is that t is always less than t1 for some other reason  
> >>>>>> (maybe
> >>>>>> the routine couldn't reach the prescribed precision and
> >>>>>> gsl_odeiv_evolve_apply is trying to reduce the step-size more  
> >>>>>> and more).
> >>>>>>
> >>
> >>
> >>>>>> Maybe you can check the h values.
> >>>>>>
> >>>>>> Maybe something will be of any help.
> >>>>>>
> >>>>>> address@hidden wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> Hi:
> >>>>>>>
> >>>>>>> I use ordinary differential equations from GSL. The part of  
> >>>>>>> my program
> >>>>>>>
> >> is
> >>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>> like
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> example shown in the document.
> >>>>>>>
> >>>>>>> const gsl_odeiv_step_type * T
> >>>>>>>  = gsl_odeiv_step_rk8pd;
> >>>>>>>
> >>>>>>> gsl_odeiv_step * s
> >>>>>>>  = gsl_odeiv_step_alloc (T, 9);
> >>>>>>> gsl_odeiv_control * c
> >>>>>>>  = gsl_odeiv_control_y_new (1e-6, 0.0);
> >>>>>>> gsl_odeiv_evolve * e
> >>>>>>>  = gsl_odeiv_evolve_alloc (9);
> >>>>>>>
> >>>>>>> double mu = 10;
> >>>>>>> gsl_odeiv_system sys = {func, NULL, 9, &mu};
> >>>>>>>
> >>>>>>> double t = 0.0;
> >>>>>>> double h = 1e-6;
> >>>>>>>
> >>>>>>> for (i = 1; i <no_of_data_points; i++) {
> >>>>>>>   t1 = mytable[i];
> >>>>>>>   while (t < t1)
> >>>>>>>   {
> >>>>>>>      int status = gsl_odeiv_evolve_apply (e, c, s,
> >>>>>>>                                         &sys,
> >>>>>>>                                         &t, t1,
> >>>>>>>                                         &h, y);
> >>>>>>>
> >>>>>>>    if (status != GSL_SUCCESS)
> >>>>>>>        break;
> >>>>>>>    }
> >>>>>>>    ...
> >>>>>>> }
> >>>>>>> gsl_odeiv_evolve_free (e);
> >>>>>>> gsl_odeiv_control_free (c);
> >>>>>>> gsl_odeiv_step_free (s);
> >>>>>>>
> >>>>>>> The weird thing is that at some i, the program stuck inside  
> >>>>>>> of "while"
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>> loop
> >>>>
> >>>>
> >>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>> and
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> never come out. gsl_odeiv_evolve_apply will give t=t, so t is  
> >>>>>>> always <
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>> t1.
> >>>>
> >>>>
> >>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>> As
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> result the program never stop. Dose anyone know how to solve  
> >>>>>>> this
> >>>>>>>
> >> problem?
> >>
> >>>>>>>
> >>>>>>>
> >>>>>>> Thanks.
> >>>>>>>
> >>>>>>> Jun Cao
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> _______________________________________________
> >>>>>>> Help-gsl mailing list
> >>>>>>> address@hidden
> >>>>>>> http://lists.gnu.org/mailman/listinfo/help-gsl
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>> -- 
> >>>>>> Pau Cervera i Badia (e-mail address@hidden)
> >>>>>> {
> >>>>>>  Departament de Física Fonamental                 Martí i  
> >>>>>> Franqués, 1
> >>>>>>  Universitat de Barcelona                   Planta 3, despatx  
> >>>>>> 346 bis
> >>>>>>                                                       08028  
> >>>>>> Barcelona
> >>>>>>  tel: +34 934 921  
> >>>>>> 155                                           Spain
> >>>>>>
> >>>>>>  "To err is human, but to really foul things up requires a  
> >>>>>> computer."
> >>>>>> }
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>> -- 
> >>>> Pau Cervera i Badia (e-mail address@hidden)
> >>>> {
> >>>>   Departament de Física Fonamental                 Martí i  
> >>>> Franqués, 1
> >>>>   Universitat de Barcelona                   Planta 3, despatx  
> >>>> 346 bis
> >>>>                                                        08028  
> >>>> Barcelona
> >>>>   tel: +34 934 921 155                                            
> >>>> Spain
> >>>>
> >>>>   "To err is human, but to really foul things up requires a  
> >>>> computer."
> >>>> }
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>
> >>
> >> -- 
> >> Pau Cervera i Badia (e-mail address@hidden)
> >> {
> >>    Departament de Física Fonamental                 Martí i  
> >> Franqués, 1
> >>    Universitat de Barcelona                   Planta 3, despatx  
> >> 346 bis
> >>                                                         08028  
> >> Barcelona
> >>    tel: +34 934 921 155                                            
> >> Spain
> >>
> >>    "To err is human, but to really foul things up requires a  
> >> computer."
> >> }
> >>
> >>
> >>
> >>
> >
> >
> >
> > <ode_fcn.c>
> > _______________________________________________
> > Help-gsl mailing list
> > address@hidden
> > http://lists.gnu.org/mailman/listinfo/help-gsl
> >
> 
> "Home is not where you are born, but where your heart finds peace" -
> Tommy Nordgren, "The dying old crone"
> 
> 
> 







reply via email to

[Prev in Thread] Current Thread [Next in Thread]