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)); }
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; }
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)); }
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("}"); }
//------------------------------------------------------------ // 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; }
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; }