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 :

fonction ramp avec fortran.


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut fonction ramp avec fortran.
    Bonjour la famille,

    Svp, j'aimerai realiser un fonction qui permet de tracer un signal rampe(en dans de scie) voir figure ci-dessous.

    sous Matlab il y a la fonction sawtooth qui permet de le fait. Donc j'aimerai savoir s'il existe une telle fonction sous fortran.

    Exemple sous Matlab :

    Code MATLAB : 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
    function [t,x1,x2]=ramp
     
    format long 
    clc;
    clear all;
    %parametre d'integration
    a=0;
    b=1 ;
    n=1e7;
    h=(b-a)/n;
    hh=h/2;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fonction dent de scie
    u=0:h:1;
    Vramp=6.0+2.2*sawtooth(320*50*u);
    figure(1)
    plot(u,Vramp)
    xlabel('t ','fontsize',16')
    ylabel(' v(t)','fontsize',16')
    grid
    courbe:

    Nom : Sans titre.png
Affichages : 818
Taille : 113,2 Ko

  2. #2
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Proposition de solution
    Bonjour la famille,

    suite au problème ci-dessus, j'ai réalisé un code sous matlab qui donne la fonction ramp.

    Code matlab : 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
    function [Vramp,u]=ramp_fortran
     
    format long 
    clc
    clear all;
    %parametre d'integration
    a=0;
    b=1 ;
    n=1e7;
    h=(b-a)/n;
    hh=h/2;
    T = 400e-6; 
    g=0;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fonction dent de scie
    v=1;
     for u=0:h:1
     mm(v)=u;
    Vramp(v)=0.011e6*(u-g*T)+3.8;
     if Vramp(v)>= 8.2
         g=g+1;
    Vramp(v)=0.011e6*(u-g*T)+3.8;
     else
    Vramp(v)=0.011e6*(u-g*T)+3.8;
     end
    v=v+1;
     end
     figure
    plot(mm,Vramp)
    xlabel('E','fontsize',16')
    ylabel('v','fontsize',16')
    grid
     end

    j'aimerai donc obtenir la même fonction sous fortran, et voici mon code ci-dessous:

    Code fortran : 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
    program ramp
     
    	real v,u,h,hh,g,mm,ramp,T
     
     
     
    !	interval de variation du parametre de controle
     
     
    	integer i,n												   
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'GOD IS LOVE, BE PATIENT ......... FER ..........'
     
            open (50,file='C:\test\b50.dat')
            open (51,file='C:\test\b51.dat')
     
    !	==== this bifurcation is done with the parameter delta =====
     
     
                a=0
                b=1
                n=1e7
                h=(b-a)/n
                hh=h/2
                T = 400e-6
                g=0
     
                v=1
     
                 u=0
                  do while(u<=1)
     
                 mm(v)=u
                  ramp(v)=0.011e6*(u-g*T)+3.8
                  if (ramp(v).ge.8.2) then
                   g=g+1
                   ramp(v)=0.011e6*(u-g*T)+3.8
                   else
                   ramp(v)=0.011e6*(u-g*T)+3.8
                    endif
                   v=v+1;
     
                   write(51,*)ramp,u
                   print*,ramp,u
                   u=u+h
                 end do
           	close(50)
    	close(51)
     
            end


    les erreurs générées sont les suivantes:

    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:3.24:
    
     real v,u,h,hh,g,mm,ramp,T
                            1
    Error: Symbol 'ramp' at (1) cannot have a type
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:36.20:
    
                 mm(v)=u
                        1
    Error: Unexpected STATEMENT FUNCTION statement at (1)
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:37.18:
    
                  ramp(v)=0.011e6*(u-g*T)+3.8
                      1
    Error: 'ramp' at (1) is not a variable
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:38.22:
    
                  if (ramp(v).ge.8.2) then
                          1
    Error: Symbol at (1) is not appropriate for an expression
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:40.19:
    
                   ramp(v)=0.011e6*(u-g*T)+3.8
                       1
    Error: 'ramp' at (1) is not a variable
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:41.19:
    
                   else
                       1
    Error: Unexpected ELSE statement at (1)
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:42.19:
    
                   ramp(v)=0.011e6*(u-g*T)+3.8
                       1
    Error: 'ramp' at (1) is not a variable
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:43.19:
    
                    endif
                       1
    Error: Expecting END DO statement at (1)
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:46.30:
    
                   write(51,*)ramp,u
                                  1
    Error: Symbol at (1) is not appropriate for an expression
    E:\SAVE PAULAIN\DATA\00 PHD AND MASTER DSCHANG\PHD\DATA ROGER\ramp.f90:47.26:
    
                   print*,ramp,u
                              1
    Error: Symbol at (1) is not appropriate for an expression


    SVP quelqu'un peut-il m'aidé à corriger ses problèmes? Merci.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    La principale erreur, récurrente, est que tu déclare à la fois un programme ramp, une variable scalaire ramp, puis tu utilises ensuite ramp comme un vecteur...

    Tu devrais possiblement appeler ton programme PrgRamp puis déclarer ramp comme un vecteur de dimension suffisante.

    Une fois ce problème réglé, le nombre d'erreur devrait être nettement plus faible.

    Ah oui, après la ligne program, tu dois insérer la ligne implicite none.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut
    Bjr à toutes la famille,

    Merci infiniment à toi Sylvain Bergeron pour ton aide.

    J'ai corrigé mon code selon tes instructions et j'ai pu avoir une courbe.

    cependant elle ne se répète pas comme dans Matlab, voir ci-dessous:


    Nom : Sans titre.png
Affichages : 737
Taille : 138,7 Ko

    ci-dessous le code qui m'a permit de tracer cette courbe:

    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
    	program PrgRamp
            implicit none
    	real v,u,h,hh,g,t,a,b
    	real, DIMENSION(10000)::mm
            real, DIMENSION(10000)::r
     
     
     
    !	interval de variation du parametre de controle
     
     
    	integer i,n												   
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'GOD IS LOVE, BE PATIENT ......... FER ..........'
     
            open (50,file='C:\test\b50.dat')
            open (51,file='C:\test\b51.dat')
     
    !	==== this bifurcation is done with the parameter delta =====
     
     
                a=0
                b=1
                n=1e7
                h=(b-a)/n
                hh=h/2
                t = 400e-6
                g=0
     
                v=0
     
                 u=0
                  do while(u<=1)
     
                 mm(v)=u
                  r(v)=0.011e6*(u-g*t)+3.8
                  if (r(v).ge.8.2) then
                   g=g+1
                   r(v)=0.011e6*(u-g*t)+3.8
                   else
                   r(v)=0.011e6*(u-g*t)+3.8
                    endif
                   write(51,*)mm(v),r(v)
                   print*,r,u
                   v=v+1
                   u=u+h
                 end do
           	close(50)
    	close(51)
     
            end
    Après plusieurs simulations, je n'arrive pas à produire le signal en dent de scie. SVP quelqu'un peut-il m'aider dans ce sens?

    Merci d'avant.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    La seule chose que je vois, c'est que dans ton graphique, tu n'affiches pas toutes les données disponibles. L'axe des X arrête à 3.5e-4 alors que la première dent pointe à 4e-4.

    Petit commentaire moins important : la variable v devrait être entière et non réelle puisqu'elle sert d'indice...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Dimenssion des variables
    Bonjours tous,

    Une fois de plus merci à toi Sylvain Bergeron pour ta disponibilité, j'ai effectué des modifications suite à tes remarques.

    Mais toujours est-il que je n'obtient pas l'affichage de tout mon signal sous Matlab.

    Je rappel que je compile mon programme sous Fortran et que j'importe les données sous Matlab pour le représentation graphique.

    Ci-dessous mon code modifier et la représentation graphique:

    code:

    Code fortran : 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
    	program PrgRamp
            implicit none
    	real h,hh,g,t,a,b,n
    	real, DIMENSION(10000000)::mm
            real, DIMENSION(10000000)::r
            real, DIMENSION(10000000)::u
     
     
     
    !	interval de variation du parametre de controle
     
     
    	integer i,v
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'GOD IS LOVE, BE PATIENT ......... FER ..........'
     
            open (50,file='C:\test\b50.dat')
            open (51,file='C:\test\b51.dat')
     
    !	==== this bifurcation is done with the parameter delta =====
     
     
                a=0
                b=1
                n=1e7
                h=(b-a)/n
                hh=h/2
                t = 400e-6
                g=0
     
                v=0
                 i=0
                 u=0
                  do while(u(v).lt.1)
     
                 mm(v)=u(v)
                  r(v)=0.011e6*(u(v)-g*t)+3.8
                  if (r(v).ge.8.2) then
                   g=g+1
                   r(v)=0.011e6*(u(v)-g*t)+3.8
                   else
                   r(v)=0.011e6*(u(v)-g*t)+3.8
                    endif
                   write(51,*)mm(v),r(v),i
                   print*,r,u
                   v=v+1
                   u(v)=u(v)+h
                   i=i+1
                 end do
           	close(50)
    	close(51)
     
            end

    graphe:

    Nom : Sans titre.png
Affichages : 704
Taille : 99,7 Ko


    Comme on peut le constater sur le graphe, puis j'augmente la dimension des variables mm, r, et u, puis le nombre d'itération diminuer. pour la figure ci-dessus nous avons pour une dimension de 10 000 000 juste deux itérations.

    Tant dit que, en effectuant le même programme sous Matlab avec le même part de 1e-7 j'ai eu 10 000 000 itération dans la boucle for, vois ci-dessous:

    Code matlab : 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
    function [Vramp,u]=ramp_fortran
     
    format long 
    clc
    clear all;
    %parametre d'integration
    a=0;
    b=1 ;
    n=1e7;
    h=(b-a)/n;
    hh=h/2;
    T = 400e-6; 
    i=0;
    g=0;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fonction dent de scie
    v=1;
     for u=0:h:1
     mm(v)=u;
    Vramp(v)=0.011e6*(u-g*T)+3.8;
     if Vramp(v)>= 8.2
         g=g+1;
    Vramp(v)=0.011e6*(u-g*T)+3.8;
     else
    Vramp(v)=0.011e6*(u-g*T)+3.8;
     end
    v=v+1;
    i=i+1
     end
     figure(1)
    plot(mm,Vramp)
    xlabel('E','fontsize',16')
    ylabel('v','fontsize',16')
    grid
    z=length(i)
     end

    Ainsi donc, je ne sais pas sur quel paramètre je peux jouer pour obtenir toute la représentation de la fonction ramp. Merci our votre aide.

  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,

    Ton code est assez horrible à lire (pas de commentaires indiquant qui est qui et/ou qui sert à quoi...), mais de ce que j'en comprend, ton u(:) est l'axe des abscisses, or tu fait une boucle "do while(u(v).lt.1)" donc il n'y a rien d'étonnant à ce que test sorties soient entre 0 et 1 (suivant l'axe des abscisses).
    Un conseil, regarde du côté de la fonction modulo, elle est tout à fait indiquée dès lors qu'on veut répéter un motif défini sur un intervalle.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Sa ne fonction toujours pas
    Bonjour tous,

    Ehouarn, j'ai suivit ton conseil mais sa ne marche toujours pas. j'ai toujours comme l'impression que la boucle do while n'effectuer pas tous les itérations attendu comme dans Matlab. Le nouveau code se trouve ci-dessous, je reste dans l'attends des proposition de solution Merci.

    code:

    Code fo : 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
    	program PrgRamp
            !d‚finnition des variables
            implicit none
    	real h,hh,g,t,a,b,n
    	real, DIMENSION(1:100000)::mm
            real, DIMENSION(1:100000)::r
            real, DIMENSION(1:100000)::u
            real, DIMENSION(1:100000)::k
     
     
    !	interval de variation du parametre de controle
     
     
    	integer i,v
     print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'													  '
    	print*,'GOD IS LOVE, BE PATIENT ......... FER ..........'
            !fichier dans lesquels seront ‚crit les donn‚es
            open (50,file='C:\test\b50.dat')
            open (51,file='C:\test\b51.dat')
     
    !	==== Affectation des variables =====
                a=0
                b=1
                h=1e-7 ! part d'‚chantionnage
                 hh=1
                t = 400e-6 ! p‚rioide du signal ramp
                g=0
                k(0)=1
                v=1
                 i=0
                 u(0)=h
                  u(1)=2*h
     
                  !boule do while, dans cette boucle je repr‚sente la fonction ramp avec pour valeur maximale 8.2 et valeur minimale 3.8
                  do while(hh.ne.0)
     
                 mm(v)=u(v) ! ici je stoke les diff‚rentes valeurs de l'echantion dans la variable mm
                  r(v)=0.011e6*(u(v)-g*t)+3.8
                  if (r(v).ge.8.2) then
                   g=g+1
                   r(v)=0.011e6*(u(v)-g*t)+3.8
                   else
                   r(v)=0.011e6*(u(v)-g*t)+3.8
                    endif
                   write(51,*)mm(v),r(v),i
                   print*,r,u
     
                   u(v)=u(v-1)+h  ! je stoke dans u la valeur pr‚c‚dente de u plus le part.
                   v=v+1
                   i=i+1
                   hh =modulo(k(0),u(v)) ! je divise k(0)=1  par u(v) et le reste est comparait … z‚ro, donc lorsque le reste sera ‚gale … 0 la boucle s'arretera.
                 end do
           	close(50)
    	close(51)
     
            end

  9. #9
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Rappel
    Bonsoir la famille,

    je tiens à rappeler que le but de code et de tracer une fonction en dent de scier avec une période T=400e-6, Vmax=3.8, Vmin=3.8 comme ci-dessous. Ainsi, je reste ouvert à toute proposition de code pouvant le faire, merci.



    Nom : Sans titre.png
Affichages : 659
Taille : 127,0 Ko

  10. #10
    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,

    Pour faire une boucle sur un intervalle allant de Tmin (exclu) à Tmax (inclu) avec un pas constant "h" il faudra faire "npas" tels que npas=(Tmax-Tmin)/h
    Donc faire une simple boucle do sur ces npas (vraiment pas besoin de do while, sauf si on veut se compliquer la vie)
    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
     
    ! initialisations
    Tmin=0.027 ! début de l’intervalle
    Tmax=0.030 ! fin de l’intervalle
    h=0.00001 ! pas avec lequel on parcourt l'intervalle
    npas=(Tmax-Tmin)/h
     
    ! initialisation de T de départ
    T=Tmin
    do i=1,npas
      ! incrémentation de T à chaque pas
      T=T+h
      ! calcul de V(T)
      ...
    enddo
    Et pour le calcul de V(T) c'est simplement une droite d'origine Vmin et de pente (Vmax-Vmin)/periode , si on se restreint pour l'instant à l'intervalle [0,periode] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    V=Vmin+T*(Vmax-Vmin)/periode
    En dehors de l'intervalle [0,periode], il faut se ramener à ce dernier donc faire un modulo periode sur T, soit au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    V=Vmin+modulo(T,periode)*(Vmax-Vmin)/periode
    Voilà, y'a juste à assembler le tout et ajouter les sorties dans un fichier.

Discussions similaires

  1. appelle des fonctions d'un dLL avec fortran
    Par capitan dans le forum Fortran
    Réponses: 1
    Dernier message: 17/05/2016, 16h20
  2. Réponses: 3
    Dernier message: 22/03/2007, 07h19
  3. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17
  4. fonction left avec sql server 6.5
    Par shake dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/06/2004, 08h48
  5. Fonction If avec rs.eof problème
    Par M1000 dans le forum ASP
    Réponses: 5
    Dernier message: 24/03/2004, 17h10

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