Files Classes Functions Hierarchy
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
1.5.8