Example #1
0
void func_def_print(func_t *f)
{
  func_t *vars=NULL;
  int i;
  vars=func_scope_vlist(0);
  printf("%s",func_def_name(f));
  if(!(func_def_amin(f)==0 && func_def_amax(f)==0)){
    printf("(");
    for(i=0; i<MAX2(func_def_amin(f),func_def_amax(f)); i++){
      if(i!=0){ if(i==func_def_amin(f)){ printf(";"); }else{ printf(","); } }
      if(vars!=NULL && i>=0 && i<(func_strings_size(vars))){
	printf("%s",func_strings_at(vars,i));
      }else{
	printf("#%d",i);
      }
    }
    if(func_def_amax(f)<0){
      if(func_def_amin(f)>0){ printf(","); }
      printf("...");
    }
    printf(")");
  }
  printf("=");
  func_print(func_aget(f,0));
}
Example #2
0
func_t *func_script(const char *str)
{
    func_t *f=NULL;
    func_init();
    f=func_strings_char(str);
    f=func_null_script(f);    // NULL
    f=func_nan_script(f);     // nan
    f=func_inf_script(f);     // inf
    f=func_zero_script(f);    // 0
    f=func_one_script(f);     // 1
    f=func_bigint_script(f);  // Z, Q
    f=func_real_script(f);    // R
    f=func_var_script(f);     // var: #0, #1, #2, ...
    f=func_set_script(f);     // =, def
    f=func_add_script(f);     // +
    f=func_sub_script(f);     // -
    f=func_mul_script(f);     // *
    f=func_div_script(f);     // /
    f=func_pow_script(f);     // ^
    f=func_bracket_script(f); // (......)
    f=func_list_script(f);    // list: {......}, [......]
    f=func_builtin_script(f); // built-in: f, f(...)
    f=func_def_script(f);     // def: f, f(...)
    if(func_is_strings(f)) {
        printf("Error in func_script(const char *str)\n");
        printf("str='%s'\n",str);
        printf("f=");
        func_print(f);
        printf("\n");
        exit(0);
    }
    return f;
}
Example #3
0
void func_add_print(func_t *f)
{
  int i;
  if(func_power(f)!=1) printf("(");
  for(i=0; i<func_asize(f); i++){
    if(func_is_bigint(func_aget(f,i)) && func_bigint_sgn(func_aget(f,i))<0){ } // do nothing
    else if(func_is_mul(func_aget(f,i)) && func_asize(func_aget(f,i))>0 && func_is_bigint(func_aget(f,i)->a[0]) && func_bigint_sgn(func_aget(f,i)->a[0])<0){ } // do nothing
    else if(i>=1){ printf("+"); }
    if(func_is_add(func_aget(f,i)) && func_power(func_aget(f,i))==1){ printf("("); }
    func_print(func_aget(f,i));
    if(func_is_add(func_aget(f,i)) && func_power(func_aget(f,i))==1){ printf(")"); }
  }
  if(func_power(f)!=1) printf(")");
  func_print_hat(func_power(f));
}
Example #4
0
void func_print_table(func_t *f)
{
  int i;
  printf("{\n");
  for(i=0; i<func_asize(f); i++){
    if(func_aget(f,i)!=NULL){      
      printf("[%d] ",i);
      //      if(func_key_name(func_aget(f,i))==NULL){ printf("NULL"); }
      //      else{ printf("%s",func_key_name(func_aget(f,i))); }
      //      printf(" => ");
      func_print(func_aget(f,i));
      printf("\n");
    }
  }
  printf("}");
}
Example #5
0
//------------------------------------------------------------
//
void   *
List_print ( List_node_t  *list, void (*func_print)(const void *) ) 
{
   const    List_node_t    *index_list = NULL;

   assert(list);

# ifdef DEBUG_STRING_LIST
   for ( index_list = list ; index_list ; index_list = index_list->next_node_in_list )
   {
      fprintf(stderr, "%s\n", (const char *) index_list->element );
   }
# else
   for ( index_list = list ; index_list ; index_list = index_list->next_node_in_list )
   {
      func_print( (const void *) index_list->element );
   }
# endif
    // TODO: return correct value
    return NULL;
}
Example #6
0
int main(int argc, const char *argv[])
{
  char *eq[]={"{x-sin(3/2*(x+y)), y-cos(3/2*(x+y))}",
	      "{x^3+y^2+1, x^2+y^2+2}",
	      "{2*x^2+y, x+2*y+5}",
	      "{3*x^2-1,log(x)+y+3}",          //-eq 0 -eps 1e-100 --> ## 2 step 戻る ## 実数解 
	      "{x^2+y^2+x^2-1,x^2+z^2-y,x-z}",       //eq 5  ## 2step 戻る ##
	      "{-x+x^2+2*y^2+2*z^2+2*w^2, -y+2*x*y+2*y*z+2*z*w, -z+y^2+2*x*z+2*y*w, -1+x+2*y+2*z+2*w}", //eq 6 ## 2step 戻る ##
	      "{x-10000-y^2,x*y^2-100}",             // eq 8 ## 2step 戻る ##
	      "{0.3*x^2-1}",                         // eq 9 ## 2step 戻る ##
	      "{(3*x-y^2)^3-1000,log(x)^(-1)+2*y-30}",                //eq 12 ### 3step 戻る ### 
	      "{cos(0.5*x)+cos(y)-1, sin(0.5*x)-sin(y)-1}",           //eq31 // x=pi, y=0  ## 2回 2step 戻る ##	      
	      "{-x+x^2+2*y^2+2*z^2+2*w^2, -y+2*x*y+2*y*z+2*z*w, -z+y^2+2*x*z+2*y*w, -1+x+2*y+2*z+2*w}", //eq 36 4変数 x=1, y=z=w=0  ## 2step 戻る ##
	      "{x^2-y^2-1,x^4-y^4-1999}",             // 桁落ち kappa=0.06,  解 x=sqrt(1000),y=sqrt(999)
	      "{x^2+y^2-1, x^2+2*x*y+y^2-2}",         // 線形
	      "{x+y,x*y}",                            // 線形,零
	      NULL 
  };
  int debug=0,i,m,step_max0=-1,step_max=-1,prec0=53,prec=53,no=0,solve_true=0,info,seed=0,eterm=0,e_prec=2048,e_seed=-1,kappa=26,l=4;
  double mu=8;
  func_t *fF=NULL;
  cmulti **x0=NULL,**x=NULL,**x_true=NULL,**e=NULL;
  rmulti *eps=NULL,*eps_true=NULL;

  // init func_t
  func_eval(func_script("begin(x,y,z,w,v,u)"));

  // default prec
  set_default_prec(prec0);

  // allocate
  RA(eps); RA(eps_true);

  // default parameters
  rset_d(eps,1e-200);
  rset_s(eps_true,"1e-2000");

  // get options
  i=1;
  while(i<argc){
    if(STR_EQ(argv[i],"--help"))                 { usage(); }
    else if(STR_EQ(argv[i],"-v"))                { debug=1; }
    else if(STR_EQ(argv[i],"-vv"))               { debug=2; }
    else if(STR_EQ(argv[i],"-vvv"))              { debug=3; }
    else if(STR_EQ(argv[i],"-true"))             { solve_true=1; }
    else if(STR_EQ(argv[i],"-eterm"))            { eterm=1; }
    else if(i+1<argc && STR_EQ(argv[i],"-mu"))   { mu=atof(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-l"))    { l=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-kappa")){ kappa=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-eq"))   { no=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-n"))    { step_max=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-prec0")){ prec0=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-prec")) { prec=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-e-prec")){ e_prec=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-e-seed")){ e_seed=atoi(argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-eps"))  { rset_s(eps,argv[++i]); }
    else if(i+1<argc && STR_EQ(argv[i],"-seed")) { seed=atoi(argv[++i]); }
    else                                         { usage(); }
    i++;
  }

  //
  printf("step_max=%d\n",step_max);
  printf("mu=%g\n",mu);
  printf("l=%d\n",l);
  printf("kappa=%d\n",kappa);
  fF=func_script(eq[no]);  printf("fF="); func_print(fF); printf("\n");
  m=func_asize(fF);        printf("m=%d\n",m);

  // allocate vectors and matrices
  set_default_prec(prec0);  printf("prec0=%d\n",prec0);
  CVA(x0,m); CVA(x,m); CVA(x_true,m); CVA(e,m);

  // set initial vector
  init_genrand(seed);
  cvec_set_rand(m,x0,2,-1);     cvec_print(m,x0,"x0=","f",6);

  // solve for true solution
  printf("#-------------------\n");
  cvec_clone(m,x_true,x0);
  csolve_newton(m,x_true,fF,step_max0,debug);
    //prec=csolve_newton_adjust(m,x_true,fF,NULL,eps_true,step_max0,mu,l,kappa,debug);
  cvec_print(m,x_true,"x*=","e",20);
  cvec_clone(m,x,x_true);

  // solve
  if(solve_true){
    printf("#-------------------\n");
    cvec_clone(m,x,x0);
    prec=csolve_newton_adjust(m,x,fF,x_true,eps,step_max,mu,l,kappa,debug);
    cvec_print(m,x,"x=","e",20);
  }
 
  // error
  printf("#-------------------\n");
  printf("prec=%d\n",prec);
  set_default_prec(prec);
  cvec_round(m,e,prec);
  cvec_set_nan(m,e);
  info=csolve_krawczyk(m,e,x,fF,debug-2);
  if(info){ print_red(); printf("failed.\n"); } else{ print_green(); printf("succeeded.\n"); } print_reset();
  cvec_print(m,e,"e=","e",1);

  if(eterm){
    printf("#-------------------\n");
    if(e_seed>=0){ init_genrand(e_seed); cvec_set_rand(m,x,2,-1); }
    eterm_show(m,x,fF,e_prec,kappa);
  }

  // done
  printf("#-------------------\n");
  fF=func_del(fF);
  func_clear();
  RF(eps); CVF(x,m); CVF(e,m);
  printf("func_new_del_check_sum=%d\n",func_new_del_check_sum());  
  return 0;
}