#include #include using namespace std; #include "ArrayVector.h" #include "Optimizer.h" #include "Optimizer.cpp" /* This will demonstrate the use of the Optimizer class to find a 4th degree polynomial fit to a set of 10 input (x, y) pairs. */ //the variables we are minimizing double a, b, c, d; //the X-Y pairs double XVector[10] = {-5.0, -4.0, -3.5, -2.5, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0}; double YVector[10] = {0.0, 1.2, 2.3, 4.1, 5.6, 5.5, 4.2, 3.1, 2.0, 1.0}; //the function we are trying to minimize double ErrorFunction() { int i; double ErrorTotal = 0.0, CurError, CurY; for(i=0;i<10;i++) { CurY = a + XVector[i] * (b + XVector[i] * (c + XVector[i] * d)); //get the approximate X value CurError = CurY - YVector[i]; //get the current difference ErrorTotal += CurError*CurError; //sum up the squared difference as the error } return ErrorTotal; } void LoadInitialGuess() { a = b = c = d = 1e-5; } void OutputState() { cout << "Error -> " << ErrorFunction() << endl; cout << "a -> " << a << endl; cout << "b -> " << b << endl; cout << "c -> " << c << endl; cout << "d -> " << d << endl; int i; cout << "X,\tY,\t,Guessed Y\n"; for(i=0;i<10;i++) { cout << XVector[i] << '\t' << YVector[i] << '\t' << //output the X-Y pair a + XVector[i] * (b + XVector[i] * (c + XVector[i] * d)) << endl; //output the polynomial approximation of Y, given X } } int main() { Optimizer O; //the optimizer itself O.Variables.Allocate(4); //make room for 4 variables O.Variables[0].Target = &a; O.Variables[1].Target = &b; O.Variables[2].Target = &c; O.Variables[3].Target = &d; //load pointers to each variable O.ConjugateReset(10); //reset the conjugate gradient algorithm. If you don't know what the repeat count //means for conjugate gradient, use a value between 10 and 100. It doesn't affect much. O.Error = ErrorFunction; //load the error function intro the optimizer LoadInitialGuess(); //load a (bad) initial guess OutputState(); //output the current state of the variables int i; for(i=0;i<100;i++) //iterate 100 times { cout << "Conjugate gradient iteration, Error -> " << ErrorFunction() << endl; //output the error O.ConjugateGradient(); //optimize (1 iteration) } OutputState(); //output the final state of the variables }