// test_simeq_newton5.java solve nonlinear system of equations // method: newton iteration using Jacobian // use list for higher order terms // // may have 1 to about 10 variables, X1, X2, X3, ... // a maximal term can have up to power of 3 divided by power of 2 for each var // n is number of variables, nlin is number of non linear terms // // 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 // // for testing, generate A using pseudo random numbers // choose x1=1.1 x2=1.2 x3=1.4 x4 compute products // and reciprocals // compute terms of Y using Y = A X // // 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)=0) X_soln[i] = X_soln[var1[i]]; if(var2[i]>=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; if(vari1[i]>=0) X_soln[i] /= X_soln[vari1[i]]; if(vari2[i]>=0) X_soln[i] /= X_soln[vari2[i]]; } // set up Y for(int i=0; i=n || var2[i]>=n || var3[i]>=n || vari1[i]>=n || vari2[i]>=n) System.out.println("var error "+var1[i]+" "+var2[i]+" "+var3[i]+ " "+vari1[i]+" "+vari2[i]); System.out.print("A[i]["+i+"]"); if(var1[i]>=0) System.out.print("*"+Xname[var1[i]]); if(var2[i]>=0) System.out.print("*"+Xname[var2[i]]); if(var3[i]>=0) System.out.print("*"+Xname[var3[i]]); if(vari1[i]>=0 || vari2[i]>=0) System.out.print("/("); if(vari1[i]>=0) System.out.print(Xname[vari1[i]]); if(vari2[i]>=0) System.out.print("*"+Xname[vari2[i]]); if(vari1[i]>=0 || vari2[i]>=0) System.out.print(")"); if(i==n+nlin-1) System.out.println(" "); else System.out.println("+"); } System.out.println(" = Y[i]"); System.out.println(" "); System.out.println("desired solution, may not be unique"); for(int i=0; i