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

Scilab Discussion :

Approximation de la solution d'un système différentiel


Sujet :

Scilab

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut Approximation de la solution d'un système différentiel
    Bonjour ,

    Je ne sais plus quoi faire , j'ai la tête qui va exploser , merci de m'aider s'il vous plait ....

    Voici le message d'erreur dans la console Scilab :

    -->exec('C:\Users\popo\Desktop\SCILAB\intro3.sce', -1)
    !--error 15 
    Sous-matrice incorrectement définie.
    
    at line       4 of function euler_explicite called by :  
      [t,ye] = euler_explicite(f,t0,y0,y00,t1,n);
    at line      35 of exec file called by :    
    exec('C:\Users\popo\Desktop\SCILAB\intro3.sce', -1)
    et voici mon code en Scilab :
    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
    //- Le système différentiel
    function dy = f(t,X)
        dy(1) = -X(2);
        dy(2) = X(1);
    endfunction
    // les solutions exactes
    function [sol]=f1(t)
        sol = cos(t);
    endfunction
    function [sol]=g1(t)
        sol = sin(t);
    endfunction
     
    //- Conditions initiales
    t0=0;
    y0=1;
    y00=0;
    t1=10;
    n=1000;
    function [t,X]=euler_explicite(f,t0,y0,y00,t1,n)
        // Initialisation des vecteurs x et y
        t=[t0 zeros(1,n)];
        X(1)=[y0 zeros(1,n)];
        X(2)=[y00 zeros(1,n)];
        // Pas de temps
        h=(t1-t0)/n;
        // Calcul de y(xi)
        for i=1:n
            t(i+1)=t(i)+h;
            X(1)(i+1)=X(1)(i)+h*f(t(i),X(1)(i));
            X(2)(i+1)=X(2)(i)+h*f(t(i),X(2)(i));
        end
    endfunction
     
    y = f1(t);
    y2 = g1(t);
    [t,ye] = euler_explicite(f,t0,y0,y00,t1,n);
    //- Dessiner la fonction
    plot(t,ye);
    Qu'est-ce qui se passe ?
    Cordialement

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Tu ne peux pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X(1)=[y0 zeros(1,n)];
    X(2)=[y00 zeros(1,n)];
    Il te faut utiliser un tableau de cellules
    Ton code devient alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X{1}=[y0 zeros(1,n)];
    X{2}=[y00 zeros(1,n)];
    
    X{1}(i+1)=X{1}(i)+h*f(t(i),X{1}(i));
    X{2}(i+1)=X{2}(i)+h*f(t(i),X{2}(i));

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut
    une fois la correction du code faite j'ai un nouveau message d'erreur que je ne comprend pas ...
    Dans la console Scilab :
    -->exec('C:\Users\popo\Desktop\SCILAB\intro3.sce', -1)
        X{1}=[y0 zeros(1,n)];
            !--error 276 
    Opérateur, virgule ou point-virgule manquant.
    
    at line       4 of function euler_explicite called by :  
    endfunction
    at line      32 of exec file called by :    
    exec('C:\Users\popo\Desktop\SCILAB\intro3.sce', -1
    (Est ce que je dois aussi mettre des accolades dans le système diff. initial ? )

    Merci de m'éclairer ....

    Cordialement

  4. #4
    Invité
    Invité(e)
    Par défaut
    Désolé, j'ai été un peu vite, la syntaxe Scliab n'est pas ma même que MATLAB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    X = cell(2,1);
    X(1).entries = [y0  zeros(1,n)];
    X(2).entries = [y00 zeros(1,n)];
     
    X(1).entries(i+1)=X(1).entries(i)+h*f(t(i),X(1).entries(i));
    X(2).entries(i+1)=X(2).entries(i)+h*f(t(i),X(2).entries(i));
    Il te faudra sans doute adapter un peu le reste. Je te laisse regarder l'aide :

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut
    J'ai modifié mon code comme j'ai pu (c'est à dire au max de mes compétences )

    voilà le code d'erreur dans la console :
    -->exec('C:\Users\popo\Desktop\SCILAB\intro3.sce', -1)
     !--error 21 
    Index invalide.
    
    at line       2 of function f called by :  
    at line      13 of function euler_explicite called by :  
      [t,ye] = euler_explicite(f,t0,y0,y00,t1,n);
    at line      41 of exec file called by :    
    exec('C:\Users\popo\Desktop\SCILAB\intro3.sce', -1)
    et voilà le code corrigé en Scilab :
    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
    //- Le système différentiel
    function dy = f(t,X)
        dy(1) = -X(2);
        dy(2) = X(1);
    endfunction
     
    // les solutions exactes
     
    z=0:0.01:10
    function [sol]=f1(z)
        sol = cos(z);
    endfunction
     
    function [sol]=g1(z)
        sol = sin(z);
    endfunction
     
    y = f1(z);
    y2 = g1(z);
     
    //- Conditions initiales
    t0=0;
    y0=1;
    y00=0;
    t1=10;
    n=1000;
    function [t,X]=euler_explicite(f,t0,y0,y00,t1,n)
        // Initialisation des vecteurs x et y
        t=[t0 zeros(1,n)];
        X = cell(2,1);
        X(1).entries = [y0 zeros(1,n)];
        X(2).entries = [y00 zeros(1,n)];
     
        // Pas de temps
        h=(t1-t0)/n;
        // Calcul de y(xi)
        for i=1:n
            t(i+1)=t(i)+h;
            X(1).entries(i+1)=X(1).entries(i)+h*f(t(i),X(1).entries(i));
            X(2).entries(i+1)=X(2).entries(i)+h*f(t(i),X(2).entries(i));
        end
    endfunction
    [t,ye] = euler_explicite(f,t0,y0,y00,t1,n);
    //- Dessiner la fonction
    plot(t,ye);
    J'ai l'impression que je suis près du but , mais je ne vois pas ....

    Cordialement

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tu ne rentres qu'une seule valeur ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X(1).entries(i+1)=X(1).entries(i)+h*f(t(i),X(1).entries(i));
    X(2).entries(i+1)=X(2).entries(i)+h*f(t(i),X(2).entries(i));
    Or tu attends deux valeurs là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function dy = f(t,X)
      dy(1) = -X(2);
      dy(2) = X(1);
    endfunction

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut
    Désolé mais je ne comprends pas X(1) et X(2) sont les deux fonctions que je cherche à approximer en fonction de t .... et t je l'ai défini dans la ligne du dessus


  8. #8
    Invité
    Invité(e)
    Par défaut
    Fonctions?

    Dans ce cas je te conseille de revoir les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X(1).entries(i+1)=X(1).entries(i)+h * f( t(i) , X(1).entries(i) );
    X(2).entries(i+1)=X(2).entries(i)+h * f( t(i) , X(2).entries(i) );
    Car là tu ne rentres pas des fonctions mais les valeurs X(1).entries(i) et X(2).entries(i)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut
    j'ai une liste de valeurs pour t ensuite j'ai une liste de valeurs pour X(1) et
    X(2) c'est exactement ce que je veux pour avoir une approximation des fonctions X(1) et X(2) solutions du système lorsque je trace un graphe ! je ne comprends pas ce qui va pas ....

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je ne vois pas comment m'exprimer autrement

    Bon comme d'habitude, c'est à moi de réfléchir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X(1).entries(i+1)=X(1).entries(i)+h * f( t(i) , X(1).entries(i) );
    X(2).entries(i+1)=X(2).entries(i)+h * f( t(i) , X(2).entries(i) );

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dy = f( t(i) , [X(1).entries(i) X(2).entries(i)] ); % 2 valeurs passées ; 2 valeurs retournées
    X(1).entries(i+1) = X(1).entries(i) + h * dy(1);
    X(2).entries(i+1) = X(2).entries(i) + h * dy(2);

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut
    C'est pas que je ne veux pas réfléchir au contraire ! mais il y a des fois ou on n'y arrive pas , même avec la solution on a du mal ... c'est dur quand même Scilab je trouve !
    C'est bizarre je suis censé obtenir 2 courbes à l'écran voisine du cosinus et du sinus et je me retrouve avec une droite ? (je ne vois pas ou est le problème dans le code)

    Voici le Code :
    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
    //- Le système différentiel
    function dy = f(t,X)
        dy(1) = -X(2);
        dy(2) = X(1);
    endfunction
     
    // les solutions exactes
     
    z=0:0.01:10
    function [sol]=f1(z)
        sol = cos(z);
    endfunction
     
    function [sol]=g1(z)
        sol = sin(z);
    endfunction
     
    y = f1(z);
    y2 = g1(z);
     
    //- Conditions initiales
    t0=0;
    y0=1;
    y00=0;
    t1=10;
    n=1000;
    function [t,X]=euler_explicite(f,t0,y0,y00,t1,n)
        // Initialisation des vecteurs x et y
        t=[t0 zeros(1,n)];
        X = cell(2,1);
        X(1).entries = [y0 zeros(1,n)];
        X(2).entries = [y00 zeros(1,n)];
     
        // Pas de temps
        h=(t1-t0)/n;
        // Calcul de y(xi)
        for i=1:n
            t(i+1)=t(i)+h;
            dy = f( t(i) , [X(1).entries(i) X(2).entries(i)] ); //2 valeurs passées ; 2 valeurs retournées
            X(1).entries(i+1) = X(1).entries(i) + h * dy(1);
            X(2).entries(i+1) = X(2).entries(i) + h * dy(2);
         end
    endfunction
     
    [t,ye] = euler_explicite(f,t0,y0,y00,t1,n);
    //- Dessiner la fonction
    plot(t,ye);
    Merci Jérôme pour ton aide

    J'espère qu'on va finir par trouver la solution ....

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Il te faudra sans doute adapter un peu le reste. Je te laisse regarder l'aide :
    Pourquoi on m'écoute jamais
    ye est un tableau de cellules, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(t,ye(1).entries,t,ye(2).entries)
    Citation Envoyé par omécéLinux Voir le message
    j'espère qu'on va finir par trouver la solution ....
    Dis plutôt que tu espères que JE la trouve

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Par défaut
    CA MARCHE !!!

    UN grand Merci JEROME , franchement tu gères , you are the best

    Il ne me reste plus qu'à bien analyser et comprendre le fonctionnement du code ...

    Merci pour tout et bonne nuit (du moins pour ce qu'il en reste )

  14. #14
    Invité
    Invité(e)
    Par défaut
    Une remarque tout de même : utiliser un tableau de cellules est inutile ici, tu pourrais te contenter d'un simple tableau de taille n x 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function [t,X]=euler_explicite(f,t0,y0,y00,t1,n) 
        // Initialisation des vecteurs x et y 
        t=[t0 zeros(1,n)]; 
        X = [y0 y00 ; zeros(n,2)]; 
        // Pas de temps
        h=(t1-t0)/n;
        // Calcul de y(xi) 
        for i=1:n
            t(i+1)=t(i)+h;
            X(i+1,:) = X(i,:) + h * f( t(i) , X(i,:)); 
      end
    endfunction
    il faudra modifier un peu ta fonction f comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function dy = f(t,X)
        dy = [-X(2) X(1)];
    endfunction
    et en revenir évidemment à
    Au moins tu auras vu leur syntaxe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Résolution système différentiel
    Par gmachi10 dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/08/2009, 15h23
  2. Système différentiel d'ordre 2
    Par lumberjax dans le forum Mathématiques
    Réponses: 1
    Dernier message: 18/03/2009, 22h50
  3. Réponses: 0
    Dernier message: 16/12/2008, 05h58
  4. Recherche de solutions entières à un système d'équations
    Par ram-0000 dans le forum Mathématiques
    Réponses: 17
    Dernier message: 04/07/2008, 09h13
  5. [Débutant] Solution pour un système non linéaire à 3 inconnues
    Par geant02 dans le forum MATLAB
    Réponses: 5
    Dernier message: 10/03/2008, 16h36

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