Changeset 958 in Sophya for trunk/SophyaLib/NTools/poly.cc
- Timestamp:
- Apr 18, 2000, 3:38:53 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/poly.cc
r938 r958 4 4 #include "fioarr.h" 5 5 6 //++ 7 // Class Poly 8 // Lib Outils++ 9 // include poly.h 10 // 11 // Classe de calcul sur polynômes à une variable. 12 //-- 13 14 //++ 15 // Links Parents 16 // Vector 17 //-- 18 19 //++ 20 // Titre Constructeurs 21 //-- 22 23 24 ////////////////////////////////////////////////////////////////////////// 25 //++ 26 // Poly::Poly(int degre=0) 27 // 28 // Crée un nouveau polynôme, en allouant de la place pour 29 // le degré spécifié. 30 //-- 31 6 //////////////////////////////////////////////////////////// 7 //////////////////////////////////////////////////////////// 8 //////////////////////////////////////////////////////////// 9 //////////////////////////////////////////////////////////// 10 //////////////////////////////////////////////////////////// 11 /*! 12 \class SOPHYA::Poly 13 \ingroup NTools 14 One dimensional polynomials class. 15 */ 16 17 //! Constructor 18 /*! Create a 1D polynomial of degre \b degre */ 32 19 Poly::Poly(int degre) 33 20 : TVector<r_8>(degre+1), dirty(0), deg(0) … … 36 23 } 37 24 38 // ++25 //! Constructor by copy 39 26 Poly::Poly(Poly const& a) 40 //41 // Constructeur par copie.42 //--43 27 :TVector<r_8>(a), dirty(a.dirty), deg(a.deg) 44 28 { … … 46 30 } 47 31 48 32 //! update degre 33 /*! update degre (that could be changed after operations) */ 49 34 void Poly::UpdateDeg() const 50 35 { … … 56 41 } 57 42 58 //++ 59 // Titre Méthodes 60 //-- 61 62 //++ 63 // double& Poly::operator[](int i) 64 // Permet d'accéder au coefficient de degré i (avec version 65 // const). 66 //-- 67 68 //++ 43 //! compute value P(\b x) 69 44 double Poly::operator()(double x) const 70 //71 // Calcule la valeur du polynôme au point x.72 //--73 45 { 74 46 UpdateDegIfDirty(); … … 81 53 } 82 54 83 // ++55 //! Replace p(x) by its derivate 84 56 void Poly::Derivate() 85 //86 // Remplace le polynôme par le polynôme dérivé.87 //--88 57 { 89 58 UpdateDegIfDirty(); … … 96 65 97 66 98 // ++67 //! Return the derivate in \b der(x) 99 68 void Poly::Derivate(Poly& der) const 100 //101 // Retourne dans der le polynôme dérivé.102 //--103 69 { 104 70 UpdateDegIfDirty(); … … 110 76 111 77 112 //++ 78 //! Return the roots of the polynomial into \b roots 79 /*! 80 This works until degre 2 81 \return the number of roots 82 */ 113 83 int Poly::Roots(TVector<r_8>& roots) const 114 //115 // Retourne dans roots les racines réelles, si on sait116 // les calculer. Retourne le nombre de racines.117 //--118 84 { 119 85 UpdateDegIfDirty(); … … 135 101 136 102 137 //++ 103 //! Return root \b r for a degre 1 polynomial 104 /*! \return return 1 if succes, 0 if not */ 138 105 int Poly::Root1(double& r) const 139 //140 // Seulement si le polynôme est de degré 1: retourne141 // la racine dans "r". Retourne 1 (nombre de racines).142 //--143 106 { 144 107 UpdateDegIfDirty(); … … 150 113 } 151 114 152 //++ 115 //! Return roots \b r1 and \b r2 for a degre 2 polynomial 116 /*! \return return the number of roots found */ 153 117 int Poly::Root2(double& r1, double& r2) const 154 //155 // Seulement si le polynôme est de degre 2: retourne156 // les racines dans "r1" et "r2". Retourne 0, 1 ou 2157 // (nombre de racines).158 //--159 118 { 160 119 UpdateDegIfDirty(); … … 172 131 } 173 132 174 // ++133 //! Operator P(x) = a(x) 175 134 Poly& Poly::operator = (Poly const& a) 176 //177 // Opérateur d'affectation.178 //--179 135 { 180 136 if (this == &a) return *this; … … 185 141 } 186 142 187 //++ 188 // Titres Opérations sur polynômes 189 //-- 190 191 //++ 143 //! Perform P(x) += b(x) 192 144 Poly& Poly::operator += (Poly const& b) 193 //194 //--195 145 { 196 146 UpdateDegIfDirty(); … … 206 156 } 207 157 208 // ++158 //! Perform P(x) -= b(x) 209 159 Poly& Poly::operator -= (Poly const& b) 210 //211 //--212 160 { 213 161 UpdateDegIfDirty(); … … 223 171 } 224 172 225 // ++173 //! Perform P(x) *= b(x) 226 174 Poly& Poly::operator *= (double a) 227 //228 //--229 175 { 230 176 UpdateDegIfDirty(); … … 233 179 } 234 180 235 // ++181 //! Return P(x) = *this(x) * b(x) 236 182 Poly Poly::Mult(Poly const& b) const 237 //238 //--239 183 { 240 184 Poly c(deg + b.deg); … … 254 198 } 255 199 256 // ++200 //! Print on stream \b s 257 201 void Poly::Print(ostream& s, int_4 , bool ) const 258 //259 // Impresssion.260 //--261 202 { 262 203 UpdateDegIfDirty(); … … 274 215 } 275 216 276 //++ 217 //! Fit datas by a polynomial 218 /*! 219 Fit y(x) by a polynimial P(x) 220 \param x : x datas 221 \param y : y datas 222 \param degre : degre of the polynomial P(x) to be fitted 223 \warning result is stored in the current object 224 \return return chisquare 225 */ 277 226 double Poly::Fit(TVector<r_8> const& x, TVector<r_8> const& y, int degre) 278 //279 // Ajustement polynomial par moindre carrés. Un polynôme de280 // degré "degre" est ajusté sur les données "x" et "y", et stocké dans281 // l'objet courant. Retourne le chi2.282 //--283 227 { 284 228 int n = x.NElts(); … … 303 247 } 304 248 305 //++ 249 //! Fit datas with errors by a polynomial 250 /*! 251 Fit y(x) by a polynimial P(x) 252 \param x : x datas 253 \param y : y datas 254 \param erry2 : errors squared on y 255 \param degre : degre of the polynomial P(x) to be fitted 256 \warning result is stored in the current object 257 \return \b errcoeff : errors on the coefficients 258 \return return chisquare 259 */ 306 260 double Poly::Fit(TVector<r_8> const& x, TVector<r_8> const& y, 307 261 TVector<r_8> const& erry2, int degre,TVector<r_8>& errCoef) 308 //309 // Ajustement polynomial par moindre carrés. Un polynôme de310 // degré est ajusté sur les données x et y, et stocké dans311 // l'objet courant. erry2 contient le carre des erreurs sur y.312 // Retourne le chi2.313 //--314 262 { 315 263 int n = x.NElts(); … … 337 285 338 286 339 //++ 340 // Poly Poly::power(int n) const 341 // 342 // Retourne le polynôme à la puissance n 343 //-- 344 287 //! Return the polynomial at power \b n : ( \f$ P(x)^n \f$ ) 345 288 Poly Poly::power(int n) const // a accelerer !!! 346 289 { … … 351 294 } 352 295 353 // ++296 //! Substitue polynomial and return P\f$ (b(x)) \f$ 354 297 Poly Poly::operator() (Poly const& b) const 355 //356 // Substitution d'un polynôme dans un autre.357 //--358 298 { 359 299 Poly c(b.Degre()*Degre()); … … 365 305 366 306 ////////////////////////////////////////////////////////////////////////// 307 //! For persistance management 367 308 void ObjFileIO<Poly>::ReadSelf(PInPersist& is) 368 309 { … … 375 316 } 376 317 318 //! For persistance management 377 319 void ObjFileIO<Poly>::WriteSelf(POutPersist& os) const 378 320 { … … 385 327 386 328 ////////////////////////////////////////////////////////////////////////// 329 /*! \ingroup NTools 330 \fn binomial(int,int) 331 Return the binomial coefficient \f$ {C_n}^p \f$. 332 */ 387 333 int binomial(int n, int p) 388 334 { … … 393 339 } 394 340 395 ////////////////////////////////////////////////////////////////////////// 396 // ******************* POLY 2 VARIABLES ****************** 397 //++ 398 // Class Poly2 399 // Lib Outils++ 400 // include poly.h 401 // 402 // Classe de calcul sur polynômes à deux variables. 403 //-- 404 405 //++ 406 // Links Parents 407 // Vector 408 //-- 409 410 //++ 411 // Titre Constructeurs 412 //-- 413 414 //++ 341 342 //////////////////////////////////////////////////////////// 343 //////////////////////////////////////////////////////////// 344 //////////////////////////////////////////////////////////// 345 //////////////////////////////////////////////////////////// 346 //////////////////////////////////////////////////////////// 347 /*! 348 \class SOPHYA::Poly2 349 \ingroup NTools 350 Two dimensional polynomials class. 351 */ 352 353 //! Constructor of 2D polynomial of degres \b degreX \b degreY 415 354 Poly2::Poly2(int degreX, int degreY) 416 //417 // Crée un polynôme de degrés partiels degreX et degreY.418 //--419 355 :TVector<r_8>((degreX+1)*(degreY+1)), dirty(0), 420 356 maxDegX(degreX), maxDegY(degreY), degX(0), degY(0), deg(0) … … 423 359 } 424 360 425 // ++361 //! Constructor of 2D polynomial \f$ P(x,y) = px(x) * py(y) \f$ 426 362 Poly2::Poly2(Poly const& polX, Poly const& polY) 427 //428 // Crée un polynôme à deux variables comme produit429 // de deux polynômes à une variable, p2(x,y)=px(x)py(y)430 //--431 363 :TVector<r_8>((polX.Degre()+1)*(polY.Degre()+1)), dirty(0), 432 364 maxDegX(polX.Degre()), maxDegY(polY.Degre()), … … 439 371 } 440 372 441 // ++373 //! Constructor by copy 442 374 Poly2::Poly2(Poly2 const& a) 443 //444 // Constructeur par copie.445 //--446 375 :TVector<r_8>(a), dirty(a.dirty), 447 376 maxDegX(a.maxDegX), maxDegY(a.maxDegY), … … 451 380 } 452 381 453 454 //++ 455 // Titre Méthodes 456 //-- 457 458 //++ 382 //! Operator P(x) = a(x) 459 383 Poly2& Poly2::operator = (Poly2 const& a) 460 //461 // Opérateur d'affectation.462 //--463 384 { 464 385 if (this == &a) return *this; … … 475 396 } 476 397 477 // ++398 //! Re-allocate space for 2D polynomial with partial degres \b degreX \b degreY 478 399 void Poly2::Realloc(int degreX, int degreY) 479 //480 // Redimensionne le polynôme comme etant un481 // polynôme de degrés partiels degreX et degreY.482 //--483 400 { 484 401 UpdateDegIfDirty(); … … 499 416 500 417 418 //! update degres 419 /*! update degres (that could be changed after operations) */ 501 420 void Poly2::UpdateDeg() const 502 421 { … … 514 433 } 515 434 516 //++ 517 // int Poly2::DegX() const 518 // Degré partiel en X. 519 // int Poly2::DegY() const 520 // Degré partiel en Y 521 // int Poly2::MaxDegX() const 522 // Degré partiel maximum (alloué) en X 523 // int Poly2::MaxDegY() const 524 // Degré partiel maximum (alloué) en Y 525 // int Poly2::Deg() const 526 // Degré total. 527 //-- 528 529 //++ 530 // double& Poly2::Coef(int dx, int dy) 531 // Retourne le coefficient de x^dx y^dy 532 // (avec aussi version const). 533 //-- 534 535 //++ 435 //! Return P(\b x, \b y) 536 436 double Poly2::operator()(double x, double y) const 537 //538 // Retourne la valeur en (x,y).539 //--540 437 { 541 438 UpdateDegIfDirty(); … … 553 450 } 554 451 555 //++ 452 //! Fit datas by a polynomial 453 /*! 454 Fit z(x,y) by a polynimial P(x,y) 455 \param x : x datas 456 \param y : y datas 457 \param z : z datas 458 \param degreX : partial degre on X 459 \param degreY : partial degre on Y 460 \warning result is stored in the current object 461 \return return chisquare 462 */ 556 463 double Poly2::Fit(TVector<r_8> const& x, TVector<r_8> const& y, 557 464 TVector<r_8> const& z, int degreX, int degreY) 558 //559 // Ajustement par moindre carrés z = P(x,y), degrés partiels imposés.560 //--561 465 { 562 466 int n = x.NElts(); … … 586 490 } 587 491 588 589 //++ 492 //! Fit datas with errors by a polynomial 493 /*! 494 Fit z(x,y) by a polynimial P(x,y) 495 \param x : x datas 496 \param y : y datas 497 \param z : z datas 498 \param errz2 : errors squared on z 499 \param degreX : partial degre on X 500 \param degreY : partial degre on Y 501 \warning result is stored in the current object 502 \return \b errcoeff : errors on the coefficients 503 \return return chisquare 504 */ 590 505 double Poly2::Fit(TVector<r_8> const& x, TVector<r_8> const& y, TVector<r_8> const& z, 591 506 TVector<r_8> const& errz2, int degreX, int degreY, 592 507 TVector<r_8>& errCoef) 593 //594 // Ajustement par moindre carrés z = P(x,y), degrés partiels imposés,595 // et erreurs^2 sur z dans errz2.596 //--597 508 { 598 509 int n = x.NElts(); … … 624 535 } 625 536 626 //++ 537 //! Fit datas by a polynomial 538 /*! 539 Fit z(x,y) by a polynimial P(x,y) 540 \param x : x datas 541 \param y : y datas 542 \param z : z datas 543 \param degre : total degre 544 \warning result is stored in the current object 545 \return return chisquare 546 */ 627 547 double Poly2::Fit(TVector<r_8> const& x, TVector<r_8> const& y, 628 548 TVector<r_8> const& z, int degre) 629 //630 // Ajustement par moindre carrés z = P(x,y), degré total imposé.631 //--632 549 { 633 550 int n = x.NElts(); … … 668 585 } 669 586 670 671 //++ 587 //! Fit datas with errors by a polynomial 588 /*! 589 Fit z(x,y) by a polynimial P(x,y) 590 \param x : x datas 591 \param y : y datas 592 \param z : z datas 593 \param errz2 : errors squared on z 594 \param degre : total degre 595 \warning result is stored in the current object 596 \return \b errcoeff : errors on the coefficients 597 \return return chisquare 598 */ 672 599 double Poly2::Fit(TVector<r_8> const& x, TVector<r_8> const& y, 673 600 TVector<r_8> const& z,TVector<r_8> const& errz2, 674 601 int degre, TVector<r_8>& errCoef) 675 //676 // Ajustement par moindre carrés z = P(x,y), degré total imposé,677 // et erreurs^2 sur z dans errz2.678 //--679 602 { 680 603 int n = x.NElts(); … … 721 644 } 722 645 723 // ++646 //! Print on stream \b s 724 647 void Poly2::Print(ostream& s, int_4 , bool ) const 725 //726 // Impression sur stream s.727 //--728 648 { 729 649 UpdateDegIfDirty(); … … 750 670 } 751 671 752 //++ 753 // Titre Opérations 754 //-- 755 756 //++ 672 //! Operator: return P(x) = *this(x) + b(x) 757 673 Poly2& Poly2::operator += (Poly2 const& b) 758 //759 //--760 674 { 761 675 if (maxDegX < b.DegX() || maxDegY < b.DegY()) … … 774 688 } 775 689 776 // ++690 //! Operator: return P(x) = *this(x) - b(x) 777 691 Poly2& Poly2::operator -= (Poly2 const& b) 778 //779 //--780 692 { 781 693 if (maxDegX < b.DegX() || maxDegY < b.DegY()) … … 794 706 } 795 707 796 // ++708 //! Operator: return P(x) = *this(x) * a 797 709 Poly2& Poly2::operator *= (double a) 798 //799 //--800 710 { 801 711 for (int i=0; i<NElts(); i++) … … 805 715 } 806 716 807 // ++717 //! Operator: return P(x) = *this(x) * b(x) 808 718 Poly2 Poly2::Mult(Poly2 const& b) const 809 //810 //--811 719 { 812 720 Poly2 c(DegX() + b.DegX(), DegY() + b.DegY()); … … 822 730 } 823 731 824 // ++732 //! Return \f$ P(x,y)^n \f$ 825 733 Poly2 Poly2::power(int n) const 826 //827 // Calcule le polynôme P(x,y)^n828 //--829 734 { 830 735 if (n < 0) THROW(rangeCheckErr); … … 835 740 836 741 837 // ++742 //! substitute and return \f$ P(a(x),b(x)) \f$ 838 743 Poly2 Poly2::operator() (Poly const& a, Poly const& b) const 839 //840 // Substitution de deux polynômes en X et Y,841 // P2(pa(x), pb(y)).842 //--843 744 { 844 745 UpdateDegIfDirty(); … … 854 755 } 855 756 856 // ++757 //! substitute and return 2D polynomial \f$ P(a(x,y)) \f$, P is a 1D polynomial 857 758 Poly2 Poly::operator() (Poly2 const& a) const 858 //859 // Substitution d'un polynôme à deux variables dans860 // un polynôme à une variable, P(P2(x,y)).861 //--862 759 { 863 760 Poly2 c(a.MaxDegX()*Degre(), a.MaxDegY()*Degre()); … … 869 766 870 767 ////////////////////////////////////////////////////////////////////////// 768 //! For persistance management 871 769 void ObjFileIO<Poly2>::ReadSelf(PInPersist& is) 872 770 { … … 879 777 } 880 778 779 //! For persistance management 881 780 void ObjFileIO<Poly2>::WriteSelf(POutPersist& os) const 882 781 {
Note:
See TracChangeset
for help on using the changeset viewer.