예제 #1
0
파일: varH.c 프로젝트: shivupa/VarHy
void variational_H(){
  /* Fill matricies */
  read_basis();
  printf("CALCULATING MATRIX ELEMENTS\n");
  gsl_matrix *coefficents = gsl_matrix_alloc (num_eigenvalues, num_eigenvalues);
  gsl_vector *energy = gsl_vector_alloc (num_eigenvalues);
  for(char i=num_eigenvalues;i>=0;i--){
    for(char j=num_eigenvalues;j>=i;j--){
      overlap[num_eigenvalues*i + j] = overlap_elem(i,j);
      overlap[num_eigenvalues*j + i] = overlap[num_eigenvalues*i + j];
      hamiltonian[num_eigenvalues*i + j] = hamiltonian_elem(i,j);
      hamiltonian[num_eigenvalues*j + i] = hamiltonian[num_eigenvalues*i + j];
    }
  }
  printf("DIAGONALIZING MATRIX\n");
  gsl_matrix_view s = gsl_matrix_view_array (overlap, 4, 4);
  gsl_matrix_view h = gsl_matrix_view_array (hamiltonian, 4, 4);
  gsl_eigen_gensymmv_workspace * eigen_sys = gsl_eigen_gensymmv_alloc(num_eigenvalues);
  gsl_eigen_gensymmv(&h.matrix, &s.matrix, energy, coefficents, eigen_sys);
  gsl_eigen_gensymmv_free(eigen_sys);
  gsl_eigen_gensymmv_sort(energy, coefficents, GSL_EIGEN_SORT_VAL_DESC);
  printf("DONE!\n");
  printf("OUTPUT:\n");
  for(char i=num_eigenvalues-1;i>=0;i--){
    double energy_i = gsl_vector_get (energy, i);
      printf("Energy level %d = %g\n", abs(i-num_eigenvalues) , energy_i);
  }
  printf("Coefficent Matrix for plotting\n");
  for(char i=num_eigenvalues-1;i>=0;i--){
    for(char j=num_eigenvalues-1;j>=0;j--){
        printf("%g\t", gsl_matrix_get(coefficents,i,j));
    }
    printf("\n");
  }
}
예제 #2
0
int
main (void)
{
  double a[] = { 0.11, 0.12, 0.13,
                 0.21, 0.22, 0.23 };

  double b[] = { 1011, 1012,
                 1021, 1022,
                 1031, 1032 };

  double c[] = { 0.00, 0.00,
                 0.00, 0.00 };

  gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3);
  gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2);
  gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2);

  /* Compute C = A B */

  gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
                  1.0, &A.matrix, &B.matrix,
                  0.0, &C.matrix);

  printf ("[ %g, %g\n", c[0], c[1]);
  printf ("  %g, %g ]\n", c[2], c[3]);

  return 0;  
}
예제 #3
0
void GICPOptimizer::compute_dr(gsl_vector const* x, gsl_matrix const* gsl_temp_mat_r, gsl_vector *g) 
{
  double dR_dPhi[3][3];
  double dR_dTheta[3][3];
  double dR_dPsi[3][3];
  gsl_matrix_view gsl_d_rx = gsl_matrix_view_array(&dR_dPhi[0][0],3, 3);
  gsl_matrix_view gsl_d_ry = gsl_matrix_view_array(&dR_dTheta[0][0],3, 3);
  gsl_matrix_view gsl_d_rz = gsl_matrix_view_array(&dR_dPsi[0][0],3, 3);

  double phi = gsl_vector_get(x ,3);
  double theta = gsl_vector_get(x ,4);
  double psi = gsl_vector_get(x ,5);
  
  double cphi = cos(phi), sphi = sin(phi);
  double ctheta = cos(theta), stheta = sin(theta);
  double cpsi = cos(psi), spsi = sin(psi);
  
  dR_dPhi[0][0] = 0.;
  dR_dPhi[1][0] = 0.;
  dR_dPhi[2][0] = 0.;
  
  dR_dPhi[0][1] = sphi*spsi + cphi*cpsi*stheta;
  dR_dPhi[1][1] = -cpsi*sphi + cphi*spsi*stheta;
  dR_dPhi[2][1] = cphi*ctheta;
  
  dR_dPhi[0][2] = cphi*spsi - cpsi*sphi*stheta;
  dR_dPhi[1][2] = -cphi*cpsi - sphi*spsi*stheta;
  dR_dPhi[2][2] = -ctheta*sphi;
  
  dR_dTheta[0][0] = -cpsi*stheta;
  dR_dTheta[1][0] = -spsi*stheta;
  dR_dTheta[2][0] = -ctheta;
  
  dR_dTheta[0][1] = cpsi*ctheta*sphi;
  dR_dTheta[1][1] = ctheta*sphi*spsi;
  dR_dTheta[2][1] = -sphi*stheta;

  dR_dTheta[0][2] = cphi*cpsi*ctheta;
  dR_dTheta[1][2] = cphi*ctheta*spsi;
  dR_dTheta[2][2] = -cphi*stheta;
  
  dR_dPsi[0][0] = -ctheta*spsi;
  dR_dPsi[1][0] = cpsi*ctheta;
  dR_dPsi[2][0] = 0.;
  
  dR_dPsi[0][1] = -cphi*cpsi - sphi*spsi*stheta;
  dR_dPsi[1][1] = -cphi*spsi + cpsi*sphi*stheta;
  dR_dPsi[2][1] = 0.;
  
  dR_dPsi[0][2] = cpsi*sphi - cphi*spsi*stheta;
  dR_dPsi[1][2] = sphi*spsi + cphi*cpsi*stheta;
  dR_dPsi[2][2] = 0.;
  
  // set d/d_rx = tr(dR_dPhi'*gsl_temp_mat_r) [= <dR_dPhi, gsl_temp_mat_r>]
  gsl_vector_set(g, 3, mat_inner_prod(&gsl_d_rx.matrix, gsl_temp_mat_r));
  // set d/d_ry = tr(dR_dTheta'*gsl_temp_mat_r) = [<dR_dTheta, gsl_temp_mat_r>]
  gsl_vector_set(g, 4, mat_inner_prod(&gsl_d_ry.matrix, gsl_temp_mat_r));
  // set d/d_rz = tr(dR_dPsi'*gsl_temp_mat_r) = [<dR_dPsi, gsl_temp_mat_r>]
  gsl_vector_set(g, 5, mat_inner_prod(&gsl_d_rz.matrix, gsl_temp_mat_r));      
}
예제 #4
0
/* Copy variables from the previous sample in the RMHMC working storage to make 
 * space for the new proposal.
 * Arguments:
 *  state:		a pointer to internal working storage for RMHMC.
 *	kernel:	    a pointer to the RMHMC kernel data structure.
 *  Result:
 *	 returns zero for success and non-zero for failure.
 */
