#define VERSION 1.12 #define float double int findroot(float (*f[MAX])(), float x[MAX]); #define NUM_OF_STEPS 2000 #define INCREMENT_X 1. #define TOLERANCE 1.e-5 #define PRECISION 1.e-3 #define X_BOX 10000 #define FAST_F 2 #define FAST_X .5 #define DEBUG 0 int eqsolv(float (*f[MAX])(), float x[MAX]); int solve(float c[MAX][MAX], float b[MAX], float x[MAX]); float df(int i, float x[MAX], float (*f)()); #define INCREMENT 1e-5 void version(void); int findroot(float (*f[MAX])(), float x[MAX]) { int i,j; int error, error_t, key, flag, tot_steps; float f_i[MAX], f_f[MAX], fi, ff, step; float x_t[MAX], delta_x[MAX], delta_t; version(), error=0, tot_steps=0; flag=0; if(DEBUG){ printf("\nFindRoot: Initial values given:\n"); for(i=0;idelta_t) delta_t=fabs(delta_x[j]); } if(delta_tX_BOX){ step=X_BOX/delta_t, error=1; for(j=0;jTOLERANCE) flag=1; } if(!flag) return 1; key=0, error=error_t=-1; while(1){ key++; if(!(error||error_t)) break; error_t=error; error=0; switch(2-key%2){ case 1: do{ flag=0, ff=1; for(j=0;j0) if(f_f[j]>(1-(1-FAST_F)*step)*f_i[j]){ flag=1; break; } if(f_i[j]<0) if(f_f[j]<(1-(1-FAST_F)*step)*f_i[j]){ flag=1; break; } } if(flag){ error=2; step=FAST_X*step; for(j=0;j