// test_simeq_newton3.java solve nonlinear system of equations // method: newton iteration using Jacobian // use list for higher order terms // // Given problem A X = Y where X may have terms x1, x2, x3, x4, // and higher order such as: x1*x2, x1*x3, x1*x4, x2*x3, ... // A sparse matrix may be used, coefficients given // Y is vector of reals given // independent unknowns are x1, x2, x3, x4 // // for testing, generate A using pseudo random numbers // choose x1=1.1 x2=1.2 x3=1.4 x4 =1.5, compute products // compute terms of Y using Y = A X // // Solve by initial guess at values of x1, x2, x3, x4 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 || var2[i]>=n || var3[i]>=n) System.out.println("var error "+var1[i]+" "+var2[i]+" "+var3[i]); System.out.print(Xname1[var1[i]]); if(var2[i]>=0) System.out.print("*"+Xname1[var2[i]]); if(var3[i]>=0) System.out.println("*"+Xname1[var3[i]]); if(i==n-1) System.out.println("\n"); else System.out.println(","); } for(int i=n; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } // debug print for(int i=0; i=n || var2[i]>=n || var3[i]>=n) System.out.println("var error "+var1[i]+" "+var2[i]+" "+var3[i]); 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(i==n-1) System.out.println("\n"); else System.out.println(","); } for(int i=n; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } // debug print for(int i=0; i=n || var2[i]>=n || var3[i]>=n) System.out.println("var error "+var1[i]+" "+var2[i]+" "+var3[i]); 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(i==n-1) System.out.println("\n"); else System.out.println(","); } for(int i=nlin; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } // debug print for(int i=0; i=n || var2[i]>=n || var3[i]>=n) System.out.println("var error "+var1[i]+" "+var2[i]+" "+var3[i]); 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(i==n-1) System.out.println("\n"); else System.out.println(","); } for(int i=n; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } for(int i=0; i