// 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*x1*x3, x4*x4*x4, ... // 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 - (J_prev^-1 * (A * X - 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)0) System.out.println("simeq_newton3 running n="+n+", nlin="+nlin); eps = ueps; maxiter = uiter; b = ub; // setup nonlinear terms for(int i=n; i=0) X[i] *= X[var2[i]]; // -1 flag should not be used if(var3[i]>=0) X[i] *= X[var3[i]]; } for(int i=0; i2) { for(int i=0; i0) System.out.println("simeq_newton3 itr "+itr+", prev="+presid+ " residual="+resid); if(resid=0) /* X^2 xa */ Ja[i][j] += A[i][k]*2.0*X[var2[k]]*X[var3[k]]; /* 2X xa */ else if(var1[k]==j && var2[k]==j && var3[k]<0) /* X^2 */ Ja[i][j] += A[i][k]*2.0*X[var2[k]]; /* 2X */ else if(var2[k]==j && var3[k]==j && var1[k]>=0) /* xa X^2 */ Ja[i][j] += A[i][k]*2.0*X[var3[k]]*X[var1[k]]; /* 2X xa */ else if(var2[k]==j && var3[k]==j && var1[k]<0) /* X^2 */ Ja[i][j] += A[i][k]*2.0*X[var3[k]] ; /* 2X */ else if(var3[k]==j && var1[k]==j && var2[k]>=0) /* xa X^2 */ Ja[i][j] += A[i][k]*2.0*X[var1[k]]*X[var2[k]]; /* 2X xa */ else if(var3[k]==j && var1[k]==j && var2[k]<0) /* X^2 */ Ja[i][j] += A[i][k]*2.0*X[var1[k]]; /* 2X */ else if(var1[k]==j) { if(var2[k]>=0 && var3[k]>=0) Ja[i][j] += A[i][k]*X[var2[k]]*X[var3[k]]; else if(var2[k]>=0) Ja[i][j] += A[i][k]*X[var2[k]]; else if(var3[k]>=0) Ja[i][j] += A[i][k]*X[var3[k]]; } else if(var2[k]==j) { if(var1[k]>=0 && var3[k]>=0) Ja[i][j] += A[i][k]*X[var1[k]]*X[var3[k]]; else if(var1[k]>=0) Ja[i][j] += A[i][k]*X[var1[k]]; else if(var3[k]>=0) Ja[i][j] += A[i][k]*X[var3[k]]; } else if(var3[k]==j) { if(var2[k]>=0 && var1[k]>=0) Ja[i][j] += A[i][k]*X[var2[k]]*X[var1[k]]; else if(var2[k]>=0) Ja[i][j] += A[i][k]*X[var2[k]]; else if(var1[k]>=0) Ja[i][j] += A[i][k]*X[var1[k]]; } } // end k } // end j } // end i if(monitor>4) { System.out.println("Ja computed "); for(int i=0; i5) { System.out.println("Ja inverted "); for(int i=0; i3) { for(int i=0; i=0) X_next[i] *= X_next[var2[i]]; if(var3[i]>=0) X_next[i] *= X_next[var3[i]]; } if(monitor>2) { for(int i=0; i2) System.out.println(" "); } // end iteration if(monitor>0) System.out.println("simeq_newton3.java finished"); } } // end class simeq_newton3