static int copyStateVariables(rmhmc_params* state, mcmc_kernel* kernel){
	int N = kernel->N;
	gsl_vector_view p_v = gsl_vector_view_array(state->momentum, N);
	gsl_vector_view new_p_v = gsl_vector_view_array(state->new_momentum, N);
	gsl_vector_memcpy(&new_p_v.vector, &p_v.vector);
	
	gsl_vector_view x_v = gsl_vector_view_array(kernel->x, N);
	gsl_vector_view new_x_v = gsl_vector_view_array(state->new_x, N);
	gsl_vector_memcpy(&new_x_v.vector, &x_v.vector);
	
	gsl_vector_view dfx_v = gsl_vector_view_array(state->dfx, N);
	gsl_vector_view new_dfx_v = gsl_vector_view_array(state->new_dfx, N);
	gsl_vector_memcpy(&new_dfx_v.vector, &dfx_v.vector);
		
	gsl_matrix_view invM_v = gsl_matrix_view_array(state->invMx, N, N);
	gsl_matrix_view new_invM_v = gsl_matrix_view_array(state->new_invMx, N, N);
	gsl_matrix_memcpy(&new_invM_v.matrix, &invM_v.matrix);
	
	int i;
	for(i = 0; i < N*N*N; i++){ 
		state->new_dMx[i]  = state->dMx[i];
	}
	
	return 0;
}
예제 #5
0
/* Update momentum variables using an implicit solver for
 * equation (16) of Girolami and Calderhead (2011).
 * Arguments:
 *	state:		a pointer to internal working storage for RMHMC.
 *  p0:			current value of momentum parameters.
 *  iterations:	number of fixed point iterations. For iterations=1 then the function is 
 *				equivalent to the explicit solver for equation (18) of Girolami and Calderhead (2011).
 *	N:			number of parameters.
 *	stepSize:	integration step-size.
 *  Result:
 *	 The method directly updates the new_momentum array in the state structure.
 *	 returns number of iterations succussefuly completed.
 */
static int momentumNewtonUpdate(rmhmc_params* state, double* p0, int iterations, int N, double stepSize){
	
	gsl_vector_view new_p_v = gsl_vector_view_array(state->new_momentum, N);
	gsl_matrix_view new_invM_v = gsl_matrix_view_array(state->new_invMx, N, N);
	gsl_vector_view a_v = gsl_vector_view_array(state->atmp, N);
	gsl_vector_view b_v = gsl_vector_view_array(state->btmp, N);
	
	/* update trace terms */
	calculateTraceTerms(N, state->new_invMx, state->new_dMx, state->tr_invM_dM);
	
	int i,d;
	for (i = 0; i < iterations; i++) {
		
		/* a = invM*pNew; */
		gsl_blas_dgemv(CblasNoTrans, 1.0, &new_invM_v.matrix, &new_p_v.vector, 0.0, &a_v.vector);
		
		for (d = 0; d < N; d++) {
			gsl_matrix_view dMx_dv = gsl_matrix_view_array(&(state->new_dMx[d*N*N]), N,N);
			
			/* b =  dM/dx_n * invM*pNew  = dM/dx_n * a  */
			gsl_blas_dgemv (CblasNoTrans, 1.0, &dMx_dv.matrix, &a_v.vector, 0.0, &b_v.vector);
			
			/*p_update =  pNew^T*invM * dM/dx_n * invM*pNew = a^T * b  */
			double p_update = 0;
			gsl_blas_ddot(&a_v.vector, &b_v.vector, &p_update);
			
			p_update = p0[d] + 0.5*stepSize*( 0.5*p_update + state->new_dfx[d] - 0.5*state->tr_invM_dM[d] );
			state->new_momentum[d] = p_update;
		}
	}

	return i;
}
예제 #6
0
/* Update parameters using an implicit solver for
 * equation (17) of Girolami and Calderhead (2011).
 * Arguments:
 *	state:		a pointer to internal working storage for RMHMC.
 *  model:		a pointer to the rmhmc_model structure with pointers to user defined functions.
 *	N:			number of parameters.
 *	stepSize:	integration step-size.
 *  Result:
 *	 The method directly updates the new_x array in the state structure.
 *	 returns 0 for success or non-zero for failure.
 */
