numeric

C++ library with numerical algorithms
git clone git://src.adamsgaard.dk/numeric # fast
git clone https://src.adamsgaard.dk/numeric.git # slow
Log | Files | Refs | README | LICENSE Back to index

main.B.cpp (2518B)


      1 #include <iostream>
      2 #include <armadillo>
      3 #include <functional>
      4 #include "header.h"
      5 #include "functions.h"
      6 #include "downhill_simplex.h"
      7 using namespace arma;
      8 using namespace std;
      9 
     10 int main(int argc, char* argv[])
     11 {
     12   // Namespace declarations
     13   using std::cout;
     14 
     15   // Calculate machine precision
     16   double eps = 1.0f;
     17   while (1.0f + eps != 1.0f)
     18     eps /= 2.0f;
     19 
     20   cout << "\n\033[1;36m## Minimization with downhill-simplex, part B ##\033[0m\n";
     21 
     22   // Try amoeba on Rosenbrock's valley function
     23   cout << "\n\033[1;33m--- Rosenbrock's valley function ---\033[0m\n";
     24   int d = 2;
     25   vec p(2); p[0]=5; p[1]=6;
     26   if (verbose == true)
     27     p.print("Initial simplex is chosen around the point:");
     28   vector<vec> simplex;
     29   vector<vec> simplex_mod;
     30   for(int i=0; i<d+1; ++i) { 
     31     simplex.push_back(p);
     32     simplex_mod.push_back(p);
     33   }
     34   double dx = 1;
     35   for(int i=0; i<d; ++i) {
     36     simplex[i][i] += dx;
     37     simplex_mod[i][i] += dx;
     38   }
     39   amoeba A(rosenbrock, simplex);
     40   ncalls = 0;
     41   A.downhill(10.0f*eps);
     42   if (verbose == true)
     43     A.low().print("Lowest point:");
     44   cout << "Amoeba converged after " << ncalls << " calls\n";
     45   amoeba A_mod(rosenbrock, simplex_mod);
     46   ncalls = 0;
     47   A_mod.downhill_mod(10.0f*eps);
     48   if (verbose == true)
     49     A_mod.low().print("Lowest point (modified downhill)");
     50   cout << "Amoeba converged after " << ncalls << " calls with modified method\n";
     51 
     52 
     53   // Try amoeba on Himmelblau's function
     54   cout << "\n\033[1;33m--- Himmelblau's function ---\033[0m\n";
     55   vec p2(2); p2[0]=5; p2[1]=6;
     56   if (verbose == true)
     57     p2.print("Initial simplex is chosen around the point:");
     58   vector<vec> simplex2;
     59   vector<vec> simplex2_mod;
     60   for(int i=0; i<d+1; ++i) {
     61     simplex2.push_back(p2);
     62     simplex2_mod.push_back(p2);
     63   }
     64   double dx2 = 1;
     65   for(int i=0; i<d; ++i) {
     66     simplex2[i][i] += dx2;
     67     simplex2_mod[i][i] += dx2;
     68   }
     69   amoeba A2(himmelblau, simplex2);
     70   ncalls = 0;
     71   A2.downhill(10.0f*eps);
     72   if (verbose == true)
     73     A2.low().print("Lowest point:");
     74   cout << "Amoeba converged after " << ncalls << " calls\n";
     75   amoeba A2_mod(himmelblau, simplex2_mod);
     76   ncalls = 0;
     77   A2_mod.downhill_mod(10.0f*eps);
     78   if (verbose == true)
     79     A2_mod.low().print("Lowest point (modified downhill)");
     80   cout << "Amoeba converged after " << ncalls << " calls with modified method\n";
     81 
     82   // Return successfully
     83   return 0;
     84 }
     85 
     86 void check(const bool statement)
     87 {
     88   using std::cout;
     89   if (statement == true)
     90     cout << "\t\033[0;32mPassed\033[0m\n";
     91   else
     92     cout << "\t\033[1;31mFail!!\033[0m\n";
     93 }