Example 2: Solve a Small Linear System with User Supplied Inner Product

A solution to a small linear system is found. The coefficient matrix is stored as a full matrix and no preconditioning is used. Typically, preconditioning is required to achieve convergence in a reasonable number of iterations. The user supplies a function to compute the inner product and norm within the Gram-Schmidt implementation.
import com.imsl.math.*;
import com.imsl.Messages;
import com.imsl.IMSLException;

public class GenMinResEx2 implements GenMinRes.Function, GenMinRes.Norm {
	static private double a[][] = {
            {33.0,   16.0,  72.0},
            {-24.0, -10.0, -57.0},
            {18.0,  -11.0,   7.0}
        };
        static private double	b[] = {129.0, -96.0, 8.5};
        // If A were to be read in from some outside source the   //
        // code to read the matrix could reside in a constructor. //

    public void amultp(double p[], double z[]) {
        double [] result;
        result = Matrix.multiply(a,p);
        System.arraycopy(result,0,z,0,z.length);
    }
    
    public double innerproduct(double[] x, double[] y) {
        int n = x.length;
        double tmp = 0.0;
        for (int i = 0;  i < n;  i++) {
            tmp += x[i] * y[i];
        }
        return tmp;
    }
    
    public double norm(double[] x) {
        int n = x.length;
        double tmp = 0.0;
        for (int i = 0;  i < n;  i++) {
            tmp += x[i] * x[i];
        }
        return Math.sqrt(tmp);
    }

    public static void main(String args[]) throws Exception {
        int       n = 3;
        
        GenMinResEx2 atp = new GenMinResEx2();
        
        // Construct a GenMinRes object
        GenMinRes gnmnrs = new GenMinRes(n, atp);
        gnmnrs.setVectorProducts(atp);

        // Solve Ax = b
        new PrintMatrix("x").print(gnmnrs.solve(b));     
    }
}

Output

   x
    0   
0  1    
1  1.5  
2  1    

Link to Java source.