Esempio n. 1
0
int FormGradient(TAO_APPLICATION taoapp, Vec X, Vec G,void *userCtx){
  int info;
  double fcn;
  TaoFunctionBegin;
  info = FormFunctionGradient(taoapp,X,&fcn,G,userCtx);CHKERRQ(info);
  TaoFunctionReturn(0);
}
PetscErrorCode EvaluateHessianFD(Tao tao, Vec p, Userctx* user)
{
  PetscErrorCode ierr;
  PetscReal f, expo, *eps_arr;
  Vec G, G_eps;
  int i,j;
  PetscReal minusOne=-1., one=1.;
  Vec p_eps;
  PetscScalar test_eps;

  FILE* fOut = fopen("Hessian.txt", "a+");
  if(fOut==NULL)
    PetscFunctionReturn(-1);

  //alocate the vector for gradients: at current point and at perturbed point
  ierr = VecDuplicate(p, &G);CHKERRQ(ierr);
  ierr = VecDuplicate(p, &G_eps);CHKERRQ(ierr);

  //gradient at current point
  ierr = FormFunctionGradient(tao, p, &f, G, user);

  //alocate the perturbed x
  ierr = VecDuplicate(p, &p_eps);CHKERRQ(ierr);

  /* testing flag: 0 means fix epsilon; 1 means try several epsilons*/
  test_eps = 0;
  for(i=0;i<3;i++) {
    printf("column %d\n", i);
    //test different expo to see what eps works better
    for(expo=1e-2; expo>1e-8; expo/=3) {
      if (test_eps == 0){
	expo = 1.0e-4;
      }
      ierr =  VecCopy(p, p_eps);
      ierr = VecGetArray(p_eps, &eps_arr);CHKERRQ(ierr);
      eps_arr[i] += expo;
      ierr = VecRestoreArray(p_eps, &eps_arr);CHKERRQ(ierr);

      //gradient at perturbed point
      ierr = FormFunctionGradient(tao, p_eps, &f, G_eps, user);

      //i-th column of the Hessian
      //G_eps = G_eps-G
      ierr = VecAXPBY(G_eps, minusOne, one, G);CHKERRQ(ierr);
      //G_eps = G_eps/eps
      ierr = VecScale(G_eps, 1/expo);CHKERRQ(ierr);

      printf("eps=%7.4e ", expo);
      ierr = VecGetArray(G_eps,  &eps_arr);CHKERRQ(ierr);
      for(j=0; j<3; j++){
	if (test_eps == 1){
	  printf( "%18.12f   ", eps_arr[j]);
	}
	else{
	  if (j==0){
	      fprintf(fOut, " %.12f %.12f %.12f %18.12f ", user->tfinal, user->data_noise, PD0_disturb[0], eps_arr[j]);
	      printf( " %.12f %.12f %.12f %18.12f ", user->tfinal, user->data_noise, PD0_disturb[0], eps_arr[j]);
	    }
	  else{
	    fprintf(fOut, " %18.12f ", eps_arr[j]);
	    printf( " %18.12f ", eps_arr[j]);
	  }
	}
      }
      if (test_eps == 1){
	printf("\n");
      }
      else{
	fprintf(fOut, "\n");
	printf("\n");
	break;
      }
      ierr = VecRestoreArray(G_eps, &eps_arr);CHKERRQ(ierr);
    }
  }
  fclose(fOut);
  //destroy vectors

  ierr = VecDestroy(&G);CHKERRQ(ierr);
  ierr = VecDestroy(&G_eps);CHKERRQ(ierr);
  ierr = VecDestroy(&p_eps);CHKERRQ(ierr);
  PetscFunctionReturn(0); 
}