I'm writing a class to generalize solving differential equations.
However, I'm getting an error I don't think should be happening. My
class looks as follows
|classDynSys{public:DynSys(constsize_tsize,doublestartTime,doubleendTime,doublestepSize,double*iState,int(*func)(double,constdouble*,double*,void*),int(*jac)(double,constdouble*,double*,double*,void*),constgsl_odeiv2_step_type*T
=gsl_odeiv2_step_rk8pd):T(T),size(size),t(startTime),t1(endTime),h(stepSize){y
=newdouble[size];y =iState;yPrev =newdouble[size];s
=gsl_odeiv2_step_alloc(T,size);c
=gsl_odeiv2_control_y_new(1e-6,0.0);e
=gsl_odeiv2_evolve_alloc(size);sys
={func,jac,size,0};}~DynSys(){delete[]y;delete[]yPrev;gsl_odeiv2_evolve_free(e);gsl_odeiv2_control_free(c);gsl_odeiv2_step_free(s);}voidstep(){printf("e
dim: %ld\n",e->dimension);printf("s dim:
%ld\n",s->dimension);printf("y: %.5f %.5f %.5f %.5f %.5f
%.5f\n",y[0],y[1],y[2],y[3],y[4],y[5]);tPrev =t;yPrev
=std::copy(y,y+size,yPrev);intstatus
=gsl_odeiv2_evolve_apply_fixed_step(e,c,s,&sys,&t,h,y);if(status
!=GSL_SUCCESS){printf("Error:
%s\n",gsl_strerror(status));throwstd::logic_error(gsl_strerror(status));}}doublegetT(){returnt;}voidsetY(double*y){y
=y;}private:constgsl_odeiv2_step_type*T;gsl_odeiv2_step*s;gsl_odeiv2_control*c;gsl_odeiv2_evolve*e;gsl_odeiv2_system
sys;constsize_tsize;doublet;doublet1;doubleh;double*y;doubletPrev;double*yPrev;};
|
||
||And in my test code for stepping
|intmain(){doublestate[]={1.0,0.0,0.0,0.796975,0.11637,0.0185312};constsize_tsize
=6;DynSyssystem(size,0.0,40.0,1e-3,state,func,jac);system.step();printf("t:
%.5f\n",system.getT());system.step();printf("t:
%.5f\n",system.getT());return0;}|
I get the error that the "step dimension must match the evolution size."
But based on my initialization and the output of the code when run, the
step dimension matches the evolution size. Any help on understanding
what's happening is appreciated.
||
--
Bo Johnson
(801) 503-2043