static int parametersNewtonUpdate(rmhmc_params* state, rmhmc_model* model, int N , double stepSize){
	
	gsl_vector_view new_x_v = gsl_vector_view_array(state->new_x, N);
	gsl_vector_view new_p_v = gsl_vector_view_array(state->new_momentum, N);
	gsl_matrix_view new_cholM_v = gsl_matrix_view_array(state->new_cholMx, N, N);
	
	/* temp copy of parameters */
	gsl_vector_view x0_v = gsl_vector_view_array(state->btmp, N);
	gsl_vector_memcpy(&x0_v.vector, &new_x_v.vector);
	
	/* temp copy of inverse Metric */
	gsl_matrix_view new_invM_v = gsl_matrix_view_array(state->new_invMx, N, N);
	gsl_matrix_view invM0_v = gsl_matrix_view_array(state->tmpM, N, N);
	gsl_matrix_memcpy(&invM0_v.matrix, &new_invM_v.matrix);
	
	gsl_vector_view a_v = gsl_vector_view_array(state->atmp, N);

	/* a = invM0*pNew */
	/* TODO: replace gsl_blas_dgemv with gsl_blas_dsymv since invM0_v.matrix is symetric */
	gsl_blas_dgemv(CblasNoTrans, 1.0, &invM0_v.matrix, &new_p_v.vector, 0.0, &a_v.vector);
	
	int iterations = state->fIt;
	int flag = 0;
	int i;
	for (i = 0; i < iterations; i++) {
		/* new_x = invM_new*p_new */
		/* TODO: replace gsl_blas_dgemv with gsl_blas_dsymv since inew_invM_v.matrix is symetric */
		gsl_blas_dgemv(CblasNoTrans, 1.0, &new_invM_v.matrix, &new_p_v.vector, 0.0, &new_x_v.vector);
		
		/* Calculates new_x_v = x0 + 0.5*stepSize*(invM_0*newP + newInvM*newP) */
		gsl_vector_add(&new_x_v.vector, &a_v.vector);
		gsl_vector_scale(&new_x_v.vector, 0.5*stepSize);
		gsl_vector_add(&new_x_v.vector, &x0_v.vector);
		
		/* calculate metric at the current position or update everything if this is the last iteration */
		if ( (i == iterations-1) )
			/* call user defined function for updating all quantities */
			model->PosteriorAll(state->new_x, model->m_params, &state->new_fx, state->new_dfx, state->new_cholMx, state->new_dMx);
		else
			/* call user defined function for updating only the metric ternsor */
			model->Metric(state->new_x, model->m_params, state->new_cholMx);
		
		/* calculate cholesky factor for current metric */
		gsl_error_handler_t* old_handle =  gsl_set_error_handler_off();
		flag = gsl_linalg_cholesky_decomp( &new_cholM_v.matrix );
		if (flag != 0){
			fprintf(stderr,"RMHMC: matrix not positive definite in parametersNewtonUpdate.\n");
			return flag;
		}
		gsl_set_error_handler(old_handle);
		
		/* calculate inverse for current metric */
		gsl_matrix_memcpy(&new_invM_v.matrix, &new_cholM_v.matrix );
		gsl_linalg_cholesky_invert(&new_invM_v.matrix);
	}
	return flag;
	
}
예제 #7
0
/*assumes we have a "coded" QR decomposition (a,tau) of the original matrix*/
inline void qr_decomp(double* a, double* tau, double* q, double* r,int m,int n){
	gsl_matrix_view qv=gsl_matrix_view_array(q,m,m);
	gsl_matrix_view rv=gsl_matrix_view_array(r,m,n);
	gsl_matrix_view av=gsl_matrix_view_array(a,m,n);
	int d;
	if (m<n) d=m; else d=n;
	gsl_vector_view tv=gsl_vector_view_array(tau,d);	
	gsl_linalg_QR_unpack(&av.matrix,&tv.vector,&qv.matrix,&rv.matrix);
} 
예제 #8
0
  /*
  void invert(valarray<double>& Mi,const valarray<double>& M){

    int Dim = sqrt(double(M.size()));
    vector<int> indx(Dim);
    valarray<double> Mt = M;
    valarray<double> vv(Dim);
    
    //// LU decomposition
    for(int i=0; i<Dim; ++i){
      double big = 0.0;
      for(int j=0; j<Dim; ++j) big = max(big,fabs(Mt[i*Dim+j]));
      vv[i] = 1.0/big;
    }

    for(int j=0; j<Dim; ++j){

      for(int i=0; i<j; ++i){
	double sum = Mt[i*Dim+j];
	for(int k=0; k<i; ++k) sum -= Mt[i*Dim+k]*Mt[k*Dim+j];
	Mt[i*Dim+j] = sum;
      }

      double big=0.0;
      int imax;
      for(int i=j; i<Dim; ++i){
	imax = j;
	double sum = Mt[i*Dim+j];
	for(int k=0; k<j; ++k) sum -= Mt[i*Dim+k]*Mt[k*Dim+j];
	Mt[i*Dim+j] = sum;
	if(double dum= vv[i]*fabs(sum) >= big){
	  big = dum;
	  imax = i;
	}
      }
      if(j!=imax){
	for(int k=0; k<Dim; ++k) swap(Mt[imax*Dim+k],Mt[j*Dim+k]);
	vv[imax] = vv[j];
      }
      indx[j]= imax;
      if(j !=Dim-1)
	for(int i=j+1; i<Dim; ++i) Mt[i*Dim+j] /= Mt[j*Dim+j];
    }

    ///////
    for(int k=0; k<Dim; ++k){
      for(int l=0; l<Dim; ++l)
	CCIO::cout<<" LU["<<k<<","<<l<<"]="<<Mt[k*Dim+l];
      CCIO::cout<<"\n";
    }


    //// forward/backward subtractions
    for(int j=0; j<Dim; ++j){
      vector<double> col(Dim,0.0);
      col[j] = 1.0;

      int ii = 0;
      for(int i=0; i<Dim; ++i){
	double sum = col[indx[i]];
	col[indx[i]] = col[i];
	if(ii)
	  for(int k=ii; k<i; ++k) sum -= Mt[i*Dim+k]*col[k];
	else if(sum) ii = i;
	col[i] = sum;
      }
      for(int i=Dim-1; i>=0; --i){
	double sum = col[i];
	for(int k=i+1; k<Dim; ++k) sum -= Mt[i*Dim+k]*col[k];
	col[i] = sum/Mt[i*Dim+i];
      }
      for(int i=0; i<Dim; ++i) Mi[i*Dim+j] = col[i];
    }
  }
  */
  void invert(valarray<double>& Mi,const valarray<double>& M){
    int Dim = sqrt(double(M.size()));
    valarray<double> Mt(M);
    gsl_matrix_view m = gsl_matrix_view_array(&(Mt[0]),Dim,Dim);
    gsl_matrix_view mi = gsl_matrix_view_array(&(Mi[0]),Dim,Dim);
    gsl_permutation* p = gsl_permutation_alloc(Dim);
    int sgn;
    
    gsl_linalg_LU_decomp(&m.matrix,p,&sgn);
    gsl_linalg_LU_invert(&m.matrix,p,&mi.matrix);
  }    
