samer@1: package eg.maths; samer@1: import samer.core.*; samer@1: import samer.maths.*; samer@1: import samer.maths.ops.*; samer@1: samer@1: public class QuadraticForm extends FunctionOfVector samer@1: { samer@1: VVector x, yy; samer@1: Matrix A; samer@1: MatrixTimesVector Ax; samer@1: double [] y; samer@1: samer@1: public QuadraticForm() { this(Shell.getInt("dimensions",2)); } samer@1: public QuadraticForm(int n) samer@1: { samer@1: x = new VVector("x",n); samer@1: yy = new VVector("y",n); samer@1: A = new Matrix("A",n,n); samer@1: Ax = new MatrixTimesVector(yy.array(),A); samer@1: y = yy.array(); samer@1: samer@1: Shell.put("functionOfVector",this); samer@1: Shell.put("vector",x); samer@1: } samer@1: samer@1: public double apply(double [] x) samer@1: { samer@1: Ax.run(x); samer@1: return -0.5*Mathx.dot(x,y); samer@1: } samer@1: samer@1: public VectorFunctionOfVector derivative() samer@1: { samer@1: return new VectorFunctionOfVector() { samer@1: samer@1: public void apply(double [] x) { samer@1: Ax.run(x); samer@1: Mathx.copy(y,x); samer@1: } samer@1: samer@1: public void apply(double [] x, double [] v) { samer@1: Ax.run(x); samer@1: Mathx.copy(y,v); samer@1: } samer@1: }; samer@1: } samer@1: }