Exemple #1
0
void solve_reduced(int n, int m, double h_x[], double h_y[], 
		   double a[], double x_x[], double x_y[],
		   double c_x[], double c_y[],
		   double workspace[], int step)
{
  int i,j,k;

  double *p_x;
  double *p_y;
  double *t_a;
  double *t_c;
  double *t_y;

  p_x = workspace;		/* together n + m + n*m + n + m = n*(m+2)+2*m */
  p_y = p_x + n;
  t_a = p_y + m;
  t_c = t_a + n*m;
  t_y = t_c + n;

  if (step == PREDICTOR) {
    choldc(h_x, n, p_x);	/* do cholesky decomposition */

    for (i=0; i<m; i++)         /* forward pass for A' */
      chol_forward(h_x, n, p_x, a+i*n, t_a+i*n);
				
    for (i=0; i<m; i++)         /* compute (h_y + a h_x^-1A') */
      for (j=i; j<m; j++)
	for (k=0; k<n; k++) 
	  h_y[m*i + j] += t_a[n*j + k] * t_a[n*i + k];
				
    choldc(h_y, m, p_y);	/* and cholesky decomposition */
  }
  
  chol_forward(h_x, n, p_x, c_x, t_c);
				/* forward pass for c */

  for (i=0; i<m; i++) {		/* and solve for x_y */
    t_y[i] = c_y[i];
    for (j=0; j<n; j++)
      t_y[i] += t_a[i*n + j] * t_c[j];
  }

  cholsb(h_y, m, p_y, t_y, x_y);

  for (i=0; i<n; i++) {		/* finally solve for x_x */
    t_c[i] = -t_c[i];
    for (j=0; j<m; j++)
      t_c[i] += t_a[j*n + i] * x_y[j];
  }

  chol_backward(h_x, n, p_x, t_c, x_x);
}
Exemple #2
0
void linsys_solve(double a[], int n, int k, double b[], double x[], int flag, double f[])
{
  unsigned int i,j ;
  double *p=calloc(n, sizeof(double)) ;

  choldc(a, n, p, f) ;
  if (*f>0) /* check result */
  {
    free(p) ; /* matrix is not positiv definite */
    return ;
  } ;

  for (i=0; i<k; i++)
    cholsb(a, n, p, &b[i*n], &x[i*n]) ;
  
  if (flag)
    for (i=0; i<n; i++)
      for (j=i+1; j<n; j++)
	a[j*n+i]=a[j+i*n] ;

  free(p) ;
}