Beispiel #1
0
void RK4_step(double delta_t, double t, double *x, double *v){
  double k1, k2, k3, k4;
  double l1, l2, l3, l4;
  double x_in;
  double v_in;
  x_in = *x;
  v_in = *v;

  k1 = deriv_x(t,x_in,v_in);  
  l1 = deriv_v(t,x_in,v_in);  

  k2 = deriv_x(t + delta_t*0.5, x_in + k1*delta_t*0.5, v_in + l1*delta_t*0.5);
  l2 = deriv_v(t + delta_t*0.5, x_in + k1*delta_t*0.5, v_in + l1*delta_t*0.5) ;

  k3 = deriv_x(t + delta_t*0.5, x_in + k2*delta_t*0.5, v_in + l2*delta_t*0.5);
  l3 = deriv_v(t + delta_t*0.5, x_in + k2*delta_t*0.5, v_in + l2*delta_t*0.5);

  k4 = deriv_x(t + delta_t, x_in + k3*delta_t, v_in + l3*delta_t);
  l4 = deriv_v(t + delta_t, x_in + k3*delta_t, v_in + l3*delta_t);

  x_in += (k1/6.0 + k2/3.0 + k3/3.0 + k4/6.0)*delta_t;
  v_in += (l1/6.0 + l2/3.0 + l3/3.0 + l4/6.0)*delta_t;

  *x = x_in;
  *v = v_in;
}
Beispiel #2
0
void leapfrog_step(double delta_t, double t, double *x, double *v){
  double x_in;
  double v_in;
  x_in = *x;
  v_in = *v;
  
  /*Third order*/
  x_in += 1.0 * v_in * delta_t;
  v_in += -1.0/24.0 * deriv_v(t, x_in, v_in) * delta_t;
  
  x_in += -2.0/3.0 * v_in * delta_t;
  v_in += 3.0/4.0 * deriv_v(t, x_in, v_in) * delta_t;

  x_in += 2.0/3.0 * v_in * delta_t;
  v_in += 7.0/24.0 * deriv_v(t, x_in, v_in) * delta_t;

  /*Inverted
  x_in += 0.5 * v_in * delta_t;
  v_in += 1.0 * deriv_v(t, x_in, v_in) * delta_t;
  x_in += 0.5 * v_in * delta_t;
  */

  /*Normal
  v_in += 0.5 * deriv_v(t, x_in, v_in) * delta_t;
  x_in += 1.0 * v_in * delta_t;
  v_in += 0.5 * deriv_v(t, x_in, v_in) * delta_t;
  */

  *x = x_in;
  *v = v_in;
}
void leapfrog_step(double delta_t, double t, double *x, double *v){
  double x_in;
  double v_in;
  x_in = *x;
  v_in = *v;

v_in += 1.0 * deriv_v(t,x_in,v_in) * delta_t;
x_in += -1.0/24.0 * v_in * delta_t;

v_in += -2.0/3.0 * deriv_v(t,x_in,v_in) * delta_t;
x_in += 3.0/4.0 * v_in * delta_t;

v_in += 2.0/3.0 * deriv_v(t,x_in,v_in) * delta_t;
x_in += 7.0/24.0 * v_in * delta_t;


  /*kick*/
//  v_in += 0.5 * deriv_v(t,x_in,v_in) * delta_t;
  /*drift*/
//  x_in += 1.0 * v_in * delta_t;
  /*kick*/
//  v_in += 0.5 * deriv_v(t, x_in, v_in) * delta_t;


  *x = x_in;
  *v = v_in;
}
Beispiel #4
0
void RK4_step(double delta_t, double e, double t, double *x, double *v,double *x3,double *v3){
  double k1, k2, k3, k4;
  double l1, l2, l3, l4;
  double m1, m2, m3, m4;
  double n1, n2, n3, n4;
  double x_in;
  double v_in;
  double x3_in;
  double v3_in;
  x_in = *x;
  v_in = *v;
  x3_in = *x3;
  v3_in = *v3;

  k1 = deriv_x(t,x_in,v_in);  
  l1 = deriv_v(t,x_in,v_in,e);  

  k2 = deriv_x(t + delta_t*0.5, x_in + k1*delta_t*0.5, v_in + l1*delta_t*0.5);
  l2 = deriv_v(t + delta_t*0.5, x_in + k1*delta_t*0.5, v_in + l1*delta_t*0.5,e) ;

  k3 = deriv_x(t + delta_t*0.5, x_in + k2*delta_t*0.5, v_in + l2*delta_t*0.5);
  l3 = deriv_v(t + delta_t*0.5, x_in + k2*delta_t*0.5, v_in + l2*delta_t*0.5,e);

  k4 = deriv_x(t + delta_t, x_in + k3*delta_t, v_in + l3*delta_t);
  l4 = deriv_v(t + delta_t, x_in + k3*delta_t, v_in + l3*delta_t,e);

  x_in += (k1/6.0 + k2/3.0 + k3/3.0 + k4/6.0)*delta_t;
  v_in += (l1/6.0 + l2/3.0 + l3/3.0 + l4/6.0)*delta_t;
  
  m1 = deriv_x3(t,x3_in,v3_in);  
  n1 = deriv_v3(t,x3_in,x_in,v_in,e);  

  m2 = deriv_x3(t + delta_t*0.5, x3_in + m1*delta_t*0.5, v3_in + n1*delta_t*0.5);
  n2 = deriv_v3(t + delta_t*0.5, x3_in + m1*delta_t*0.5, x_in + k1*delta_t*0.5, v_in + l1*delta_t*0.5,e) ;

  m3 = deriv_x3(t + delta_t*0.5, x3_in + m2*delta_t*0.5, v3_in + n2*delta_t*0.5);
  n3 = deriv_v3(t + delta_t*0.5, x3_in + m2*delta_t*0.5, x_in + k2*delta_t*0.5, v_in + l2*delta_t*0.5,e);

  m4 = deriv_x3(t + delta_t, x3_in + m3*delta_t, v3_in + n3*delta_t);
  n4 = deriv_v3(t + delta_t, x3_in + m3*delta_t, x_in + k3*delta_t, v_in + l3*delta_t,e);

  x3_in += (m1/6.0 + m2/3.0 + m3/3.0 + m4/6.0)*delta_t;
  v3_in += (n1/6.0 + n2/3.0 + n3/3.0 + n4/6.0)*delta_t;  

  *x = x_in;
  *v = v_in;
  *x3 = x3_in;
  *v3 = v3_in;
}
Beispiel #5
0
void leapfrog_step(double delta_t,double e, double t, double *x, double *v,double *x3,double *v3){
  double x_in,x3_in;
  double v_in,v3_in;
  x_in = *x;
  v_in = *v;
  x3_in=*x3;
  v3_in=*v3;

  x_in += 1/(2*(2-pow(2,1/3)))* v_in * delta_t;
  v_in += 1/(2-pow(2,1/3)) * deriv_v(t,x_in,v_in,e) * delta_t;
  x_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * v_in * delta_t;
  v_in += -pow(2,1/3)/(2-pow(2,1/3)) * deriv_v(t, x_in, v_in,e) * delta_t;
  x_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * v_in * delta_t;
  v_in += 1/(2-pow(2,1/3)) * deriv_v(t, x_in, v_in,e) * delta_t;
  x_in += 1/(2*(2-pow(2,1/3))) * v_in * delta_t;
  
  x3_in += 1/(2*(2-pow(2,1/3))) * v3_in * delta_t;
  v3_in += 1/(2-pow(2,1/3)) * deriv_v3(t,x3_in,x_in,v_in,e) * delta_t;
  x3_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * v3_in * delta_t;
  v3_in += -pow(2,1/3)/(2-pow(2,1/3)) * deriv_v3(t, x3_in,x_in, v_in,e) * delta_t;
  x3_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * v3_in * delta_t;
  v3_in += 1/(2-pow(2,1/3)) * deriv_v3(t,x3_in,x_in,v_in,e) * delta_t;
  x3_in += 1/(2*(2-pow(2,1/3))) * v3_in * delta_t;

  
  /*v_in += 1/(2*(2-pow(2,1/3)))* deriv_v(t,x_in,v_in,e) * delta_t;
  x_in += 1/(2-pow(2,1/3))  * v_in * delta_t;
  v_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * deriv_v(t, x_in, v_in,e) * delta_t;
  x_in += -pow(2,1/3)/(2-pow(2,1/3)) * v_in * delta_t;
  v_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * deriv_v(t, x_in, v_in,e) * delta_t;
  x_in += 1/(2-pow(2,1/3)) * v_in * delta_t;
  v_in += 1/(2*(2-pow(2,1/3)))* deriv_v(t, x_in, v_in,e) * delta_t;

  v3_in += 1/(2*(2-pow(2,1/3))) * deriv_v3(t,x3_in,x_in,v_in,e) * delta_t;
  x3_in += 1/(2-pow(2,1/3)) * v3_in * delta_t;
  v3_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * deriv_v3(t, x3_in,x_in, v_in,e) * delta_t;
  x3_in += -pow(2,1/3)/(2-pow(2,1/3)) * v3_in * delta_t;
  v3_in += (1-pow(2,1/3))/(2*(2-pow(2,1/3))) * deriv_v3(t,x3_in,x_in,v_in,e) * delta_t;
  x3_in += 1/(2-pow(2,1/3)) * v3_in * delta_t;
  v3_in += 1/(2*(2-pow(2,1/3))) * deriv_v3(t,x3_in,x_in,v_in,e) * delta_t;*/

  *x = x_in;
  *v = v_in;
  *x3=x3_in;
  *v3=v3_in;
}
/* for findSplit */
void AzReg_TsrSib::reset_forNewLeaf(const AzTrTree_ReadOnly *inp_tree, 
                            const AzRegDepth *inp_reg_depth)
{
  tree = inp_tree; 
  forNewLeaf = true; 
  focus_nx = -1; 
  reg_depth = inp_reg_depth; 

  int node_num = tree->nodeNum(); 

  /*---  set v  ---*/
  v_v.reform(node_num); 
  int nx; 
  for (nx = 0; nx < node_num; ++nx) {
    if (!tree->node(nx)->isLeaf()) continue; 

    deriv_v(tree, nx, false, NULL, &v_v); 
  }
  reset_values(); 
}
/* for findSplit */
void AzReg_TsrSib::reset_forNewLeaf(int inp_focus_nx, 
                            const AzTrTree_ReadOnly *inp_tree, 
                            const AzRegDepth *inp_reg_depth)
{
  tree = inp_tree; 
  forNewLeaf = true; 
  focus_nx = inp_focus_nx; 
  reg_depth = inp_reg_depth; 

  int node_num = tree->nodeNum(); 

  /*---  set derivatives w.r.t. the weight of the new leaf  ---*/
  av_dv.reset(node_num); 
  AzSvect *v_dv = av_dv.point_u(focus_nx); 
  deriv_v(tree, focus_nx, forNewLeaf, v_dv, NULL); 
  if (v_v.rowNum() != node_num) {
    throw new AzException("AzReg_TsrSib::sib_reset_forNewLeaf", 
                          "v_v is not initialized"); 
  }
  update(); 
}
/* for optimization */
void AzReg_TsrSib::reset(const AzTrTree_ReadOnly *inp_tree, 
                         const AzRegDepth *inp_reg_depth)
{
  tree = inp_tree; 
  forNewLeaf = false; 
  focus_nx = -1; 
  reg_depth = inp_reg_depth; 

  if (tree == NULL) {
    throw new AzException("AzReg_TsrSib::reset", "null tree"); 
  }

  int node_num = tree->nodeNum(); 
  av_dv.reset(node_num);  
  v_v.reform(node_num);  
 
  int nx; 
  for (nx = 0; nx < node_num; ++nx) {
    if (!tree->node(nx)->isLeaf()) continue; 

    deriv_v(tree, nx, false, av_dv.point_u(nx), &v_v); 
  }
  reset_values(); 
}