package symjava.examples; import Jama.Matrix; import symjava.bytecode.BytecodeVecFunc; import symjava.matrix.*; import symjava.numeric.NumMatrix; import symjava.numeric.NumVector; import symjava.relational.Eq; import symjava.symbolic.Expr; import symjava.symbolic.utils.JIT; import symjava.symbolic.utils.Utils; /** * A general Gauss Newton solver using SymJava for simbolic computations * instead of writing your own Jacobian matrix and Residuals */ public class GaussNewton { public static double[] solve(Expr eq, double[] init, double[][] data, int maxIter, double eps) { return solve((Eq)eq, init, data, maxIter, eps); } public static double[] solve(Expr eq, double[] init, double[][] data) { return solve((Eq)eq, init, data, 30, 1e-8); } public static double[] solve(Expr eq, double[][] data) { Eq eq1 = (Eq)eq; Expr[] params = eq1.getParams(); System.out.println("Model parameters: "+Utils.joinLabels(params, ",")); return solve((Eq)eq, new double[params.length], data, 30, 1e-8); } /** * Compile all the expressions * * @param eq * @param init * @param data * @param maxIter * @param eps * @return */ public static double[] solve2(Eq eq, double[] init, double[][] data, int maxIter, double eps) { int n = data.length; //Construct Jacobian Matrix and Residuals ExprVector res = new ExprVector(n); ExprMatrix J = new ExprMatrix(n, eq.getParams().length); Expr[] params = eq.getParams(); for(int i=0; i