Salut
Je demande si quelqun avait sous la main une subroutine qui pourait m'interpoler des résultats tabulées (Xi, Yi).
merci pour vous
Version imprimable
Salut
Je demande si quelqun avait sous la main une subroutine qui pourait m'interpoler des résultats tabulées (Xi, Yi).
merci pour vous
Salut !
Théoriquement, il est presque toujours possible de trouver un polynôme de degré n-1 dont le graphe passe par n points donnés. Mais, dans la plupart des cas, le graphe zigzague entre les points, sa dérivée changeant souvent de signe sans que cela ait le moindre sens physique. Et de toute façon ça ne marche pas si ta fonction a une asymptote.
Si tu veux
1) tracer de jolies courbes;
2) avoir une estimation raisonnable (mais sans garantie) de la dérivée, je te conseille les splines cubiques. Tu trouveras les sous-programmes dans "Numerical Recipes".
Bonne chance.
Jean-Marc Blanc
Salut,
Merci pour votre réponse, J'ai déjà commencé à écrire une petite soubroutine dessus, Je vais voir s'il marchera bien, sinon je ferais de ton conseil.
Pourriez-vous me montrer la rubrique où je peux trouver les sous programmes de Numerical Recipes
Vous avez raison, voici ce que j'ai écris
Le fichier de donnée est le suivantCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 ! 09/10/2007 ! Interpolation de lagrange IMPLICIT NONE DOUBLE PRECISION X(1000),Y(1000) ! DOUBLE PRECISION INTEGER I,J,N CALL DATAREAD(N,X,Y) CALL EVALUER(N,X,Y) END PROGRAM !----------------------------------------! SUBROUTINE DATAREAD(N,X,Y) ! INTEGER I,J,N CHARACTER*20 NOM DOUBLE PRECISION X(1000),Y(1000) ! DOUBLE PRECISION WRITE(*,*)'NOM DE FICHIER DES DONNEES A INTERPOLER ?' READ(*,100)NOM WRITE(*,100)NOM OPEN(80,FILE=NOM) READ(80,*)N IF(N.GT.1000)THEN WRITE(*,*)'ERREUR !! N EST SUP AUX DIMEMSION DES TABLEAUX' STOP ENDIF DO I=1,N READ(80,*)X(I),Y(I) ENDDO CLOSE (80) 100 FORMAT (A) RETURN END !----------------------------------------! SUBROUTINE EVALUER(N,X,Y) ! INTEGER I,J ,NMAX,N DOUBLE PRECISION X(1000),Y(1000) DOUBLE PRECISION DX,XX,VAL DX=0.01D0 NMAX=INT((X(N)-X(1))/DX) OPEN(81,FILE='PLOT.DAT') DO I=1,NMAX+1 XX=I*DX CALL INTERPOL(XX,N,X,Y,VAL) WRITE(81,*)XX,VAL ENDDO CLOSE(81) RETURN END !----------------------------------------! SUBROUTINE INTERPOL(XX,N,X,Y,VAL) ! INTEGER I,J,NMAX,N DOUBLE PRECISION X(1000),Y(1000) DOUBLE PRECISION SOME,XX,VAL,FAKTOR VAL =0.0D0 SOME =0.0D0 DO I=1,N !......................! Calcul des polynmes de Lagrange FAKTOR=1.0D0 DO J=1,N IF(J.NE.I)THEN FAKTOR=FAKTOR*(XX-X(J))/(X(I)-X(J)) ENDIF ENDDO !......................! SOME=SOME + Y(I)*FAKTOR ENDDO VAL = SOME RETURN END
Mais si vous essayez de représenter les résultats interpolés vous auriez n'importe quoi.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322 321 0 0.057855429 0.125 0.059693463 0.25 0.061875978 0.375 0.064906846 0.5 0.067768686 0.625 0.071487379 0.75 0.075081486 0.875 0.078654238 1 0.08209936 1.125 0.085970708 1.25 0.088951513 1.375 0.091725257 1.5 0.094425428 1.625 0.09685294 1.75 0.099138885 1.875 0.101241713 2 0.103110084 2.125 0.104772264 2.25 0.106159822 2.375 0.107446205 2.5 0.108501328 2.625 0.109440821 2.75 0.1101346 2.875 0.111103001 3 0.11168115 3.125 0.112129216 3.25 0.112635097 3.375 0.113256608 3.5 0.113603498 3.625 0.114066017 3.75 0.114571898 3.875 0.114962149 4 0.115092233 4.125 0.115265677 4.25 0.115395761 4.375 0.115670382 4.5 0.115901642 4.625 0.116262985 4.75 0.116393069 4.875 0.116537606 5 0.116580968 5.125 0.116739959 5.25 0.116754413 5.375 0.116653236 5.5 0.116812227 5.625 0.116826681 5.75 0.116884496 5.875 0.116841135 6 0.117029034 6.125 0.116870042 6.25 0.116927857 6.375 0.116739959 6.5 0.116725505 6.625 0.116609875 6.75 0.116682144 6.875 0.116580968 7 0.11643643 7.125 0.116393069 7.25 0.116393069 7.375 0.116335254 7.5 0.116450884 7.625 0.116725505 7.75 0.116855589 7.875 0.116855589 8 0.116826681 8.125 0.11666769 8.25 0.116537606 8.375 0.116465338 8.5 0.116609875 8.625 0.116797774 8.75 0.116913404 8.875 0.117216932 9 0.11736147 9.125 0.117419284 9.25 0.117433738 9.375 0.117534914 9.5 0.117404831 9.625 0.117419284 9.75 0.11736147 9.875 0.11736147 10 0.116725505 10.125 0.116754413 10.25 0.116754413 10.375 0.116653236 10.5 0.116653236 10.625 0.117216932 10.75 0.117188025 10.875 0.117144663 11 0.117260293 11.125 0.117925165 11.25 0.118084156 11.375 0.118055249 11.5 0.118040795 11.625 0.117954073 11.75 0.11724584 11.875 0.117260293 12 0.116826681 12.125 0.116855589 12.25 0.116920631 12.375 0.116978445 12.5 0.116920631 12.625 0.117339789 12.75 0.117368696 12.875 0.117534914 13 0.117477099 13.125 0.117491553 13.25 0.117506007 13.375 0.11736147 13.5 0.117188025 13.625 0.117173571 13.75 0.11724584 13.875 0.117115756 14 0.117188025 14.125 0.117202478 14.25 0.117115756 14.375 0.116956765 14.5 0.116956765 14.625 0.116913404 14.75 0.116826681 14.875 0.116942311 15 0.11678332 15.125 0.116913404 15.25 0.116682144 15.375 0.116768866 15.5 0.116725505 15.625 0.116927857 15.75 0.116927857 15.875 0.117202478 16 0.117101302 16.125 0.117101302 16.25 0.117101302 16.375 0.117029034 16.5 0.117057941 16.625 0.11701458 16.75 0.117072395 16.875 0.116739959 17 0.116826681 17.125 0.116812227 17.25 0.117115756 17.375 0.117101302 17.5 0.117477099 17.625 0.117433738 17.75 0.117332562 17.875 0.117332562 18 0.11724584 18.125 0.117159117 18.25 0.11701458 18.375 0.117086848 18.5 0.116927857 18.625 0.117043487 18.75 0.116942311 18.875 0.117274747 19 0.117274747 19.125 0.117289201 19.25 0.117159117 19.375 0.11724584 19.5 0.117086848 19.625 0.117115756 19.75 0.117115756 19.875 0.11724584 20 0.117144663 20.125 0.117159117 20.25 0.117057941 20.375 0.117072395 20.5 0.117057941 20.625 0.117159117 20.75 0.117144663 20.875 0.117212114 21 0.117183207 21.125 0.117038669 21.25 0.116951947 21.375 0.116778502 21.5 0.116711051 21.625 0.116624329 21.75 0.116682144 21.875 0.116768866 22 0.116682144 22.125 0.116696598 22.25 0.11678332 22.375 0.116826681 22.5 0.116826681 22.625 0.116956765 22.75 0.117086848 22.875 0.117115756 23 0.117173571 23.125 0.117202478 23.25 0.117303655 23.375 0.117289201 23.5 0.117260293 23.625 0.117231386 23.75 0.117231386 23.875 0.117159117 24 0.117216932 24.125 0.117289201 24.25 0.11736147 24.375 0.117289201 24.5 0.117419284 24.625 0.117390377 24.75 0.117506007 24.875 0.117486735 25 0.117587911 25.125 0.117602365 25.25 0.117573458 25.375 0.117457828 25.5 0.117375923 25.625 0.117303655 25.75 0.117202478 25.875 0.117303655 26 0.117144663 26.125 0.117188025 26.25 0.117115756 26.375 0.117188025 26.5 0.116884496 26.625 0.117000126 26.75 0.116841135 26.875 0.116609875 27 0.116421977 27.125 0.116523153 27.25 0.116364162 27.375 0.116349708 27.5 0.116523153 27.625 0.116494245 27.75 0.116277439 27.875 0.116234078 28 0.115496937 28.125 0.11546803 28.25 0.115496937 28.375 0.115627021 28.5 0.115684836 28.625 0.116407523 28.75 0.116580968 28.875 0.116508699 29 0.116653236 29.125 0.116653236 29.25 0.116826681 29.375 0.116725505 29.5 0.116956765 29.625 0.116985672 29.75 0.11713021 29.875 0.117115756 30 0.116841135 30.125 0.117057941 30.25 0.117057941 30.375 0.117072395 30.5 0.117043487 30.625 0.117520461 30.75 0.117347016 30.875 0.117477099 31 0.117347016 31.125 0.117433738 31.25 0.117347016 31.375 0.117347016 31.5 0.117043487 31.625 0.117173571 31.75 0.11713021 31.875 0.117115756 32 0.117144663 32.125 0.117318108 32.25 0.117347016 32.375 0.117173571 32.5 0.117159117 32.625 0.117072395 32.75 0.116927857 32.875 0.11666769 33 0.11678332 33.125 0.116797774 33.25 0.116768866 33.375 0.116913404 33.5 0.117086848 33.625 0.117101302 33.75 0.117144663 33.875 0.117144663 34 0.117079622 34.125 0.116978445 34.25 0.116963992 34.375 0.116848362 34.5 0.116790547 34.625 0.116711051 34.75 0.116855589 34.875 0.116884496 35 0.116971219 35.125 0.117289201 35.25 0.117433738 35.375 0.117433738 35.5 0.117347016 35.625 0.117347016 35.75 0.117289201 35.875 0.11724584 36 0.117274747 36.125 0.117375923 36.25 0.117390377 36.375 0.117289201 36.5 0.117390377 36.625 0.117332562 36.75 0.117404831 36.875 0.117332562 37 0.117390377 37.125 0.117347016 37.25 0.117462646 37.375 0.117534914 37.5 0.117838443 37.625 0.117838443 37.75 0.11786735 37.875 0.117939619 38 0.117896258 38.125 0.117809535 38.25 0.117144663 38.375 0.117125392 38.5 0.117053123 38.625 0.117139846 38.75 0.117212114 38.875 0.118035977 39 0.118199786 39.125 0.117621637 39.25 0.117580685 39.375 0.117710768 39.5 0.117710768 39.625 0.117754129 39.75 0.118505724 39.875 0.118633398 40 0.118618945
C'est a cause de linterpolation de lagrange ? ou j'ai un problème dans le code ?
Merci d'avance
Salut !
1) Je n'ai pas vérifié ton code, mais je peux t'assurer que les zigzags que tu obtiens sont ce qu'on obtient toujours en interpolant par un polynôme de degré élevé, que ce soit en utilisant les polynômes de Legendre ou en résolvant un système de Vandermonde, ce qui est plus long mais donne le même résultat. Je ne vois donc aucune raison de suspecter une erreur de programmation: c'est l'algorithme qui est inutilisable.
2) En ce qui concerne "Numerial Recipes", je l'ai toujours eu à disposition dans les universités où j'ai sévi; je ne sais donc pas si, et éventuellement où on peut trouver une version libre du code. A défaut, tu peux essayer "GSL - GNU Scientific Library" ou aller voir sur les sites
wwwasd.web.cern.ch/wwwasd/cernlib/
gams.nist.gov
netlib.org
Il ne faut pas toujours réinventer la roue!
Jean-Marc Blanc
Bonjour,
Je n'ai pas non plus vérifié le code, mais il est évident que tenter une interpolation de Lagrange de degré 40 sur des points équidistants va générer des oscillations de Runge (c.f. par exemple http://sonia_madani.club.fr/Cloaque/.../lagrange.html).
Il faut absolument procéder autrement.
Tu peux effectivement utiliser des splines, mais tu peux également faire des interpolations (de Lagrange) locales, c.-à-d. en utilisant seulement quelques points voisins (par exemple 3 ou 4, ce qui fait déjà un polynôme d'interpolation de degré 2 ou 3) de l'endroit où tu réalises l'interpolation.
Bonne continuation.
Salut,
Ehouarn
J’ai rapidement changé le code que j’ai écrit précédemment, j’ai adopté l’interpolation locale de Lagrange que vous m’avez recommandé, a priori les résultats sont très satisfaisante.
Merci
Jean-Marc Blanc
Merci beaucoup pour ton aide précieux, J’ai trouvé pas mal de subroutine déjà conçue, je vais les testées pour l’implémenter définitivement dans mon code.
Je laisse le programme d’interpolation de lagrange dans les attachés, si quelqu'un l’aura besoin.
Phy4me