KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > JSci > maths > polynomials > ComplexLagrangeBasis


1 package JSci.maths.polynomials;
2
3 import JSci.maths.Complex;
4 import JSci.maths.fields.Field;
5
6
7 /**
8  * A Lagrange base for polynomial over a complex field.
9  * For more detail
10  * @see JSci.maths.polynomials.RealLagrangeBasis
11  * @author b.dietrich
12  */

13 public class ComplexLagrangeBasis implements PolynomialBasis {
14     private ComplexPolynomial[] _basis;
15     private Complex[] _samplingsX;
16     private int _dim;
17
18     /** Creates a new instance of LagrangeBasis */
19     public ComplexLagrangeBasis( Field.Member[] samplings ) {
20         if ( samplings == null ) {
21             throw new NullPointerException JavaDoc();
22         }
23         _dim = samplings.length;
24         _samplingsX = ComplexPolynomialRing.toComplex( samplings );
25         buildBasis();
26     }
27
28     /**
29      *
30      * @param k
31      *
32      */

33     public Polynomial getBasisVector( int k ) {
34         return _basis[k];
35     }
36
37     /**
38      *
39      * @return the dimension of this basis
40      */

41     public int dimension() {
42         return _dim;
43     }
44
45     /**
46      *
47      */

48     public Field.Member[] getSamplingPoints() {
49         return _samplingsX;
50     }
51
52     /**
53      *
54      * @param coeff
55      *
56      */

57     public Polynomial superposition( Field.Member[] coeff ) {
58         if ( coeff == null ) {
59             throw new NullPointerException JavaDoc();
60         }
61         if ( coeff.length != _dim ) {
62             throw new IllegalArgumentException JavaDoc( "Dimensions do not match" );
63         }
64
65         Complex[] d = ComplexPolynomialRing.toComplex( coeff );
66
67         return superposition( d );
68     }
69
70     /**
71      *
72      * @param c
73      *
74      */

75     public ComplexPolynomial superposition( Complex[] c ) {
76         if ( c == null ) {
77             throw new NullPointerException JavaDoc();
78         }
79         if ( c.length != _dim ) {
80             throw new IllegalArgumentException JavaDoc( "Dimension of basis is " + _dim + ". Got "
81                                                 + c.length + " coefficients" );
82         }
83
84         ComplexPolynomial rp = (ComplexPolynomial) ComplexPolynomialRing.getInstance().zero();
85         for ( int k = 0; k < _dim; k++ ) {
86             ComplexPolynomial b = (ComplexPolynomial) getBasisVector( k );
87             ComplexPolynomial ba = b.scalarMultiply( c[k] );
88             rp = (ComplexPolynomial) rp.add( ba );
89         }
90
91         return rp;
92     }
93
94     private void buildBasis() {
95         _basis = new ComplexPolynomial[_dim];
96         for ( int k = 0; k < _dim; k++ ) {
97             _basis[k] = (ComplexPolynomial) ComplexPolynomialRing.getInstance().one();
98
99             Complex fac = Complex.ONE;
100             for ( int j = 0; j < _dim; j++ ) {
101                 if ( j == k ) {
102                     continue;
103                 } else {
104                     ComplexPolynomial n = new ComplexPolynomial(
105                                                   new Complex[] {
106                         (Complex) _samplingsX[j].negate(), Complex.ONE
107                     } );
108                     _basis[k] = (ComplexPolynomial) _basis[k].multiply( n );
109
110                     Complex a = _samplingsX[k];
111                     Complex b = _samplingsX[j];
112                     Complex dif = a.subtract( b );
113                     fac = fac.multiply( dif );
114                 }
115             }
116
117             _basis[k] = _basis[k].scalarDivide( fac );
118         }
119     }
120 }
121
Popular Tags