예제 #9
0
/*same as above but with transpose for q; i.e QtS and not QS */
inline void qr_qtmproduct(double* a, double* tau, 
double* s, int m,int n,int p){
	gsl_matrix_view av=gsl_matrix_view_array(a,m,n);
	gsl_matrix_view sv=gsl_matrix_view_array(s,m,p);
	int d;
	if (m<n) d=m; else d=n;
	gsl_vector_view tv=gsl_vector_view_array(tau,d);	
	int i;
	for (i=0;i<p;i++){
		gsl_vector_view scv=gsl_matrix_column(&sv.matrix,i);
		gsl_linalg_QR_QTvec(&av.matrix,&tv.vector,&scv.vector);
	}
}
예제 #10
0
파일: test.c 프로젝트: lemahdi/mglib
void
test_eigen_nonsymm(void)
{
  size_t N_max = 20;
  size_t n, i;
  gsl_rng *r = gsl_rng_alloc(gsl_rng_default);

  for (n = 1; n <= N_max; ++n)
    {
      gsl_matrix * m = gsl_matrix_alloc(n, n);
      gsl_eigen_nonsymmv_workspace * w = gsl_eigen_nonsymmv_alloc(n);

      for (i = 0; i < 5; ++i)
        {
          create_random_nonsymm_matrix(m, r, -10, 10);

          gsl_eigen_nonsymmv_params(0, w);
          test_eigen_nonsymm_matrix(m, i, "random, unbalanced", w);

          gsl_eigen_nonsymmv_params(1, w);
          test_eigen_nonsymm_matrix(m, i, "random, balanced", w);
        }

      gsl_matrix_free(m);
      gsl_eigen_nonsymmv_free(w);
    }

  gsl_rng_free(r);

  {
    double dat1[] = { 0, 1, 1, 1,
                      1, 1, 1, 1,
                      0, 0, 0, 0,
                      0, 0, 0, 0 };
    double dat2[] = { 1, 1, 0, 1,
                      1, 1, 1, 1,
                      1, 1, 1, 1,
                      0, 1, 0, 0 };
    gsl_matrix_view v;
    gsl_eigen_nonsymmv_workspace * w = gsl_eigen_nonsymmv_alloc(4);
    
    v = gsl_matrix_view_array (dat1, 4, 4);
    test_eigen_nonsymm_matrix(&v.matrix, 0, "integer", w);

    v = gsl_matrix_view_array (dat2, 4, 4);
    test_eigen_nonsymm_matrix(&v.matrix, 1, "integer", w);

    gsl_eigen_nonsymmv_free(w);
  }
} /* test_eigen_nonsymm() */
예제 #11
0
int
kalman_meas (Kalman * k, const double * z, int M, double dt,
        KalmanMeasFunc meas_func, KalmanMeasJacobFunc meas_jacob_func,
        KalmanMeasCovFunc meas_cov_func)
{
    kalman_pred (k, dt);

    double K[k->N * M];
    double PHt[k->N * M];
    double H[M * k->N];
    double R[M * M];
    double I[M * M];
    double h[M];

    gsl_matrix_view Kv = gsl_matrix_view_array (K, k->N, M);
    gsl_matrix_view PHtv = gsl_matrix_view_array (PHt, k->N, M);
    gsl_matrix_view Hv = gsl_matrix_view_array (H, M, k->N);
    gsl_matrix_view Rv = gsl_matrix_view_array (R, M, M);
    gsl_matrix_view Iv = gsl_matrix_view_array (I, M, M);
    gsl_vector_view hv = gsl_vector_view_array (h, M);

    meas_jacob_func (H, M, k->x, k->N, k->user);

    /*  K = P_*H'*inv(H*P_*H' + R)  */
    gsl_blas_dgemm (CblasNoTrans, CblasTrans, 1.0, &k->Pv.matrix,
            &Hv.matrix, 0.0, &PHtv.matrix);
    meas_cov_func (R, M, k->user);
    gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, &Hv.matrix,
            &PHtv.matrix, 1.0, &Rv.matrix);

    size_t permv[M];
    gsl_permutation perm = { M, permv };
    int signum;
    gsl_linalg_LU_decomp (&Rv.matrix, &perm, &signum);
    gsl_linalg_LU_invert (&Rv.matrix, &perm, &Iv.matrix);
    gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, &PHtv.matrix,
            &Iv.matrix, 0.0, &Kv.matrix);

    /*  x = x + K*(z - h(x))  */
    meas_func (h, M, k->x, k->N, k->user);
    vector_sub_nd (z, h, M, h);
    gsl_blas_dgemv (CblasNoTrans, 1.0, &Kv.matrix, &hv.vector, 1.0,
            &k->xv.vector);

    /*  P = P_ - K*H*P_  */
    gsl_blas_dgemm (CblasNoTrans, CblasTrans, -1.0, &Kv.matrix,
            &PHtv.matrix, 1.0, &k->Pv.matrix);
    return 0;
}
예제 #12
0
static int
exp1_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x,
         const gsl_vector * u, void * params, gsl_vector * v,
         gsl_matrix * JTJ)
{
  gsl_matrix_view J = gsl_matrix_view_array(exp1_J, exp1_N, exp1_P);
  double x1 = gsl_vector_get(x, 0);
  double x2 = gsl_vector_get(x, 1);
  double x3 = gsl_vector_get(x, 2);
  double x4 = gsl_vector_get(x, 3);
  size_t i;

  for (i = 0; i < exp1_N; ++i)
    {
      double ti = 0.02*(i + 1.0);
      double term1 = exp(x1*ti);
      double term2 = exp(x2*ti);

      gsl_matrix_set(&J.matrix, i, 0, -x3*ti*term1);
      gsl_matrix_set(&J.matrix, i, 1, -x4*ti*term2);
      gsl_matrix_set(&J.matrix, i, 2, -term1);
      gsl_matrix_set(&J.matrix, i, 3, -term2);
    }

  if (v)
    gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v);

  if (JTJ)
    gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ);

  (void)params; /* avoid unused parameter warning */

  return GSL_SUCCESS;
}
예제 #13
0
int
gsl_multifit_linear_L_decomp (gsl_matrix * L, gsl_vector * tau)
{
  const size_t m = L->size1;
  const size_t p = L->size2;
  int status;

  if (tau->size != GSL_MIN(m, p))
    {
      GSL_ERROR("tau vector must be min(m,p)", GSL_EBADLEN);
    }
  else if (m >= p)
    {
      /* square or tall L matrix */
      status = gsl_linalg_QR_decomp(L, tau);
      return status;
    }
  else
    {
      /* more columns than rows, compute qr(L^T) */
      gsl_matrix_view LTQR = gsl_matrix_view_array(L->data, p, m);
      gsl_matrix *LT = gsl_matrix_alloc(p, m);

      /* XXX: use temporary storage due to difficulties in transforming
       * a rectangular matrix in-place */
      gsl_matrix_transpose_memcpy(LT, L);
      gsl_matrix_memcpy(&LTQR.matrix, LT);
      gsl_matrix_free(LT);

      status = gsl_linalg_QR_decomp(&LTQR.matrix, tau);

      return status;
    }
}
예제 #14
0
int
jac (double t, const double y[], double *dfdy, 
     double dfdt[], void *params)
{

  ODEparams * pa = (ODEparams *)params;
  double alpha = gsl_spline_eval(pa->a_spline,t, pa->a_acc);
  double beta = gsl_spline_eval(pa->b_spline,t, pa->b_acc);
  double gamma=pa->gamma,gamma2=gamma*gamma;
  double yy=y[1],x=y[0];


  /* double * p = (double *)params;*/
  	gsl_matrix_view dfdy_mat = gsl_matrix_view_array (dfdy, 2, 2);
  	gsl_matrix * m = &dfdy_mat.matrix; 
	/*	0              1
		-k -2*c*y    -(p-b)-cx^2 
	*/
  	gsl_matrix_set (m, 0, 0, 0.0);
	gsl_matrix_set (m, 0, 1, 1.0);
  	gsl_matrix_set (m, 1, 0, -beta*gamma2 - 3*gamma2*x*x - 2*gamma*x*yy + 2*gamma2*x - gamma*yy);
  	gsl_matrix_set (m, 1, 1, -gamma*x*x - gamma*x);
	dfdt[0] = 0.0;
    dfdt[1] = 0.0;
  return GSL_SUCCESS;
}
예제 #15
0
파일: predprey.c 프로젝트: Jumziey/modsim
int
jac_predprey (double t, const double x[], double *dfdy, 
     double dfdt[], void *params)
{
  predprey_params  * p = (predprey_params *)params;
  double alpha   = p->alpha; 
  double beta    = p->beta;
  double gamma   = p->gamma;

  gsl_matrix_view dfdy_mat = gsl_matrix_view_array (dfdy, 3, 3);
  gsl_matrix * m = &dfdy_mat.matrix; 

  ++ p->jac_count; 
  
  gsl_matrix_set(m, 0, 0, 1-x[1]-2*x[0]/x[2]);
  gsl_matrix_set(m, 0, 1, -x[0]);
  gsl_matrix_set(m, 0, 2, (x[0]/x[2])*(x[0]/x[2]));
  
  gsl_matrix_set(m, 1, 0, alpha*x[1]);
  gsl_matrix_set(m, 1, 1, alpha*x[0]-1);
  gsl_matrix_set(m, 1, 2, 0);
  
  gsl_matrix_set(m, 2, 0, -beta);
  gsl_matrix_set(m, 2, 1 ,0);
  gsl_matrix_set(m, 2, 2, 0);
  
  dfdt[0] = 0.0;
  dfdt[1] = 0.0;
  dfdt[2] = 0.0;
  return GSL_SUCCESS;
}
예제 #16
0
static int
meyer_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x,
          const gsl_vector * u, void * params, gsl_vector * v,
          gsl_matrix * JTJ)
{
  gsl_matrix_view J = gsl_matrix_view_array(meyer_J, meyer_N, meyer_P);
  double x1 = gsl_vector_get(x, 0);
  double x2 = gsl_vector_get(x, 1);
  double x3 = gsl_vector_get(x, 2);
  size_t i;

  for (i = 0; i < meyer_N; ++i)
    {
      double ti = 45.0 + 5.0*(i + 1.0);
      double term1 = ti + x3;
      double term2 = exp(x2 / term1);

      gsl_matrix_set(&J.matrix, i, 0, term2);
      gsl_matrix_set(&J.matrix, i, 1, x1*term2/term1);
      gsl_matrix_set(&J.matrix, i, 2, -x1*x2*term2/(term1*term1));
    }

  if (v)
    gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v);

  if (JTJ)
    gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ);

  (void)params; /* avoid unused parameter warning */

  return GSL_SUCCESS;
}
예제 #17
0
void eigensolve(vector vec1, vector vec2, vector vec3,
		real *vals, matrix symmat)
{
  int i, j;
  double data[9];
  gsl_matrix_view mat;
  gsl_vector_view vec;
  gsl_vector *eigval = gsl_vector_alloc(3);
  gsl_matrix *eigvec = gsl_matrix_alloc(3, 3);
  gsl_eigen_symmv_workspace *work = gsl_eigen_symmv_alloc(3);

  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
      data[3*i + j] = symmat[i][j];
  mat = gsl_matrix_view_array(data, 3, 3);
  gsl_eigen_symmv(&mat.matrix, eigval, eigvec, work);
  gsl_eigen_symmv_free(work);
  gsl_eigen_symmv_sort(eigval, eigvec, GSL_EIGEN_SORT_VAL_DESC);
  for (i = 0; i < 3; i++)
    vals[i] = gsl_vector_get(eigval, i);
  vec = gsl_matrix_column(eigvec, 0);
  for (i = 0; i < 3; i++)
    vec1[i] = gsl_vector_get(&vec.vector, i);
  vec = gsl_matrix_column(eigvec, 1);
  for (i = 0; i < 3; i++)
    vec2[i] = gsl_vector_get(&vec.vector, i);
  vec = gsl_matrix_column(eigvec, 2);
  for (i = 0; i < 3; i++)
    vec3[i] = gsl_vector_get(&vec.vector, i);
  gsl_vector_free(eigval);
  gsl_matrix_free(eigvec);
}
예제 #18
0
int main(int argc, char *argv[])
{
  const size_t NDIM = 3;
  double data[NDIM * NDIM];
  gsl_matrix_view m = gsl_matrix_view_array(data, NDIM, NDIM);
  gsl_vector *eval = gsl_vector_alloc (NDIM);
  gsl_matrix *evec = gsl_matrix_alloc (NDIM, NDIM);
  gsl_eigen_symmv_workspace * w = 
    gsl_eigen_symmv_alloc (NDIM);
  gsl_eigen_symmv (&m.matrix, eval, evec, w);
  gsl_eigen_symmv_free (w);
  //Sort Eigenvalues in ascending order
  gsl_eigen_symmv_sort (eval, evec, 
			GSL_EIGEN_SORT_VAL_ASC);
  
//  for (size_t i = 0; i < NDIM; i++)
//    {
//      retVal.EigenVal[i] = gsl_vector_get(eval, i) / range->size();
//
//      gsl_vector_view evec_i 
//	= gsl_matrix_column (evec, i);
//
//      //EigenVec Components
//      for (size_t j = 0; j < NDIM; j++)
//	retVal.EigenVec[i][j] = gsl_vector_get(&evec_i.vector, j);
//    }

  //Cleanup GSL
  gsl_vector_free (eval);
  gsl_matrix_free (evec);
}
예제 #19
0
// center must be allocated to ndims vals at least.
// coord are the vertice coords
// center is the center of the resulting ndims-sphere
// function returns its radius squared
double SimplexSphere(double **coord, int ndims,double *center)
{
    double a_data[ndims*ndims];
    double b_data[ndims];
    
    gsl_matrix_view m=gsl_matrix_view_array (a_data, ndims, ndims);
    gsl_vector_view b=gsl_vector_view_array (b_data, ndims);
    gsl_vector_view x = gsl_vector_view_array (center,ndims);
    gsl_permutation * p = gsl_permutation_alloc (ndims);

    int s;
    int i,j,k;
    double d;

    for (i=0,k=0;i<ndims;i++)
    {
	b_data[i]=0;
	for (j=0;j<ndims;j++,k++)
	{
	    a_data[k]=((double)coord[0][j]-(double)coord[i+1][j]);
	    b_data[i]+=((double)coord[0][j]*(double)coord[0][j]-(double)coord[i+1][j]*(double)coord[i+1][j]);
	}
	b_data[i]*=0.5;
    }

    gsl_linalg_LU_decomp (&m.matrix, p, &s);
    gsl_linalg_LU_solve (&m.matrix, p, &b.vector, &x.vector);      
    gsl_permutation_free (p);

    for (i=0,d=0;i<ndims;i++) 
	d+=((double)center[i]-(double)coord[0][i])*((double)center[i]-(double)coord[0][i]);

    return d;
}
예제 #20
0
/*affects a! so we might need to clone a. This is just a wrapper of GSL function
  the result is stored in a and tau.*/
