source: Sophya/trunk/SophyaLib/NTools/poly.h@ 756

Last change on this file since 756 was 552, checked in by ansari, 26 years ago

namespace changed to SOPHYA cmv 5/11/99

File size: 6.5 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2//
3// $Id: poly.h,v 1.4 1999-11-05 13:08:31 ansari Exp $
4//
5
6// Des polynomes avec des operations de bases et surtout des fits.
7
8#ifndef POLY_SEEN
9#define POLY_SEEN
10
11#include "objfio.h"
12#include <stdio.h>
13#include "peida.h"
14#include "tvector.h"
15#include "ppersist.h"
16#include "anydataobj.h"
17
18namespace SOPHYA {
19
20class Poly2;
21
22//////////////////////////////////////////////////////////////////////////
23class Poly : public Vector {
24 friend class ObjFileIO<Poly>;
25public:
26 Poly(int degre = 0);
27 Poly(Poly const& a);
28
29 enum {classId = ClassId_Poly1};
30 int_4 ClassId() const { return classId; }
31
32 inline int Degre() const {UpdateDegIfDirty(); return deg;}
33
34 inline void Realloc(int n, bool force=false) {Vector::Realloc(n+1,force);}
35
36 inline double operator[](int i) const {return Element(i);}
37 inline double& operator[](int i) {dirty = 1; return Element(i);}
38 // Retourne le coefficient de degre i
39
40 double operator()(double x) const;
41 // Retourne la valeur prise en x.
42
43 void Derivate();
44 // Derive le polynome en place
45
46 void Derivate(Poly& der) const;
47 // Derive le polynome dans un autre
48
49 int Roots(Vector& roots) const;
50 // retourne les racines si on peut les calculer...
51
52 int Root1(double& r) const;
53 // special degre 1
54
55 int Root2(double& r1, double& r2) const;
56 // special degre 2
57
58 Poly& operator = (Poly const& b);
59 Poly& operator += (Poly const& b);
60 Poly& operator -= (Poly const& b);
61
62 Poly& operator *= (double a);
63
64 Poly Mult(Poly const& b) const;
65
66 Poly power(int n) const;
67 Poly operator() (Poly const& b) const;
68 Poly2 operator() (Poly2 const& b) const;
69
70 void Print(ostream& s) const;
71
72 double Fit(Vector const& x, Vector const& y, int degre);
73 // Fit d'un polynome de degre donne sur les x et y.
74
75 double Fit(Vector const& x, Vector const& y, Vector const& erry2, int degre,
76 Vector& errCoef);
77 // En plus, on fournit les carres des erreurs sur y et on a les erreurs
78 // sur les coefficients dans un vecteur.
79
80private:
81 int dirty;
82 int_4 deg;
83 void UpdateDeg() const;
84 void UpdateDegIfDirty() const {if (dirty) UpdateDeg();}
85};
86
87inline Poly operator* (Poly const& a, Poly const& b)
88 { return a.Mult(b); }
89
90inline Poly operator+ (Poly const& a, Poly const& b)
91 { Poly c((a.Degre() > b.Degre())?(a.Degre()+1):(b.Degre()+1));
92 c = a; c += b; return c; }
93
94inline Poly operator- (Poly const& a, Poly const& b)
95 { Poly c((a.Degre() > b.Degre())?(a.Degre()+1):(b.Degre()+1));
96 c = a; c -= b; return c; }
97
98inline Poly operator* (double a, Poly const& b)
99 { Poly c(b); c *= a; return c; }
100
101inline ostream& operator << (ostream& s, const Poly& a)
102 { a.Print(s); return s; }
103
104//////////////////////////////////////////////////////////////////////////
105inline POutPersist& operator << (POutPersist& os, Poly & obj)
106 { ObjFileIO<Poly> fio(&obj); fio.Write(os); return(os); }
107inline PInPersist& operator >> (PInPersist& is, Poly & obj)
108 { ObjFileIO<Poly> fio(&obj); fio.Read(is); return(is); }
109// Classe pour la gestion de persistance
110// ObjFileIO<Poly>
111
112//////////////////////////////////////////////////////////////////////////
113int binomial(int n, int p);
114
115//////////////////////////////////////////////////////////////////////////
116class Poly2 : public Vector {
117 friend class ObjFileIO<Poly2>;
118public:
119 Poly2(int degreX=0, int degreY=0);
120 // degres alloues.
121 Poly2(Poly const& polX, Poly const& polY);
122 Poly2(Poly2 const& a);
123
124 enum {classId = ClassId_Poly2};
125 int_4 ClassId() const { return classId; }
126
127 inline int DegX() const {UpdateDegIfDirty(); return degX;}
128 inline int DegY() const {UpdateDegIfDirty(); return degY;}
129 inline int MaxDegX() const {return maxDegX;}
130 inline int MaxDegY() const {return maxDegY;}
131 inline int Deg() const {UpdateDegIfDirty(); return deg;}
132 // les degres partiels en x et y, et totaux.
133
134 double operator()(double x, double y) const;
135 // retourne la valeur en (x,y)
136
137 inline int IndCoef(int dx, int dy) const {
138 if (dx>maxDegX || dy>maxDegY) THROW(rangeCheckErr);
139 return dx + (maxDegX+1)*dy;
140 }
141 // l'indice du coefficient dans le vecteur. Public uniquement parce
142 // que ca sert a recuperer les erreurs sur les coefficients lors
143 // d'un fit...
144
145 inline double Coef(int dx, int dy) const {
146 return (dx>maxDegX || dy>maxDegY) ? 0 : Element(IndCoef(dx,dy));
147 }
148 inline double& Coef(int dx, int dy) {
149 if (dx>maxDegX || dy>maxDegY) THROW(rangeCheckErr);
150 dirty = 1; return Element(IndCoef(dx,dy));
151 }
152 // retourne le coefficient de degre (dx,dy)
153
154 double Fit(Vector const& x, Vector const& y, Vector const& z,
155 int degreX, int degreY);
156 double Fit(Vector const& x, Vector const& y, Vector const& z,
157 Vector const& errz2, int degreX, int degreY,
158 Vector& errCoef);
159 // degres partiels imposes. cf Poly::Fit sinon
160
161
162 double Fit(Vector const& x, Vector const& y, Vector const& z,
163 int degre);
164 double Fit(Vector const& x, Vector const& y, Vector const& z,
165 Vector const& errz2, int degre,
166 Vector& errCoef);
167 // degre total impose. cf Poly::Fit sinon
168
169 Poly2& operator = (Poly2 const& b);
170
171 Poly2& operator += (Poly2 const& b);
172 Poly2& operator -= (Poly2 const& b);
173
174 Poly2& operator *= (double a);
175
176 Poly2 Mult(Poly2 const& b) const;
177
178 Poly2 power(int n) const;
179
180 Poly2 operator() (Poly const& px, Poly const& py) const;
181// Poly2 operator() (Poly2 const& px, Poly2 const& py) const;
182
183 void Realloc(int degreX, int degreY);
184
185 void Print(ostream& s) const;
186
187private:
188 int dirty;
189 int_4 maxDegX;
190 int_4 maxDegY;
191 int degX;
192 int degY;
193 int deg;
194 void UpdateDeg() const;
195 void UpdateDegIfDirty() const {if (dirty) UpdateDeg();}
196};
197
198inline Poly2 operator* (Poly2 const& a, Poly2 const& b)
199 { return a.Mult(b); }
200
201inline Poly2 operator+ (Poly2 const& a, Poly2 const& b)
202 { Poly2 c(a); c += b; return c; }
203
204inline Poly2 operator- (Poly2 const& a, Poly2 const& b)
205 { Poly2 c(a); c -= b; return c; }
206
207inline Poly2 operator * (double a, Poly2 const& b)
208 { Poly2 c(b); c *= a; return c; }
209
210inline ostream& operator << (ostream& s, const Poly2& a)
211 { a.Print(s); return s; }
212
213//////////////////////////////////////////////////////////////////////////
214inline POutPersist& operator << (POutPersist& os, Poly2 & obj)
215 { ObjFileIO<Poly2> fio(&obj); fio.Write(os); return(os); }
216inline PInPersist& operator >> (PInPersist& is, Poly2 & obj)
217 { ObjFileIO<Poly2> fio(&obj); fio.Read(is); return(is); }
218// Classe pour la gestion de persistance
219// ObjFileIO<Poly2>
220
221
222} // Fin du namespace
223
224#endif // POLY_SEEN
Note: See TracBrowser for help on using the repository browser.