package math.equation;

import math.matrix.Matrix;
import exception.IllegalDimensionException;
import exception.SingularException;

/*************************************************************************
 *  Compilation:  javac TestEquations.java
 *
 *  f0(x0, x1) = x0^3 - 3 x0 x1^2 -1 = 0
 *  f1(x0, x1) = 3x0^2 x1 - x1^3   = 0
 *
 *************************************************************************/

public class TestEquations implements Equations {

    public Matrix eval(Matrix x) {
        int m = x.getM();
        int n = x.getN();
        double x0 = x.get(0, 0);
        double x1 = x.get(1, 0);
        if (n == 1 && m == 2) {
            Matrix f = new Matrix(m, n);
            f.set(0, 0, x0*x0*x0 - 3*x0*x1*x1 - 1);
            f.set(1, 0, 3*x0*x0*x1 - x1*x1*x1);
            return f;
        }
        throw new RuntimeException("Illegal argument");
    }


    // Jacobian
    public Matrix jacobian(Matrix x) {
        int m = x.getM();
        int n = x.getN();
        double x0 = x.get(0, 0);
        double x1 = x.get(1, 0);
        if (n == 1 && m == 2) {
            Matrix J = new Matrix(m, m);
            J.set(0, 0, 3*x0*x0 - 3*x1*x1);
            J.set(1, 0, 6*x0);
            J.set(0, 1, -6*x0*x1);
            J.set(1, 1, 3*x0*x0 - 3*x1*x1);
            return J;
        }
        throw new RuntimeException("Illegal argument");
    }



    // sample client
    public static void main(String[] args) throws IllegalDimensionException, SingularException { 
        Equations f = new TestEquations();
        Matrix x = new Matrix(2, 1);
        Matrix root;
        x.set(0, 0, -0.6);
        x.set(1, 0,  0.6);
        root = EquationSolver.root(f, x);
        root.print(9, 6);

        x.set(0, 0,  0.9);
        x.set(1, 0, -0.1);
        root = EquationSolver.root(f, x);
        root.print(9, 6);
    }


}
