proj home

Files   Classes   Functions   Hierarchy  

desystest.cpp

Go to the documentation of this file.
00001 #include <cmath>
00002 #include <iostream>
00003 #include <iomanip>
00004 #include <fstream>
00005 using namespace std;
00006 
00007 #include <commandline.h>
00008 #include <desys.h>
00009 #include <desystest.h>
00010 #include <desystestspring2.h>
00011 #include <nintegration.h>
00012 #include <typedefs.h>
00013 
00014 // <TODO> Macro solution for 1D de's.
00015 // ie design a macro to plug in equation and get class.
00016 
00017 string desystest::doc[] =
00018 {
00019   "",
00020   "Euler on y''+y=0 where y(0)=1 and y'(0)=0.", 
00021   "TrapezoidEuler on y''+y=0 where y(0)=1 and y'(0)=0.",
00022   "Point in time - RungKutta on y''+y=0 where y(0)=1 and y'(0)=0.", 
00023   "Point in time - Euler on y''+y=0 as 2 equations using desys. ",
00024   "Spring mass system with 2 masses. " 
00025 };
00026 
00027 
00031 template< typename T >
00032 class desystestf3
00033 {
00034 public:
00035 
00036   T * xval;
00037   T * yi;
00038 
00039   desystestf3(T const * xval_, T const * yi_)
00040     : xval(xval_), yi(yi_) { *xval=0; yi[0]=1; }
00041 
00043   void operator ++ () {}
00044 
00046   void operator () (T &  Dz, T const z, T const x) const
00047     { Dz = z; }
00048 };
00049 
00050 
00051 
00052 
00053 void desystestprobleminfo()
00054 {
00055   cout << "y''+y = 0" << endl;
00056   cout << "y(0)=1, y'(0)=0" << endl;
00057   cout << "y=cos(x) by algebra." << endl;
00058   cout << endl;
00059 }
00060 
00061 /*
00062 template< class D >
00063 void desystest00( D & de )
00064 {
00065   de.xval = 0.0;
00066 
00067   de.yiGet(0,0) = 1.0;
00068   de.yiGet(1,0) = 0.0;
00069 
00070   desystestprobleminfo();
00071 
00072   cout << "Enter h: ";
00073   cin >> de.hi[0];
00074 
00075   double xmax;
00076   cout << "Enter xmax: ";
00077   cin >> xmax;
00078 
00079   for ( ; de.xval<xmax; )
00080     de();
00081 
00082   cout << SHOW(de.xval) << endl;
00083   cout << SHOW(de.yiGet(0,0)) << endl;
00084   cout << SHOW(de.yiGet(1,0)) << endl;
00085 }
00086 */
00087 
00088 void desystest::test01(int argc, char** argv)
00089 {
00090   commandline cmd(argc,argv); 
00091 
00092   //typedef nintegrationRK< desystestf1<double>, double > integrator;
00093   typedef nintegrationRK< f1<double>, double > integrator;
00094   //typedef nintegrationRK< desystestf3<double>, double > integrator;
00095   
00096   //desys< eul ,double > de(1,2);
00097   desys< integrator ,double > de(1,2);
00098 
00099   //de.yiGet(0,0)=1.0;
00100   //de.yiGet(0,1)=0.0;
00101 
00102 //  de.yiGet(0,0)=1.0;
00103 //  de.yiGet(0,1)=0.0;
00104   de.hstep=0.1;
00105   cmd.mapvar(de.hstep,"h");
00106   double xmax(0.3);
00107   cmd.mapvar(xmax,"xmax");
00108 
00109   cout << SHOW(de.xval) << endl;
00110   cout << SHOW(de.hstep) << endl;
00111   cout << SHOW(xmax) << endl;
00112 
00113   //cout << de << endl;
00114 
00115   double delta=1e-10;
00116   for (; de.xval+delta < xmax; de.eval() )
00117   {
00118 cout << "***---------***" << endl;
00119     cout << de << endl;
00120   }
00121   cout << de << endl;
00122 }
00123 
00124 void desystest::test02()
00125 {
00126   typedef nintegrationTrapezoidEuler< f1<double>, double > eul;
00127   
00128   desys< eul ,double > de(1,2);
00129 
00130   de.yiGet(0,0)=1.0;
00131   de.yiGet(0,1)=0.0;
00132   de.hstep = 0.001;
00133 
00134   cout << de << endl;
00135 
00136   for (; de.xval < 0.3; de.eval() );
00137     cout << de << endl;
00138   cout << de << endl;
00139 }
00140 
00141 int desystest::test03(int argc, char** argv)
00142 {
00143   typedef nintegrationRK< f1<double>, double > integrator;
00144   
00145   desys< integrator ,double > de(1,2);
00146 
00147   //de.yiGet(0,0)=1.0;
00148   //de.yiGet(0,1)=0.0;
00149   de.hstep=0.001;
00150 
00151   commandline cmd(argc,argv); 
00152   cmd.mapvar(de.hstep,"hstep");
00153 
00154 
00155   cout << de << endl;
00156 
00157   double time_end=0.3;
00158   cmd.mapvar(time_end,"time_end");
00159   cout << SHOW(time_end) << endl;
00160 
00161   // Iterate in time to time_end;
00162   for (; de.xval < time_end; de.eval() );
00163 
00164   cout << de << endl;
00165 
00166   double error[2];
00167   error[0] = abs(cos(de.xval) - de.yiGet(0,0));
00168   error[1] = abs(-sin(de.xval) - de.yiGet(0,1));
00169 
00170   cout << SHOW(error[0]) << endl;
00171   cout << SHOW(error[1]) << endl;
00172 
00173   double myerror=de.hstep*10;
00174   assertreturnOS( error[0] < myerror );
00175   assertreturnOS( error[1] < myerror );
00176 
00177   return 0;
00178 }
00179 
00180 
00183 class desystestf2
00184 {
00185 public:
00186 
00188   doublec * xval;
00190   doublec * yi;
00191 
00193   void equ01 (double & Dminus1, doublec y, doublec x ) const
00194     { Dminus1 = -yi[1]; }
00196   void equ02 (double & Dminus1, doublec y, doublec x ) const
00197     { Dminus1 = yi[0]; }
00198 
00200   uint current;
00201 
00202   desystestf2(doublec * xval_, doublec * yi_)
00203     : xval(xval_), yi(yi_), current(0)
00204     {}
00205 
00206   void operator () (double & Dminus1, doublec y, doublec x ) const
00207     { 
00208       switch (current)
00209       {
00210         case 0: equ01(Dminus1,y,x); break;
00211         case 1: equ02(Dminus1,y,x); break;
00212       }
00213     }
00214 
00215   void operator ++ ()
00216     { ++current; current %= 2; }
00217 };
00218 
00219 
00220 int desystest::test04(int argc, char** argv)
00221 {
00222 
00223   typedef nintegrationEuler< desystestf2, double > eul;
00224   
00225   desys< eul ,double > de(2,1);
00226 
00227   de.yiGet(0,0)=0.0;
00228   de.yiGet(1,0)=1.0;
00229   de.hstep=0.00001;
00230 
00231   commandline cmd(argc,argv); 
00232 
00233   cmd.mapvar(de.hstep,"hstep");
00234 
00235   double time_end=0.3;
00236   cmd.mapvar(time_end,"time_end");
00237   cout << SHOW(time_end) << endl;
00238 
00239   cout << de << endl;
00240 
00241   for (; de.xval < time_end; de.eval() );
00242 
00243   cout << de << endl;
00244 
00245 
00246   double error[2];
00247   error[0] = abs(cos(de.xval) - de.yiGet(1,0));
00248   error[1] = abs(-sin(de.xval) - de.yiGet(0,0));
00249 
00250   cout << SHOW(error[0]) << endl;
00251   cout << SHOW(error[1]) << endl;
00252 
00253   double myerror=de.hstep*100;
00254   assertreturnOS( error[0] < myerror );
00255   assertreturnOS( error[1] < myerror );
00256 
00257   return 0;
00258 }
00259 
00260 
00261 void desystest::test05(int argc, char** argv)
00262 {
00263   typedef nintegrationRK< desystestspring2, double > integrator;
00264   desys< integrator, double > de(2,2);
00265 
00266   commandline cmd(argc,argv); 
00267 
00268   double w0=1.0;
00269   double w1=0.0;
00270   double Dw0=0.3;
00271   double Dw1=0.2;
00272   double h=0.001;
00273 
00274   cmd.mapvar(w0,"w0");
00275   cmd.mapvar(Dw0,"Dw0");
00276   cmd.mapvar(w1,"w1");
00277   cmd.mapvar(Dw1,"Dw1");
00278   cmd.mapvar(h,"h");
00279 
00280   de.yiGet(0,0)=w0;
00281   de.yiGet(0,1)=Dw0;
00282   de.yiGet(1,0)=w1;
00283   de.yiGet(1,1)=Dw1;
00284   de.hstep=h;
00285 
00286   double k0=0.1;
00287   double k1=0.03;
00288   double k2=0.2;
00289 
00290   cmd.mapvar(k0,"k0");
00291   cmd.mapvar(k1,"k1");
00292   cmd.mapvar(k2,"k2");
00293   de.integrator.yDorder.ki[0] = k0;
00294   de.integrator.yDorder.ki[1] = k1;
00295   de.integrator.yDorder.ki[2] = k2;
00296 
00297   string filename("myfile.txt");
00298   cmd.mapvar(filename,"filename");
00299 
00300   ofstream fil(filename.c_str(),ios::trunc);
00301 
00302   de.xval = 0.0;
00303 
00304   cout << de << endl;
00305 
00306   double xmax(0.3);
00307   cmd.mapvar(xmax,"xmax");
00308 
00309   uint width(14);
00310 /*
00311 
00312   fil << setw(width) << de.xval;
00313   fil << setw(width) << de.yiGet(0,0);
00314   fil << setw(width) << de.yiGet(1,0);
00315   fil << endl;
00316 */
00317 
00318   long unsigned int sample=1;
00319   long unsigned int counter=0;
00320 
00321   cmd.mapvar(sample,"sample");
00322 
00323   for (; de.xval < xmax; de.eval(), ++counter )
00324   {
00325     if ((counter % sample)!=0)
00326       continue;
00327     
00328 
00329     fil << setw(width) << de.xval;
00330     fil << setw(width) << de.yiGet(0,0);
00331     fil << setw(width) << de.yiGet(1,0);
00332     fil << endl;
00333   }
00334 //  cout << de << endl;
00335 
00336 
00337 }
00338 
00339 
00340 
00341 

Generated on Fri Mar 4 00:49:29 2011 for Chelton Evans Source by  doxygen 1.5.8