inline void qr_coded(double* a, double* tau, int m,int n){
	gsl_matrix_view av=gsl_matrix_view_array(a,m,n);
	int d;
	if (m<n) d=m; else d=n;
	gsl_vector_view tv=gsl_vector_view_array(tau,d);	
	gsl_linalg_QR_decomp(&av.matrix,&tv.vector);
} 
예제 #21
0
파일: linal.c 프로젝트: kcoltin/blackjack
//-----------------------------------------------------------------------------
// Returns the eigendecomposition A = X*D*X^-1. 
// d is the diagonal entries of D. 
// X and d must be preallocated: X should be n x n and d should be length n. 
//-----------------------------------------------------------------------------
void eigendecomp (double **A, double complex **X, double complex *d, int n)
{
	double *a; 
	double complex **Xtmp; 
	double complex *dtmp; 
	gsl_matrix_view m; 
	gsl_vector_complex *eval; 
	gsl_matrix_complex *evec; 
	gsl_eigen_nonsymmv_workspace *w; 

	// Use GSL routine to compute eigenvalues and eigenvectors 
	a = matrixToVector (A, n, n); 
	m = gsl_matrix_view_array (a, n, n); 
	eval = gsl_vector_complex_alloc (n); 
	evec = gsl_matrix_complex_alloc (n, n); 
	w = gsl_eigen_nonsymmv_alloc (n); 

	gsl_eigen_nonsymmv (&m.matrix, eval, evec, w); 
	gsl_eigen_nonsymmv_free (w); 

	// Convert from GSL to intrinsic types 
	Xtmp = gslmToCx (evec, n, n); 
	dtmp = gslvToCx (eval, n); 

	copycm_inplace (X, Xtmp, n, n); 
	copycv_inplace (d, dtmp, n); 

	freecmatrix(Xtmp, n); 
	free(a);
	free(dtmp); 
	gsl_vector_complex_free(eval); 
	gsl_matrix_complex_free(evec); 
}
예제 #22
0
int
jac (double t, const double y[], double *dfdy, 
     double dfdt[], void *params)
{
  double d = *(double *)params;
  double w1, w2, z1, z2; 
  w1 = -m*g*r*cos(y[2]+gamm); 
  w2 = -k+(m*g*l0+marmg_gam)*sin(y[2])+m*g*r*y[0]*sin(y[2]+gamm)+m*g*r*cos(y[2]+gamm); 
  z1 = C*cos(y[2]+gamm)*m*g*r;
  z2 =  -m*g*r*A*cos(y[2]+gamm);
  gsl_matrix_view dfdy_mat 
    = gsl_matrix_view_array (dfdy, 4, 4);
  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, 0, 2, 0.0);
  gsl_matrix_set (m, 0, 3, 0.0);
  gsl_matrix_set (m, 1, 0, z1);
  gsl_matrix_set (m, 1, 1, 0.0);
  gsl_matrix_set (m, 1, 2, (B*w1-C*w2)/det);
  gsl_matrix_set (m, 1, 3, 0.0);
  gsl_matrix_set (m, 2, 0, 0.0);
  gsl_matrix_set (m, 2, 3, 1.0);
  gsl_matrix_set (m, 2, 2, 0.0);
  gsl_matrix_set (m, 2, 1, 0.0);
  gsl_matrix_set (m, 3, 0, z2);
  gsl_matrix_set (m, 3, 3, 0.0);
  gsl_matrix_set (m, 3, 2, (-C*w1+A*w2)/det);
  gsl_matrix_set (m, 3, 1, 0.0);
  dfdt[0] = 0.0;
  dfdt[1] = 0.0;
  dfdt[2] = 0.0; 
  dfdt[3] = 0.0; 
  return GSL_SUCCESS;
}
예제 #23
0
static int calc_jac(double t, const double y[], double *dfdy, double dfdt[], void *data)
{
  VALUE params, proc, ary;
  VALUE result, vdfdt;
  VALUE vy, vmjac;
  gsl_vector_view ytmp, dfdttmp;
  gsl_matrix_view mv;
  size_t dim;
  
  ary = (VALUE) data;
  proc = rb_ary_entry(ary, 1);
  if (NIL_P(proc)) rb_raise(rb_eRuntimeError, "df function not given");

  dim = FIX2INT(rb_ary_entry(ary, 2));
  params = rb_ary_entry(ary, 3);

  ytmp.vector.data = (double *) y;
  ytmp.vector.size = dim;
  ytmp.vector.stride = 1;
  dfdttmp.vector.data = dfdt;
  dfdttmp.vector.size = dim;
  dfdttmp.vector.stride = 1;
  mv = gsl_matrix_view_array(dfdy, dim, dim);
  vy = Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, &ytmp);
  vmjac = Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, &mv);
  vdfdt = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &dfdttmp);
  if (NIL_P(params)) result = rb_funcall((VALUE) proc, RBGSL_ID_call, 4, rb_float_new(t),
					 vy, vmjac, vdfdt);
  else result = rb_funcall((VALUE) proc, RBGSL_ID_call, 5, rb_float_new(t), 
			   vy, vmjac, vdfdt, params);
  return GSL_SUCCESS;
}
예제 #24
0
static int
boxbod_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x,
           const gsl_vector * u, void * params, gsl_vector * v,
           gsl_matrix * JTJ)
{
  gsl_matrix_view J = gsl_matrix_view_array(boxbod_J, boxbod_N, boxbod_P);
  double b[boxbod_P];
  size_t i;

  for (i = 0; i < boxbod_P; i++)
    {
      b[i] = gsl_vector_get(x, i);
    }

  for (i = 0; i < boxbod_N; i++)
    {
      double xi = boxbod_X[i];
      double term = exp(-b[1] * xi);

      gsl_matrix_set (&J.matrix, i, 0, 1.0 - term);
      gsl_matrix_set (&J.matrix, i, 1, b[0] * term * xi);
    }

  if (v)
    gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v);

  if (JTJ)
    gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ);

  (void)params; /* avoid unused parameter warning */

  return GSL_SUCCESS;
}
예제 #25
0
//TODO: what is dfdt?
int jac_vdp(double t, const double y[], double dfdy[], double dfdt[], void *params){
	vdp_params *p = (vdp_params *)params;
	++p->jac_count;
	double alpha = p->alpha;
	double beta = p->beta;
	double gamma = p->gamma;
	double gmax = p->gmax;

	gsl_matrix_view dfdy_mat = gsl_matrix_view_array(dfdy, 2, 2);
	gsl_matrix *m = &dfdy_mat.matrix;

	//Set value at (i,j) to something
	gsl_matrix_set(m, 0, 0, 1 - y[1]-2*y[0]/y[2]);
	gsl_matrix_set(m, 0, 1, -y[0]);
	gsl_matrix_set(m, 0, 2, y[0]*y[0]/(y[2]*y[2]));

	gsl_matrix_set(m, 1, 0, alpha*y[1]);
	gsl_matrix_set(m, 1, 1, alpha*(y[0]-1));
	gsl_matrix_set(m, 1, 2, 0);

	gsl_matrix_set(m, 2, 0, -beta);
	gsl_matrix_set(m, 2, 1, 0);
	gsl_matrix_set(m, 2, 2, -gamma/gmax);

	dfdt[0] = 0.0;
	dfdt[1] = 0.0;
	dfdt[2] = 0.0;

	return GSL_SUCCESS;
}
예제 #26
0
void Geo3d_Cov_Orientation(double *cov, double *vec, double *ext)
{
#ifdef HAVE_LIBGSL
  gsl_matrix_view gmv = gsl_matrix_view_array(cov, 3, 3);
  
  gsl_vector *eval = gsl_vector_alloc(3);
  gsl_matrix *evec = gsl_matrix_alloc(3,3);
  gsl_eigen_symmv_workspace *w = gsl_eigen_symmv_alloc(3);

  gsl_eigen_symmv(&(gmv.matrix), eval, evec, w);
  gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_DESC);

  if(ext != NULL) {
    darraycpy(ext, gsl_vector_const_ptr(eval, 0), 0, 3);
  }

  gsl_vector_view v = gsl_vector_view_array(vec, 3);
  gsl_matrix_get_col(&(v.vector), evec, 0);

  gsl_vector_free(eval);
  gsl_matrix_free(evec);
  gsl_eigen_symmv_free(w); 
