Équations différentielles Scilab

Résolu
Bonjour,
Dans le cadre de ma thèse, je dois programmer en scilab les équa diff suivantes:
A_{i}*T_{{i-1},j}+B_{i}*T{i,j}+C_i*T_{{i+1},j}. (1)
A'_{j}*T_{i,{j-1}}+B'_{j}*T_{i,j}+C'_{j}*T_{i,{j+1}} (2)

Les A_{i} sont des matrices tridiag. les i et j sont les indices
J'ai besoin de votre aide.
Merci d'avance
Configuration: Linux
Firefox 3.0.6

28 réponses

Résumé de la discussion

Plusieurs échanges portent sur la mise en œuvre en Scilab de systèmes d'équations différentielles discrètes où A_i*T_{i-1,j}+B_i*T_{i,j}+C_i*T_{i+1,j} et A'_j*T_{i,j-1}+B'_j*T_{i,j}+C'_j*T_{i,j+1} impliquent des matrices tri-diagonales et des indices i et j. La solution clé consiste à exprimer le système sous forme matricielle A*T = B, T étant une matrice dont les colonnes sont les T_{:,j}, et A construit par diag et offsets. Certaines explications montrent comment assembler A à partir des vecteurs a,b,c et traiter les conditions aux limites de Dirichlet, puis résoudre pour chaque colonne. En pratique, un exemple numérique 100×100 et un script Scilab utilisant diag pour générer A et des variantes pour B et C illustrent l’approche et les choix de bornes.

