// simeq_newton5.java solve nonlinear system of equations // method: newton iteration using Jacobian // use list for higher order terms // // a maximal term can have up to power of 3 divided by power of 2 // in this implementation (if we had symbolic differentiation, no limit) // a term could be x1 , x1*x3 , x2/x5 , x1*x2*x3/(x4*x5) , x2^3/x4^2 // // Solve by initial guess at values of x1, x2, x3 computing products // X_next = X_initial - J_initial^-1 * (A * X_initial - Y) // in general X_next = X_prev - (J_prev^-1 * (A * X_prev - Y))*b // where 0 < b < 1, often 0.5, for stability // // solved when abs sum each row A * X_next -Y < epsilon // // It may stall, stop if abs(X_next-X_prev)=n) { System.out.println("var1["+i+"] must be -1 to "+(n-1)); varerr=true; } if(var2[i]<-1 || var2[i]>=n) { System.out.println("var2["+i+"] must be -1 to "+(n-1)); varerr=true; } if(var3[i]<-1 || var3[i]>=n) { System.out.println("var3["+i+"] must be -1 to "+(n-1)); varerr=true; } if(vari1[i]<-1 || vari1[i]>=n) { System.out.println("vari1["+i+"] must be -1 to "+(n-1)); varerr=true; } if(vari2[i]<-1 || vari2[i]>=n) { System.out.println("vari2["+i+"] must be -1 to "+(n-1)); varerr=true; } } // end nonlinear term check if(varerr) { System.out.println("var1 var2 var3 vari1 vari2"); for(int i=0; i=0) X[i] *= X[var1[i]]; if(var2[i]>=0) X[i] *= X[var2[i]]; if(var3[i]>=0) X[i] *= X[var3[i]]; if(vari1[i]>=0) X[i] /= X[vari1[i]]; if(vari2[i]>=0) X[i] /= X[vari2[i]]; } // debug print if(debug) { System.out.println("initial guess at solution, can be bad"); for(int i=0; i=0) X_next[i] = X_next[var1[i]]; if(var2[i]>=0) X_next[i] *= X_next[var2[i]]; if(var3[i]>=0) X_next[i] *= X_next[var3[i]]; if(vari1[i]>=0) X_next[i] /= X_next[vari1[i]]; if(vari2[i]>=0) X_next[i] /= X_next[vari2[i]]; } if(debug && n<6) { for(int i=0; i