#else
  double eigv[3];
  Matrix_Eigen_Value_Cs(cov[0], cov[4], cov[8], cov[1], cov[2], cov[5], eigv);
  Matrix_Eigen_Vector_Cs(cov[0], cov[4], cov[8], cov[1], cov[2], cov[5], 
      eigv[0], vec);
  if(ext != NULL) {
    darraycpy(ext, eigv, 0, 3);
  }
#endif
}
예제 #27
0
static int
beale_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x,
          const gsl_vector * u, void * params, gsl_vector * v,
          gsl_matrix * JTJ)
{
  gsl_matrix_view J = gsl_matrix_view_array(beale_J, beale_N, beale_P);
  double x1 = gsl_vector_get(x, 0);
  double x2 = gsl_vector_get(x, 1);
  size_t i;

  for (i = 0; i < beale_N; ++i)
    {
      double term = pow(x2, (double) i);

      gsl_matrix_set(&J.matrix, i, 0, term*x2 - 1.0);
      gsl_matrix_set(&J.matrix, i, 1, (i + 1.0) * x1 * term);
    }

  if (v)
    gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v);

  if (JTJ)
    gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ);

  (void)params; /* avoid unused parameter warning */

  return GSL_SUCCESS;
}
예제 #28
0
static int
wood_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x,
         const gsl_vector * u, void * params, gsl_vector * v,
         gsl_matrix * JTJ)
{
  gsl_matrix_view J = gsl_matrix_view_array(wood_J, wood_N, wood_P);
  double x1 = gsl_vector_get(x, 0);
  double x3 = gsl_vector_get(x, 2);
  double s90 = sqrt(90.0);
  double s10 = sqrt(10.0);

  gsl_matrix_set_zero(&J.matrix);

  gsl_matrix_set(&J.matrix, 0, 0, -20.0*x1);
  gsl_matrix_set(&J.matrix, 0, 1, 10.0);
  gsl_matrix_set(&J.matrix, 1, 0, -1.0);
  gsl_matrix_set(&J.matrix, 2, 2, -2.0*s90*x3);
  gsl_matrix_set(&J.matrix, 2, 3, s90);
  gsl_matrix_set(&J.matrix, 3, 2, -1.0);
  gsl_matrix_set(&J.matrix, 4, 1, s10);
  gsl_matrix_set(&J.matrix, 4, 3, s10);
  gsl_matrix_set(&J.matrix, 5, 1, 1.0/s10);
  gsl_matrix_set(&J.matrix, 5, 3, -1.0/s10);

  if (v)
    gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v);

  if (JTJ)
    gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ);

  (void)params; /* avoid unused parameter warning */

  return GSL_SUCCESS;
}
예제 #29
0
static int
wnlin_df (CBLAS_TRANSPOSE_t TransJ, const gsl_vector * x,
          const gsl_vector * u, void * params, gsl_vector * v,
          gsl_matrix * JTJ)
{
  gsl_matrix_view J = gsl_matrix_view_array(wnlin_J, wnlin_N, wnlin_P);
  double A = gsl_vector_get (x, 0);
  double lambda = gsl_vector_get (x, 1);
  size_t i;

  for (i = 0; i < wnlin_N; i++)
    {
      gsl_vector_view v = gsl_matrix_row(&J.matrix, i);
      double ti = i;
      double swi = sqrt(wnlin_W[i]);
      double e = exp(-lambda * ti);

      gsl_vector_set(&v.vector, 0, e);
      gsl_vector_set(&v.vector, 1, -ti * A * e);
      gsl_vector_set(&v.vector, 2, 1.0);

      gsl_vector_scale(&v.vector, swi);
    }

  if (v)
    gsl_blas_dgemv(TransJ, 1.0, &J.matrix, u, 0.0, v);

  if (JTJ)
    gsl_blas_dsyrk(CblasLower, CblasTrans, 1.0, &J.matrix, 0.0, JTJ);

  return GSL_SUCCESS;
}
예제 #30
0
파일: kjg_fpca.c 프로젝트: b1234561/EIG
void kjg_fpca_XTXA (
        const gsl_matrix *A1,
        gsl_matrix *B,
        gsl_matrix *A2) {
    size_t m = get_ncols();
    size_t n = get_nrows();

    size_t i, r;                                                // row index
    double *Y = malloc(sizeof(double) * n * KJG_FPCA_ROWS);  // normalized

    gsl_matrix_view Bi, Xi;

    gsl_matrix_set_zero(A2);

    for (i = 0; i < m; i += KJG_FPCA_ROWS) {
        r = kjg_geno_get_normalized_rows(i, KJG_FPCA_ROWS, Y);
        Xi = gsl_matrix_view_array(Y, r, n);
        Bi = gsl_matrix_submatrix(B, i, 0, r, B->size2);
        gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1, &Xi.matrix, A1, 0,
                &Bi.matrix);
        gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1, &Xi.matrix, &Bi.matrix,
                1, A2);
    }

    free(Y);
}