Bobot (l’IA à votre service)
  1. Salut
    Pas de quoi ;-)
    Bonne continuation et à bientôt
    1. Bonjour,
      je suis déjà de retour. Au fait j'ai quitté Benin pour Centrafrique depuis le 29 Avril 2009. J'ai passé un bon moment pour la configuration d'un multiplexeur HP3470A. heureusement pour j'ai réussi cette configuration. Je m'apprête à attaquer mon système d'équation. car bientôt je vais commencer l'expérimentation.
  2. Salut

    Si c'est juste pour l'affichage, tu choisis ce que tu veux voir après.
    A(1:5,1:5)
    Par exemple

    Ciao
    1. Bonjour,
      ça marche. Merci beaucoup.
      Je me prépare pour présenter l'état d'avancement de mes travaux. Je reviedrai plus tard.
  3. Salut

    Oui c'est normal, u est de taille 1x16, donc a, b et e aussi. En particulier, la diagonale principale de ta matrice A a 16 éléments, donc ta matrice est de taille 16x16.

    Et sinon, ta boucle for est inutile, elle fait 16 fois la même chose. L'argument d'entrée n de ta fonction est lui aussi inutile, tu t'en sers pas.
    function M=ss_maling1
    h=0.01;
    k=0.1;
    u=0:0.1:1.5;
    p=size(u,2);
    e=u+0.1;
    a=1/h^2+u/(2*h);
    b=-2/h^2-2/k;
    b(2:p)=b(1);
    c=1/h^2+e/(2*h);
    M=diag(a)+diag(b(1:p-1),1)+diag(c(1:p-2),2);
    endfunction
    Bon après-midi
    1. Bonjour,
      ok! merci de ton aide.
      Mais si je veux seulement que le résultat m'affiche une matrice 5x5 dois affecter cette valeur à p? Je n'ai pas encore assayé mais je vais chercher pour voir ce que ça va donner.
      Une fois fini avec les conditions aux limites je reviendrai sur ce plateau. Bonne journée.
  4. Pas de problème ;-)
    À plus tard
    1. Bonjour,
      j'ai réécrit le script. Je signale que les éléments de ma matrice ne sont pas constants précisement a et c mais les éléments de b sont constans. comme tu me l'as dit hier j'ai une matrice 16x16. Mais si je veux afficher les éléments d'une matrice 5x5 ou 10x10 , je n'y arrive pas car il m'affiche toujours la matrice 16x16

      voici le script:
      function M=ss_maling1(n)
      h=0.01;
      k=0.1;
      m=zeros(1,1);
      p=zeros(1,1);
      u=0:0.1:1.5;
      [m,p]=size(u);
      for i=1:p
      e=u+0.1;
      a=1/h^2+u/(2*h);
      b=-2/h^2-2/k;
      b(2:p)=b(1);
      c=1/h^2+e/(2*h);
      M=diag(a)+diag(b(1:p-1),1)+diag(c(1:p-2),2);
      end
      endfunction
  5. Oui t'as raison et tes remarques vont me permettre d'être prudent.
    Je vais réécrire le script tout de suite. A bientôt.
    1. Oui j'ai regardé ton code, mais il y a des erreurs justement.
      D'une part, il sort pas une matrice mais un réel, d'autre part, en modifiant un peu pour qu'il te sorte une matrice, tes diagonales sont toutes constantes.

      En plus, si ta vitesse varie de 0 à 1.5 avec un pas de 0.1, ça fait que 16 éléments sur la diagonale principale.
      Comme N=50, bien que tu parlais de matrice 100x100, j'en ai déduit que tu voulais une matrice A de taille 50x50 et donc si c'est le cas, il te manque des éléments.
      1. Salut

        Euh... le code tel que tu l'as écrit donnera rien du tout :-D
        En sortie, A sera juste un réel égal à 1/h^2+Ui/(2*h).
        Comme il y a pas mal d'erreurs, je suis pas sûr de ce que tu veux obtenir au final, en particulier, est-ce que chaque diagonale est constante ? Si c'est le cas, c'est plutôt ça ton code :
        function A=ss_maling25_bis(n)
        h=0.01;k=0.1;N=5;
        a=(1/h^2+0.1*n/(2*h))*ones(N,1);
        b=(-2/h^2-2/k)*ones(N-1,1);
        c=(-1/h^2+0.1*(n+1)/(2*h))*ones(N-2,1);
        A=diag(a)+diag(b,1)+diag(c,2);
        endfunction
        Ou alors comme ça :
        function A=ss_maling25_bis(n)
        h=0.01;k=0.1;N=5;
        a=mtlb_repmat(1/h^2+0.1*n/(2*h),N,1);
        b=mtlb_repmat(-2/h^2-2/k,N-1,1);
        c=mtlb_repmat(-1/h^2+0.1*(n+1)/(2*h),N-2,1);
        A=diag(a)+diag(b,1)+diag(c,2);
        endfunction
        Au niveau temps d'exécution, la première solution est la meilleure je pense, mais vu le peu de calculs, tu verras aucune différence de toute façon. Mais pour te convaincre qu'un 5*ones(1000000,1) est plus rapide qu'un mtlb_repmat(5,1000000,1) par exemple, tu fais ça :
        tic;x=mtlb_repmat(5,1000000,1);toc
        tic;x=5*ones(1000000,1);toc
        Le résultat sur ma machine est le suivant :
        -->tic;x=mtlb_repmat(5,1000000,1);toc
         ans  =
         
            0.125  
         
        -->tic;x=5*ones(1000000,1);toc
         ans  =
         
            0.032
        Bon après-midi
        1. Bonjour,
          J'ai regardé ton code. Est -ce t'as essayé mon code? Les diagonales de ma matrice précisement a et c ne sont pas constantes. seule la diagonale b qui est constante.
          Ui varie de 0 à 1.5 par pas de 0.1. Je vais m'inspirer de ton code pour voir si je peux faire mieux que ça.
          Bonne après midi.
      2. Bonjour,
        Après avoir suivi ton conseil, en faisant 'help diag' j'ai résolu mon problème c'est à dire la manière de construire ma matrice. désormais qu'il s'agisse d'une matrice 100x100 je peux le générer facilement. jette un coup d'oeil pour voir le petit script que j'ai écrit: avec h(le pas d'espace) k(le pas de temps) Ui (la vitesse) m(le nombre de ligne du vecteur a) p (le nombre de colonne du vecteur a). avec ce script j'ai réussi à tronquer les élément du vecteur c et compléter ceux du vecteur b:
        Evidemment je l'ai écrit dans un éditeur Scipad. si t'as une méthode plus simple montre -la moi.


        function [a,b,c,m,p,A]=ss_maling25_bis(n)
        h=0.01;k=0.1;N=50;m=zeros(1,1);p=zeros(1,1);
        for i=1:N
        Ui=0.1*n
        a=1/h^2+Ui/(2*h);
        b=-2/h^2-2/k;
        c=-1/h^2+0.1*(n+1)/(2*h);
        [m,p]=size(a);
        b(2:p)=b(1);
        A=diag(a)+diag(b(1:p-1),1)+diag(c(1:p-2),2);
        end
        endfunction

        Maintenant passons aux conditions aux limites . Vu mon problème, ça sera les conditions de type Dirichlet. Je n'ai pas encore bien potassé donc donne moi 72h et je te ferai signe. A bientôt.
        1. Bizarre... d'après les équations de ton premier message, c'est la deuxième forme qui est la bonne il me semble.

          Cela dit, en dehors de toute considération de condition au bord, en faisant subir à T une permutation circulaire des lignes, ça se ramène effectivement à la deuxième forme.

          Mais bon, pour les conditions aux bords, t'en parlais pas vraiment dans tes équations. Est-ce que c'était un truc de type Dirichlet ou de type périodique ?
          Pour une condition de type Dirichlet, la matrice a cette tête :
          http://img14.imageshack.us/img14/2125/dirichlet.jpg
          Mais pour une condition de type périodique, elle ressemble plutôt à ça :
          http://img14.imageshack.us/img14/3135/periodic.jpg

          En tout cas, ça fait plaisir que tu cherches un peu par toi-même ;-)
          Ça change vraiment des personnes qui attendent qu'on leur serve tout sur un plateau :-D
          C'est un réel plaisir que d'échanger avec toi ! ;-)

          Bon après-midi !
          1. J'ai revérifié et c'est celle que j'ai proposée qui correspond à mon problème.
            C'est vrai que j'ai d'autres problèmes que je viens de rencontrer mais laisser moi chercher d'abord et je vous ferai signe au cas cela me dépasserait. A+
            1. Pas de quoi ;-)
              Tiens-nous au courant si t'as d'autres problèmes.
              Bonne nuit
              1. Bonjour,
                Je suis de retour. J'ai pris un peu de retard dans mes travaux de thèse. J'ai conçu un séchoir solaire. je compte l'expérimenter au mois de Novembre.
                C'est ça qui a fait que je n'ai pas poursuivi la résolution numérique de mes équations car il fallait commander un multiplexeur et des thermocouples. Maintenant que tout est prêt, je voudrais qu'on relance la partie numérique.
                J'ai même acheter en ligne la deuxième édition du livre intituler "Introduction en scilab car j'ai eu l'idée de travailler avec scicos."
            2. Message à Sacabouffe,
              Pourquoi tu supprimes mon message... T'es propriétaire du site ?
              @+
              1. Salut ss_mailing

                Oui oui, il y a beaucoup plus court, jette un œil au lien que je t'ai donné au message 5 :
                http://www.commentcamarche.net/forum/affich 6135901 resolution de l equation de chaleur
                En particulier au message 35.
                Tu peux aussi taper help diag sous Scilab, t'as même un exemple sur la façon de construire simplement une matrice tridiagonale ;-)

                En plus, je crois qu'il y a une erreur dans ce que tu écris. Selon tes équations la matrice A devrait avoir cette tête-là :
                b1  c1  0   0   0
                a1  b2  c2  0   0
                0   a2  b3  c3  0
                0   0   a3  b4  c4
                0   0   0   a4  b5
                Celle que tu construis à cette tête :
                a1  b1  c1  0   0
                0   a2  b2  c2  0
                0   0   a3  b3  c3
                0   0   0   a4  b4
                0   0   0   0   a5
                En tout cas, pour la première que j'ai écrite, ça donnerait ça :
                a=[a1,a2,a3,a4];
                b=[b1,b2,b3,b4,b5];
                c=[c1,c2,c3,c4];
                A=diag(b)+diag(a,-1)+diag(c,1);
                Et sinon, pour la deuxième, ça donnerait ça :
                a=[a1,a2,a3,a4,a5];
                b=[b1,b2,b3,b4];
                c=[c1,c2,c3];
                A=diag(a)+diag(b,1)+diag(c,2);
                Bonne journée
                1. Bonjour,
                  Merci de ton aide en tout cas j'ai pris bonne note pour les deux formes. je vais faire un tour pour regarder le lien que tu m'as donné.
              2. Bonjour
                j'ai essayé d'écrire la matrice tridia elle marche très bien seulement je me dis la procédure est très longue. Si jamais de dois écrire une matrice 10x10, je passerai un temps fou pour la simple écriture. voici comment j'ai procédé. A1(a1,a2,a3,a4,a5); B(b1,b2,b3,b4) C(c1,c2,c3). Je suppose que A est une matrice 5x5.
                A=diag([a1,a2,a3,a4,a5]) ensuite pour placer les b1,c1 par exemple je fais A(1,2)=b1;A(1,3)=c1;A(2,3)=b2;A(2,4)=c2;A(3,4)=b3;A(3,5)=c3;et A(4,5)=b4.
                De cette façon j'ai ma matrice tridia qui est inversible. Donc j'obtiendrai à coup sûre ma solution. Si t'as une méthode plus rapide dis-le moi. A+
                1. Ok! merci
                  je suis en train d'essayer le programme. Je t'informerai dans les jours à venir.
                  A+
                  1. Y a pas de quoi ;-)

                    Pour l'équation 2 c'est pareil sauf qu'on multiplie chaque ligne T_{i} par une matrice tridiagonale à droite.

                    Pas de souci pour code, si t'as un problème pour l'écrire ou si ça marche pas, on pourra essayer de voir pourquoi. Suivant les questions, c'est pas sûr que je puisse t'être d'un grand secours mais on verra :-D

                    À plus tard

                    PS : Tu peux tutoyer les gens du forum, tout le monde le fait ;-)
                    1. c'est Parfait là maintenant. Merci de votre aide. Même manuellement c'et ce que j'ai trouvé.Je ferai la même chose pou l'équation (2). Je vais potasser ce que vous m'avez balancer hier pour le maillage.
                      Parce - que il faut savoit reconstituer les T_{i,j}. Je vais écrire un script et vous le soumettre peut être demain.
                      1. Oui oui, je suis bien d'accord là-dessus ;-)
                        Et après tu peux écrire cette première équation matricielle écrite pour tous les j en une seule équation matricielle. Tu as :
                        A*T_{1}=b
                        A*T_{2}=b
                        ...
                        ...
                        Où j'ai noté T_{j} chaque colonne (T_{0,j} ... T_{N+1,j}).

                        Donc A*T=B où T est la matrice dont les colonnes sont les T_{j} et B est la matrice dont les colonnes sont égales à b.

                        Tu crois que ça permettra pas d'en faire quelque chose de mettre sous cette forme ?
                        1. Bonjour,
                          J'ai vu ce que vous avez proposé. Je ne suis pas convaincu. Prenons la première équation.L'expression que j'ai trouvée est la suivante:
                          A_{i}*T^(n+1/2)_{{i-1},j}+B_{i}*T^(n+1/2)_{i,j}+C_{i}*T^(n+1/2)_{{i+1},j}=D_{i}
                          avec
                          A_{i}=(1/(delta x)^2+U^n_{{i-1},j/(2*delta x))
                          B_{i}=-2/(delta x)^2-2/(delta t)
                          C_{i}=1/(delta x)^2-U^n_{{i+1},j}/(2*delta x)
                          D_{i}=-[(1/(delta y)^2+V^n_{i,{j-1}/(2*delta y))]T^n_{i,{j-1}}+[2/(delta y)^2-2/(delta t)]T^n_{i,j}+[-1/(delta y)^2+V^n_{{i,{j+1}}/(2*delta y)]T^n_{i,{j+1}}.
                          On obtient une équa diff sous forme matricielle suivante:
                          A*T=b
                          avec A une matrice tridiagonale:
                          A= (A1 B1 C1 0 0 0
                          A2 B1 C2 0 0
                          A3 B1 C3 0 0)

                          T=(T0,j
                          T1,j
                          T2,j
                          .
                          .
                          .
                          TN+1,j
                          b est une matrice colonne en remplaçant dans l'expression de D_{i} par i=1,2,...N
                          U et V sont les vitesse du fluide suivant x et y.
                          Discutons d'abord cette equa diff (1).
                          je vous ai expliqué hier comment j'avais discrétisé. Merci d'avance
                          • 1
                          • 2