IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Subroutine d'interpolation polynomiale


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de phy4me
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut Subroutine d'interpolation polynomiale
    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

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut Subroutine, Interpolation polynomiale
    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

  3. #3
    Membre confirmé Avatar de phy4me
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut
    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.

  4. #4
    Membre confirmé Avatar de phy4me
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut
    Pourriez-vous me montrer la rubrique où je peux trouver les sous programmes de Numerical Recipes

  5. #5
    Membre confirmé Avatar de phy4me
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Mais, dans la plupart des cas, le graphe zigzague entre les points,
    Vous avez raison, voici ce que j'ai écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 polyn“mes 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
    Le fichier de donnée est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Mais si vous essayez de représenter les résultats interpolés vous auriez n'importe quoi.
    C'est a cause de linterpolation de lagrange ? ou j'ai un problème dans le code ?
    Merci d'avance

  6. #6
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    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

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    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.

  8. #8
    Membre confirmé Avatar de phy4me
    Inscrit en
    Octobre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 116
    Par défaut
    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
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/01/2014, 04h15
  2. [Débutant] Interpolation polynomiale avec Neville
    Par Zapatista dans le forum MATLAB
    Réponses: 1
    Dernier message: 07/10/2012, 15h43
  3. Interpolation polynomiale en 3D
    Par ketty_C dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/03/2010, 11h26
  4. Polyfit (Interpolation polynomiale)
    Par ppfromero dans le forum C
    Réponses: 2
    Dernier message: 22/11/2007, 15h15
  5. Interpolation polynomiale, moindres carrés
    Par progfou dans le forum Mathématiques
    Réponses: 4
    Dernier message: 27/10/2006, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo