00001
00002
00003
00004
00005
00006
00011
00012
00013
00014 #include "fvar.hpp"
00015
00016 #ifdef __TURBOC__
00017 #pragma hdrstop
00018 #include <iostream.h>
00019 #endif
00020
00021 #ifdef __ZTC__
00022 #include <iostream.hpp>
00023 #endif
00024
00025
00026 #include <stdio.h>
00027 #ifndef __SUN__
00028 #endif
00029 #include <math.h>
00030
00031
00032 dvar_matrix exp(const dvar_matrix& m);
00033 dvar_matrix log(const dvar_matrix& m);
00034 dvar_matrix sin(const dvar_matrix& m);
00035 dvar_matrix cos(const dvar_matrix& m);
00036 dvar_matrix tan(const dvar_matrix& m);
00037 dvar_matrix pow(const dvar_matrix& m, const double e);
00038 dvar_matrix pow(const dvar_matrix& m, const prevariable& e);
00039 dvar_matrix pow(const dmatrix& m, const prevariable& e);
00040 dvar_matrix pow(const dvar_matrix& m, int e);
00041 dvar_matrix elem_prod(const dvar_matrix& m, const dvar_matrix& m2);
00042 dvar_matrix elem_prod(const dvar_matrix& m, const dmatrix& m2);
00043 dvar_matrix elem_prod(const dmatrix& m, const dvar_matrix& m2);
00044 dvar_matrix elem_div(const dvar_matrix& m, const dvar_matrix& m2);
00045 dvar_matrix elem_div(const dvar_matrix& m, const dmatrix& m2);
00046 dvar_matrix elem_div(const dmatrix& m, const dvar_matrix& m2);
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00073 dvar_matrix use_shape(const dvar_matrix& m)
00074 {
00075 ivector cmin(m.rowmin(),m.rowmax());
00076 ivector cmax(m.rowmin(),m.rowmax());
00077 for (int i=m.rowmin();i<=m.rowmax();i++)
00078 {
00079 cmin(i)=m(i).indexmin();
00080 cmax(i)=m(i).indexmax();
00081 }
00082 dvar_matrix tmp(m.rowmin(),m.rowmax(),cmin,cmax);
00083 return tmp;
00084 }
00085
00090 dmatrix use_shape(const dmatrix& m)
00091 {
00092 ivector cmin(m.rowmin(),m.rowmax());
00093 ivector cmax(m.rowmin(),m.rowmax());
00094 for (int i=m.rowmin();i<=m.rowmax();i++)
00095 {
00096 cmin(i)=m(i).indexmin();
00097 cmax(i)=m(i).indexmax();
00098 }
00099 dmatrix tmp(m.rowmin(),m.rowmax(),cmin,cmax);
00100 return tmp;
00101 }
00102
00107 dvar_matrix pow(const dvar_matrix& m, int e)
00108 {
00109 dvar_matrix tmp=use_shape(m);
00110 for (int i=m.rowmin();i<=m.rowmax();i++)
00111 {
00112 tmp(i)=pow(m(i),e);
00113 }
00114 return tmp;
00115 }
00116
00121 dvar_matrix pow(const dmatrix& m, const prevariable& e)
00122 {
00123 dvar_matrix tmp=use_shape(m);
00124 for (int i=m.rowmin();i<=m.rowmax();i++)
00125 {
00126 tmp(i)=pow(m(i),e);
00127 }
00128 return tmp;
00129 }
00130
00135 dvar_matrix pow(const dvar_matrix& m, const prevariable& e)
00136 {
00137 dvar_matrix tmp=use_shape(m);
00138 for (int i=m.rowmin();i<=m.rowmax();i++)
00139 {
00140 tmp(i)=pow(m(i),e);
00141 }
00142 return tmp;
00143 }
00144
00149 dvar_matrix pow(const dvar_matrix& m, const double e)
00150 {
00151 dvar_matrix tmp=use_shape(m);
00152 for (int i=m.rowmin();i<=m.rowmax();i++)
00153 {
00154 tmp(i)=pow(m(i),e);
00155 }
00156 return tmp;
00157 }
00158
00163 dvar_matrix tan(const dvar_matrix& m)
00164 {
00165 dvar_matrix tmp=use_shape(m);
00166 for (int i=m.rowmin();i<=m.rowmax();i++)
00167 {
00168 tmp(i)=tan(m(i));
00169 }
00170 return tmp;
00171 }
00172
00177 dvar_matrix cos(const dvar_matrix& m)
00178 {
00179 dvar_matrix tmp=use_shape(m);
00180 for (int i=m.rowmin();i<=m.rowmax();i++)
00181 {
00182 tmp(i)=cos(m(i));
00183 }
00184 return tmp;
00185 }
00186
00191 dvar_matrix sin(const dvar_matrix& m)
00192 {
00193 dvar_matrix tmp=use_shape(m);
00194 for (int i=m.rowmin();i<=m.rowmax();i++)
00195 {
00196 tmp(i)=sin(m(i));
00197 }
00198 return tmp;
00199 }
00200
00205 dvar_matrix log(const dvar_matrix& m)
00206 {
00207 dvar_matrix tmp=use_shape(m);
00208 for (int i=m.rowmin();i<=m.rowmax();i++)
00209 {
00210 tmp(i)=log(m(i));
00211 }
00212 return tmp;
00213 }
00214
00219 dvar_matrix sqrt(const dvar_matrix& m)
00220 {
00221 dvar_matrix tmp=use_shape(m);
00222 for (int i=m.rowmin();i<=m.rowmax();i++)
00223 {
00224 tmp(i)=sqrt(m(i));
00225 }
00226 return tmp;
00227 }
00228
00233 dvar_matrix sqr(const dvar_matrix& m)
00234 {
00235 dvar_matrix tmp=use_shape(m);
00236 for (int i=m.rowmin();i<=m.rowmax();i++)
00237 {
00238 tmp(i)=sqr(m(i));
00239 }
00240 return tmp;
00241 }
00242
00247 dvar_matrix exp(const dvar_matrix& m)
00248 {
00249 dvar_matrix tmp=use_shape(m);
00250 for (int i=m.rowmin();i<=m.rowmax();i++)
00251 {
00252 tmp(i)=exp(m(i));
00253 }
00254 return tmp;
00255 }
00256
00261 dvar_matrix elem_div(const dvar_matrix& m, const dvar_matrix& m2)
00262 {
00263 dvar_matrix tmp=use_shape(m);
00264 for (int i=m.rowmin();i<=m.rowmax();i++)
00265 {
00266 tmp(i)=elem_div(m(i),m2(i));
00267 }
00268 return tmp;
00269 }
00270
00275 dvar_matrix elem_div(const dmatrix& m,const dvar_matrix& m2)
00276 {
00277 dvar_matrix tmp=use_shape(m);
00278 for (int i=m.rowmin();i<=m.rowmax();i++)
00279 {
00280 tmp(i)=elem_div(m(i),m2(i));
00281 }
00282 return tmp;
00283 }
00284
00289 dvar_matrix elem_div(const dvar_matrix& m, const dmatrix& m2)
00290 {
00291 dvar_matrix tmp=use_shape(m);
00292 for (int i=m.rowmin();i<=m.rowmax();i++)
00293 {
00294 tmp(i)=elem_div(m(i),m2(i));
00295 }
00296 return tmp;
00297 }
00298
00303 dvar_matrix elem_prod(const dvar_matrix& m, const dvar_matrix& m2)
00304 {
00305
00306 dvar_matrix tmp(m.indexmin(),m.indexmax());
00307 for (int i=m.rowmin();i<=m.rowmax();i++)
00308 {
00309 tmp(i)=elem_prod(m(i),m2(i));
00310 }
00311 return tmp;
00312 }
00313
00318 dvar_matrix elem_prod(const dmatrix& m, const dvar_matrix& m2)
00319 {
00320 dvar_matrix tmp=use_shape(m);
00321 for (int i=m.rowmin();i<=m.rowmax();i++)
00322 {
00323 tmp(i)=elem_prod(m(i),m2(i));
00324 }
00325 return tmp;
00326 }
00327
00332 dvar_matrix elem_prod(const dvar_matrix& m, const dmatrix& m2)
00333 {
00334 dvar_matrix tmp=use_shape(m);
00335 for (int i=m.rowmin();i<=m.rowmax();i++)
00336 {
00337 tmp(i)=elem_prod(m(i),m2(i));
00338 }
00339 return tmp;
00340 }
00341
00346 dvar_matrix operator+(const double x, const dvar_matrix& m)
00347 {
00348 dvar_matrix tmp=use_shape(m);
00349 for (int i=m.rowmin();i<=m.rowmax();i++)
00350 {
00351 tmp(i)=x+m(i);
00352 }
00353 return tmp;
00354 }
00355
00360 dvar_matrix operator*(const prevariable& x, const dvar_matrix& m)
00361 {
00362 dvar_matrix tmp=use_shape(m);
00363 for (int i=m.rowmin();i<=m.rowmax();i++)
00364 {
00365 tmp(i)=x*m(i);
00366 }
00367 return tmp;
00368 }
00369
00374 dvar_matrix operator+(const dvar_matrix& m, const double x)
00375 {
00376 dvar_matrix tmp=use_shape(m);
00377 for (int i=m.rowmin();i<=m.rowmax();i++)
00378 {
00379 tmp(i)=m(i)+x;
00380 }
00381 return tmp;
00382 }
00383
00388 dvar_matrix operator+(const dvariable& x, const dvar_matrix& m)
00389 {
00390 dvar_matrix tmp=use_shape(m);
00391 for (int i=m.rowmin();i<=m.rowmax();i++)
00392 {
00393 tmp(i)=x+m(i);
00394 }
00395 return tmp;
00396 }
00397
00402 dvar_matrix operator+(const dvar_matrix& m, const dvariable& x)
00403 {
00404 dvar_matrix tmp=use_shape(m);
00405 for (int i=m.rowmin();i<=m.rowmax();i++)
00406 {
00407 tmp(i)=m(i)+x;
00408 }
00409 return tmp;
00410 }
00411
00416 dvar_matrix operator*(const dvar_matrix& m, const prevariable& x)
00417 {
00418 dvar_matrix tmp=use_shape(m);
00419 for (int i=m.rowmin();i<=m.rowmax();i++)
00420 {
00421 tmp(i)=m(i)*x;
00422 }
00423 return tmp;
00424 }
00425
00430 dvar_matrix operator-(const dvar_matrix& m, const double x)
00431 {
00432 dvar_matrix tmp=use_shape(m);
00433 double t=-x;
00434 for (int i=m.rowmin();i<=m.rowmax();i++)
00435 {
00436 tmp(i)=m(i)+t;
00437 }
00438 return tmp;
00439 }
00440
00445 dvar_matrix operator-(const double x, const dvar_matrix& m)
00446 {
00447 dvar_matrix tmp=use_shape(m);
00448 for (int i=m.rowmin();i<=m.rowmax();i++)
00449 {
00450 tmp(i)=x-m(i);
00451 }
00452 return tmp;
00453 }
00454
00459 dvar_matrix operator-(const dvar_matrix& m, const dvariable& x)
00460 {
00461 dvar_matrix tmp=use_shape(m);
00462 for (int i=m.rowmin();i<=m.rowmax();i++)
00463 {
00464 tmp(i)=m(i)-x;
00465 }
00466 return tmp;
00467 }
00468
00473 dvar_matrix operator-(const dvariable& x, const dvar_matrix& m)
00474 {
00475 dvar_matrix tmp=use_shape(m);
00476 for (int i=m.rowmin();i<=m.rowmax();i++)
00477 {
00478 tmp(i)=x-m(i);
00479 }
00480 return tmp;
00481 }