/* test_simeq_newton3.c 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) #include #include "simeq_newton3.h" int main(int argc, char *argv[]) { /* build (double A[][], double Y[], int var1[], int var2[], double X[]) */ int n; /* number of linear unknowns */ int nlin; /* number of nonlinear terms, even if zero coef */ int var1[] = { 0, 1, 2, 3, 0, 0, 0, 1, 1, 2}; /* zero based subscript */ int var2[] = {-1,-1,-1,-1, 1, 2, 3, 2, 3, 3}; /* e.g. last is x3*x4 */ int var3[] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; /* possible cube or 3 term */ /* could have int var4[] etc for higher powers */ double A[10][10]; double A1[2][4]; /* fourth test case */ double Y[10]; double X[10]; double X_soln[10]; char *Xname[4] = {"X0", "X1", "X2", "X3"}; /* all linear terms */ int i, j; printf("test_simeq_newton3.c running \n"); /* build first test case */ n = 4; /* number of linear unknowns */ nlin = 6; /* number of nonlinear terms, even if zero coef */ for(i=0; i=n || var2[i]>=n || var3[i]>=n) { printf("var error %d %d %d \n", var1[i], var2[i], var3[i]); break; } printf("%s ",Xname[var1[i]]); if(var2[i]>=0) printf("* %s", Xname[var2[i]]); if(var3[i]>=0) printf("* %s",Xname[var3[i]]); printf("\n"); } printf(" \n"); for(i=n; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } for(i=0; i=n || var2[i]>=n || var3[i]>=n) { printf("var error %d %d %d \n", var1[i], var2[i], var3[i]); break; } printf("%s ",Xname[var1[i]]); if(var2[i]>=0) printf("* %s", Xname[var2[i]]); if(var3[i]>=0) printf("* %s",Xname[var3[i]]); printf("\n"); } printf(" \n"); for(i=n; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } for(i=0; i=n || var2[i]>=n || var3[i]>=n) { printf("var error %d %d %d \n", var1[i], var2[i], var3[i]); break; } printf("%s ",Xname[var1[i]]); if(var2[i]>=0) printf("* %s", Xname[var2[i]]); if(var3[i]>=0) printf("* %s",Xname[var3[i]]); printf("\n"); } printf(" \n"); for(i=n; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } for(i=0; i=0) X_soln[i] *= X_soln[var2[i]]; if(var3[i]>=0) X_soln[i] *= X_soln[var3[i]]; } for(i=0; i