65 #include "type_parite.h" 95 Tbl _sh_pvect_r_pas_prevu (
int,
int,
double) ;
96 Tbl _sh_pvect_r_cheb (
int,
int,
double) ;
97 Tbl _sh_pvect_r_chebp (
int,
int,
double) ;
98 Tbl _sh_pvect_r_chebi (
int,
int,
double) ;
99 Tbl _sh_pvect_r_chebu (
int,
int,
double) ;
104 Tbl _sh_pvect_r_pas_prevu (
int n,
int l,
double echelle) {
106 cout <<
" Solution homogene pas prevue ..... : "<< endl ;
107 cout <<
" N : " << n << endl ;
108 cout <<
" l : " << l << endl ;
109 cout <<
" echelle : " << echelle << endl ;
121 Tbl _sh_pvect_r_cheb (
int n,
int l,
double echelle) {
123 const int nmax = 200 ;
124 static Tbl* tab[nmax] ;
125 static int nb_dejafait = 0 ;
126 static int l_dejafait[nmax] ;
127 static int nr_dejafait[nmax] ;
128 static double vieux_echelle = 0;
131 if (vieux_echelle != echelle) {
132 for (
int i=0 ; i<nb_dejafait ; i++) {
134 nr_dejafait[i] = -1 ;
138 vieux_echelle = echelle ;
144 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
145 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
150 if (nb_dejafait >= nmax) {
151 cout <<
"_sh_pvect_r_cheb : trop de Tbl" << endl ;
157 l_dejafait[nb_dejafait] = l ;
158 nr_dejafait[nb_dejafait] = n ;
164 double* coloc =
new double[n] ;
166 int * deg =
new int[3] ;
175 for (
int i=0 ; i<n ; i++)
176 coloc[i] = echelle -
cos(M_PI*i/(n-1)) ;
178 cfrcheb(deg, deg, coloc, deg, coloc) ;
179 for (
int i=0 ; i<n ;i++)
180 res.set(0, i) = coloc[i] ;
184 for (
int i=1 ; i<n ; i++)
189 for (
int i=0 ; i<n ; i++)
190 coloc[i] =
pow(echelle-
cos(M_PI*i/(n-1)),
double(l-1)) ;
192 cfrcheb(deg, deg, coloc, deg, coloc) ;
193 for (
int i=0 ; i<n ;i++)
194 res.set(0, i) = coloc[i] ;
200 for (
int i=0 ; i<n ; i++)
201 coloc[i] = 1/
pow(echelle-
cos(M_PI*i/(n-1)),
double(l+2)) ;
203 cfrcheb(deg, deg, coloc, deg, coloc) ;
204 for (
int i=0 ; i<n ;i++)
205 res.set(1, i) = coloc[i] ;
209 tab[nb_dejafait] =
new Tbl(res) ;
214 else return *tab[indice] ;
221 Tbl _sh_pvect_r_chebp (
int n,
int l,
double) {
223 const int nmax = 200 ;
224 static Tbl* tab[nmax] ;
225 static int nb_dejafait = 0 ;
226 static int l_dejafait[nmax] ;
227 static int nr_dejafait[nmax] ;
232 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
233 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
238 if (nb_dejafait >= nmax) {
239 cout <<
"_sh_pvect_r_chebp : trop de Tbl" << endl ;
245 l_dejafait[nb_dejafait] = l ;
246 nr_dejafait[nb_dejafait] = n ;
250 double* coloc =
new double[n] ;
252 int * deg =
new int[3] ;
257 assert (div(l, 2).rem == 1) ;
260 for (
int i=1 ; i<n ; i++)
264 for (
int i=0 ; i<n ; i++)
265 coloc[i] =
pow(
sin(M_PI*i/2/(n-1)),
double(l-1)) ;
267 cfrchebp(deg, deg, coloc, deg, coloc) ;
268 for (
int i=0 ; i<n ;i++)
269 res.set(i) = coloc[i] ;
274 tab[nb_dejafait] =
new Tbl(res) ;
279 else return *tab[indice] ;
287 Tbl _sh_pvect_r_chebi (
int n,
int l,
double) {
289 const int nmax = 200 ;
290 static Tbl* tab[nmax] ;
291 static int nb_dejafait = 0 ;
292 static int l_dejafait[nmax] ;
293 static int nr_dejafait[nmax] ;
298 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
299 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
304 if (nb_dejafait >= nmax) {
305 cout <<
"_sh_pvect_r_chebi : trop de Tbl" << endl ;
311 l_dejafait[nb_dejafait] = l ;
312 nr_dejafait[nb_dejafait] = n ;
315 assert (div(l, 2).rem == 0) ;
320 double* coloc =
new double[n] ;
322 int * deg =
new int[3] ;
329 for (
int i=1 ; i<n ; i++)
333 for (
int i=0 ; i<n ; i++)
334 coloc[i] =
pow(
sin(M_PI*i/2/(n-1)),
double(l-1)) ;
336 cfrchebi(deg, deg, coloc, deg, coloc) ;
337 for (
int i=0 ; i<n ;i++)
338 res.set(i) = coloc[i] ;
343 tab[nb_dejafait] =
new Tbl(res) ;
348 else return *tab[indice] ;
357 Tbl _sh_pvect_r_chebu (
int n,
int l,
double) {
359 const int nmax = 200 ;
360 static Tbl* tab[nmax] ;
361 static int nb_dejafait = 0 ;
362 static int l_dejafait[nmax] ;
363 static int nr_dejafait[nmax] ;
368 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
369 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
374 if (nb_dejafait >= nmax) {
375 cout <<
"_sh_pvect_r_chebu : trop de Tbl" << endl ;
381 l_dejafait[nb_dejafait] = l ;
382 nr_dejafait[nb_dejafait] = n ;
388 double* coloc =
new double[n] ;
390 int * deg =
new int[3] ;
395 for (
int i=0 ; i<n ; i++)
396 coloc[i] =
pow(-1-
cos(M_PI*i/(n-1)),
double(l+2)) ;
398 cfrcheb(deg, deg, coloc, deg, coloc) ;
399 for (
int i=0 ; i<n ;i++)
400 res.set(i) = coloc[i] ;
404 tab[nb_dejafait] =
new Tbl(res) ;
409 else return *tab[indice] ;
420 Tbl sh_pvect_r(
int n,
int l,
double echelle,
int base_r) {
423 static Tbl (*sh_pvect_r[
MAX_BASE])(int, int, double) ;
430 sh_pvect_r[i] = _sh_pvect_r_pas_prevu ;
439 Tbl res(sh_pvect_r[base_r](n, l, echelle)) ;
Cmp cos(const Cmp &)
Cosine.
#define TRA_R
Translation en R, used for a bitwise shift (in hex)
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define R_CHEBP
base de Cheb. paire (rare) seulement
Cmp pow(const Cmp &, int)
Power .
Cmp sin(const Cmp &)
Sine.
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
#define MAX_BASE
Nombre max. de bases differentes.
#define R_CHEB
base de Chebychev ordinaire (fin)