Equation differentielle sur matlab

Résolu
bonjour,
j'ai besoin que vous m'expliquez comment je peut resoudre une équation differentielle type :d/dt(qna1) = -areaMem*JNa; sur matlab
je vous remercie infiniment pour votre aide
Configuration: Linux
Firefox 2.0.0.3

25 réponses

Résumé de la discussion

La problématique centrale est la résolution numérique d'une équation différentielle en Matlab, d/dt(qna1) = -areaMem*JNa, qui décrit l'évolution temporelle d'une quantité ionique à travers une membrane. Des approches existent, incluant les solveurs d'ODE de Matlab (par exemple ode15s) et, si nécessaire, une discrétisation par différences finies pour des systèmes couplés, avec des paramètres et conditions initiales. Des conseils portent aussi sur la gestion des paramètres, l'explication des termes, et l'usage éventuel de varargin/varargout pour rendre les scripts flexibles, ainsi que l'importance des données de flux. En outre, la discussion souligne que le problème peut être un système d'équations différentielles couplées en électrophysiologie, nécessitant une modélisation précise des constantes et des flux ioniques.

Bobot (l’IA à votre service)
  1. Bonjour,
    s'il vous plait aidez moi, je suis une débutante en matlab dans mon projet je dois resoudre l'equation suivante:
    dc/dt +v.grad(c)=0; ou c est une concentration est v une vitesse de compoante (vx,vy).
    je ne sais pas faire.
    s'il vous plait aidez moi c'est urgent.
    merci à tous
  2. slt sacabouffe...je trouve que té tres fooooort...j'ai un petit prob si tu peut maidé..je veux presenté les equation d1 generatrice asynchrone a double alimentation sur matlab ...en utilisant l'instruction DEE ""differentiel equation editor""..es ce que ta une idée pr m'aidé ...jatendré ta reponse...mes salutation
    1. Salut marie
      Essaie d'écrire un peu plus lisiblement et fais plutôt un sujet à toi quand t'as un problème. T'as plus de chance d'avoir une réponse.
      Tu vas dans le forum Programmation comme tu viens de faire et tu crées ton truc.
      Fais donc ton propre topic et détaille plus. Par contre... pas sûr de pouvoir t'aider... je connais pas du tout dee... désolé... :-(

      Dis-moi... C'est pas toi sous un autre pseudo ici avec le même problème?
      Un mois que t'attends de l'aide là-dessus...
      Sois pas timide et crée ta propre discussion :-D
  3. Bonjour
    Merci pour ta réponse et ton aide
    je pense pour le momment je doit marquer en résolu
    malgrer que je suis sûr que je serais de retour sur ce forum au moin d'ici 20 jours ou un mois

    je te remercie infiniment pour ton aide (pour moi c'etait un vrai soutien)
    et j'espére te retrouver quand je serais de retour sur ce forum

    A plus
    1. De rien atiffa :-)
      Mais bon il y a des trucs pour lesquels j'ai pas été très utile finalement :-D
      Si tu reviens pour un autre souci refais un nouveau sujet alors...
      A plus
  4. Re: bonjour sacabouffe;

    on tout cas je te remercie beaucoup pour cette réponse, je pense que c'est un peu prés ce que je vais utiliser dans mon travail
    ce matin, un collegue de travail m'a dis qu'on va utilisées une methode "method of lines", je sais pas pour le momment grand chose sur ce méthode ( lui non plus) mais je vais faire mes recherches et j'espere que ca améne à qlq chose

    je pense que c'est un peu du genre dJi(xj)/dt ..........................
    bréf pour le momment c'est encore floux

    mais avant que je commence à programmer sur matlab j'ai un long travail à faire:" bibliographie des différents équations du transport", chose qui fait tourner la tête!!!!!!!!!!!!!!!:-)

    je te remercie infiniment pour ta disponibilité et pour ta réponse

    bonne soirée
    A plus
    1. Ah OK...
      Je viens de regarder ce que c'était la method of lines sur Wikipédia (Method of lines Wikipédia) parce que je connaissais pas :-D
      Déjà utilisé ce genre de choses une fois en fait... De la semi-discrétisation...
      Mais pour le coup si tu discrétises pas en temps, t'auras peut-être moins à te soucier des problèmes de stabilité liés aux choix des pas de discrétisation en temps et en espace...
      En tout cas bonne chance à toi
      Marque en résolu si c'est tout bon
      Bonne soirée
      A la prochaine ;-)
  5. Salut sacabouffe

    je m'excuse pour cette petite repture, j'etait un peut occuper pas des manipulations...........

    on fait ce matin j'ai discuter avec un collegue de travail et apparament jerai besoin que mon modéle varie en même temps en fonction de distance(x) et en fonction du temps (t)
    je sais pas si c'est fesable sur matlab ou non ??????????????

    qui ce que tu pense ????????

    A plus
    1. Salut atiffa
      Si t'as un modèle qui dépend d'une variable spatiale et d'une variable temporelle, t'auras à résoudre des équations aux dérivées partielles.

      Il y a une Toolbox pde dans Matlab mais je pourrai pas beaucoup t'aider là-dessus, je l'ai jamais utilisée.

      Si t'arrives pas à utiliser la Toolbox de Matlab et que tu choisis de discrétiser tes pde à la main, il faudra que tu fasses attention à pas mal de choses en fonction de la forme de tes équations (schéma centré, décentré à gauche, décentré à droite). Vu que tes équations doivent être du type équations de transport, regarde ce lien: http://culturemath.ens.fr/maths/html/transport/transport.html

      De plus il faudra aussi que tu fasses attention à bien choisir tes pas de discrétisation en espace et en temps de manière à ce qu'ils vérifient une condition de type CFL (Courant-Friedrichs-Lewy), jette un œil à la page Wikipédia il y a quelques lignes à ce sujet : https://en.wikipedia.org/wiki/Courant%E2%80%93Friedrichs%E2%80%93Lewy_condition

      En bref, s'il faut que tu t'intéresses un peu à la discrétisation des pde, jette un œil ici, il y a plein de supports de cours:
      http://pages.saclay.inria.fr/houssem.haddar/teaching.html

      Et si tu veux voir une liste non exhaustive de schémas de discrétisation pour l'équation de transport avec des animations sur la convergence en fonction du schéma choisi et de la condition CFL imposée, tu peux regarder là:
      http://pages.saclay.inria.fr/houssem.haddar/Cours/ENSTA/SIMUL/Transport.html

      Voilà, j'espère que ça t'aide un peu. Dis-moi quand même.
      A plus
  6. Coucou atiffa
    Ah oui... effectivement... quand tu fais un programme, t'as pas l'air de faire les choses à moitié. Une Graphic User Interface (gui)... Je préfère te prévenir tout de suite, si tu as des questions à poser sur ces bêtes là je serai incapable d'y répondre, j'y connais strictement rien :-D

    Euh... finalement c'est quoi la question de ton message 25?
    Tu veux que je te dise ce que fait le programme en gros?
    Je vais essayer quand même...

    Quand tu appelles ta fonction cell_simulator tu lui passes en argument :
    le nom de la gui et tous les arguments dont tu as envie qui sont dans gui_State mais par contre tu peux pas sauter un argument et en reprendre un autre après. Pour être plus clair si tu peux passer comme arguments des trucs a, b et c, tu peux choisir de passer juste a ou a,b ou a,b,c mais pas a,c. Et je pense que ton petit bout de programme te construira la gui avec les infos que tu lui auras passées.

    Après si tu mets des arguments de sortie quand tu appelles ta fonction cell_simulator (avec un truc du genre [ A,B ] = cell_simulator(liste_arguments);), et ben tu auras ta gui et les deux premières infos dans les variables A et B.

    Voilà je peux pas t'en dire plus, je vais pas t'être d'un grand secours sur ce coup-là non plus.
    Dis-moi quand même si t'as compris un peu ou pas du tout :-D

    Par contre as-tu un fichier cell_simulator.fig quelque part? Il me semble qu'il t'en faut en pour utiliser ta fonction... Je me trompe?
    1. Re: Salut Sacabouffe

      Ah oui.................; mais tu as vraiment raison, j'ai même pas fait attention que j'ai utilisée pi dans la définition de la fonction jghk
      on fait pi ca veut dir perméabilité membranaire pour un ion i
      et dans le main c'était remplacer par: pna (perméabilité membranaire pour le sodium) et pcl (perméabilité membranaire pour le chlore)
      je pense que pour mon programme ça pas poser de problème ( y a pas de confusion)

      mais t'avais raison parce que ça peut être une source d'erreur si je l'utilise une autre fois

      je te remercie vraiment pour la remarque

      A plus :-)
      1. Re:bonjour sacabouffe

        """""""""""""
        Ah oui... Et puis j'avais oublié... Evite d'utiliser pi pour un nom de variable en Matlab c'est pas très sage. pi c'est le 3.1415926535... sous Matlab

        """""""""""""""

        merci pour la remarque
        mais dans mon programme j'ai utiliser psi (c.à.d. la perméabilité membranaire) et pas pi
        je sais que pi en math = 3.14 environ

        je te remercie beaucoup
        on fait moi je connais presque rien dans ton domaine, mais je pense que c'est une branche en physique !!!!!!!!!!!!

        moi je suis spécialisée en biologie et plus précisément en électrophysiologie rénal

        A plus
        1. Salut atiffa
          Comme dans le programme de ton message 21 il y avait écrit % pi (permeability) in cm/s , j'ai préféré te prévenir.

          Sinon, t'inquiète, je me doutais bien que tu connaissais la valeur de pi, c'est juste que je voyais pas comment formuler ma phrase pour dire que c'était le "pi mathématique"

          Pour ce qui est de ton domaine, j'avais deviné grâce au message 6

          Oui mon domaine c'est à peu près ça...

          Je regarde ton truc ce soir ou demain si je peux.
      2. Re:bonjour:

        je pense que ce message est destiné à qlq 'un d'autre ????? et pas à moi

        """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
        Salut
        Fais ton propre sujet majid01.
        #include<stdio.h>
        #include<stdlib.h>
        main()
        {
        float a,b,x;
        printf("entre la valeur de a :");
        scanf("%f",&a);
        printf("entre la valeur de b :");
        scanf("%f",&b);
        if (a<>0)
        {
        x=-b/a;
        printf("x=:",x);
        }
        else
        {
        printf("solution impossible");
        }
        }
        A plus
        """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

        je l'ai trouver dans ma boite email, et je l'ai transfere à la bon prsonne

        A plus
        1. Salut atiffa
          Effectivement c'était pour quelqu'un d'autre, une personne qui était venue demander de l'aide pour un programme dans ton topic, je lui avais répondu et aussi dit de faire son propre sujet.
          Je regarde ton petit bidule quand j'ai le temps.
          Ah oui... Et puis j'avais oublié... Evite d'utiliser pi pour un nom de variable en Matlab c'est pas très sage. pi c'est le 3.1415926535... sous Matlab donc si un jour t'as besoin de l'utiliser dans une fonction et que t'as appelé une variable comme ça, ça risque de poser problème.
          Mon domaine c'est plus l'électromagnétisme et l'acoustique. Mais je suis toujours bien content d'apprendre d'autres trucs.
          A plus tard
      3. Bonjour,

        On fait le probléme dans mon programme c'était que dans la définition de mes deux fonctions (jghk.m et jnapump.m) j'ai oublier de mettre des points quand je multiplier ou quand je diviser deux vecteurs,
        c'était pour cela il comprend pas ce que je lui demande ou il affiche des graphiques qui ne sont pas juste.

        pour varargin et varargout je l'ai besoin dans mon prochaine programme
        hier j'était entrain de dechiffrer un programme d'une personne qui fait la même chose que nous, alors je te garanti que j'ai pas compris grand chose????????????

        """""""""""""""""""""""""""""""""""""""""""""juste le debut de programme""""""""""""""""""""""""""

        function varargout = cell_simulator(varargin)

        % CELL_SIMULATOR M-file for cell_simulator.fig
        % CELL_SIMULATOR, by itself, creates a new CELL_SIMULATOR or raises the existing
        % singleton*.
        %
        % H = CELL_SIMULATOR returns the handle to a new CELL_SIMULATOR or the handle to
        % the existing singleton*.
        %
        % CELL_SIMULATOR('CALLBACK',hObject,eventData,handles,...) calls the local
        % function named CALLBACK in CELL_SIMULATOR.M with the given input arguments.
        %
        % CELL_SIMULATOR('Property','Value',...) creates a new CELL_SIMULATOR or raises the
        % existing singleton*. Starting from the left, property value pairs are
        % applied to the GUI before cell_simulator_OpeningFunction gets called. An
        % unrecognized property name or invalid value makes property application
        % stop. All inputs are passed to cell_simulator_OpeningFcn via varargin.
        %
        % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
        % instance to run (singleton)".
        %
        % See also: GUIDE, GUIDATA, GUIHANDLES
        % Copyright 2002-2003 The MathWorks, Inc.
        % Edit the above text to modify the response to help cell_simulator
        % Last Modified by GUIDE v2.5 21-Mar-2006 14:36:05
        % Begin initialization code - DO NOT EDIT

        gui_Singleton = 1;
        gui_State = struct('gui_Name', mfilename, ...varargin et varargout
        'gui_Singleton', gui_Singleton, ...
        'gui_OpeningFcn', @cell_simulator_OpeningFcn, ...
        'gui_OutputFcn', @cell_simulator_OutputFcn, ...
        'gui_LayoutFcn', [] , ...
        'gui_Callback', []);
        if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
        end

        if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
        else
        gui_mainfcn(gui_State, varargin{:});
        end

        """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

        c'etait juste le début de son programme

        je sais pas si tu va comprendre qlq chose dans ce programme ???????????????

        on fait c'est si pas descrit c'est quoi ta spécialité ?????????????????

        parceque ca me géne de te posée des questions qui sont loin de ton domaine

        merci pour ton message :-)))

        A plus
        1. Bonjour Sacabouffe,

          je pense que ca marche cette fois ci, mais ce n'est que le début de mon travail, la suite et bien plus complique !!!!!!!!!!!!!!!!
          je t'envoie le programme :

          """"""""""""""""""""""""""""""""" jghk.m""""""""""""""""""""""""""""""""""""""""""""""""""""

          function jghki = jghk(pi,zi,cout,cin,psii)
          %JGHK Summary of this function goes here
          % Detailed explanation goes here
          % FRT in 1/mV
          % psi in mV (reference in outside bath)
          % pi (permeability) in cm/s
          % jghk then in micromoles/s/cm2

          FRT = 0.037442;
          if (abs(psii) < 0.001)
          jghki = pi*(cout-cin);
          else
          jghki = -pi*zi*FRT*psii.*(cout - cin.*exp(zi*FRT*psii))./(1-exp(zi*FRT*psii));
          end

          end

          """"""""""""""""""""""""""""jnapump.m"""""""""""""""""""""""""""""

          function Jnapump = jnapump(vmax,cout,km)

          Jnapump = (vmax*cout)./(km+cout);
          end

          """""""""""""""""""""""""""""dnaclpsi.m"""""""""""""""""""""

          function dydt = dnaclpsi(t,y)
          %This calculates the RHS of the ODEs for
          % NaCl diffusion across a GHK membrane.
          % Psi is treated as a variable, so this system is stiff.
          % method ode15s works with this, but ode45 does not.
          %
          %cna1 = y(1)/vol1 ; % mmol/l = umol/ml (i.e., qna1 is in umol)
          %cna2 = y(2)/vol2 ; % mmol/l = umol/ml (i.e., qna2 is in umol)
          %cna3 = y(3)/vol3 ; % mmol/l = umol/ml (i.e., qna3 is in umol)
          %ccl1 = y(4)/vol1 ; % mmol/l = umol/ml (i.e., qcl1 is in umol)
          %ccl2 = y(5)/vol2 ; % mmol/l = umol/ml (i.e., qcl2 is in umol)
          %ccl3 = y(6)/vol3 ; % mmol/l = umol/ml (i.e., qcl3 is in umol)
          %psi1 = y(7);
          %psi2 = y(8);

          global vol1 vol2 vol3 pna pcl zna zcl areaMem gammaMem faraday vmax km;
          jna1 = areaMem*jghk(pna,zna,y(1)/vol1,y(2)/vol2,y(7))+ areaMem*jnapump(vmax,y(1)/vol1,km);
          jna2 = areaMem*jghk(pna,zna,y(2)/vol2,y(3)/vol3,y(8));
          jcl1 = areaMem*jghk(pcl,zcl,y(4)/vol1,y(5)/vol2,y(7));
          jcl2 = areaMem*jghk(pcl,zcl,y(5)/vol2,y(6)/vol3,y(8));
          Itot1 = faraday*(zna*jna1 + zcl*jcl1);
          Itot2 = faraday*(zna*jna2 + zcl*jcl2);

          dydt = [ -jna1
          jna1-jna2
          jna2
          -jcl1
          jcl1-jcl2
          jcl2
          Itot1/gammaMem
          Itot2/gammaMem];
          end %dnaclpsi

          """"""""""""""""""""""""""""""""""""""""""""""main.m""""""""""""""""""""""""""""""""""""""

          global vol1 vol2 vol3 pna pcl zna zcl areaMem gammaMem faraday vmax km;

          cnacl1init = 50.0 ; %mmol/l, initial NaCl concentration in bath 1
          cnacl2init = 20.0 ; %mmol/l, initial NaCl concentration in bath 2
          cnacl3init = 0.0 ; %mmol/l, initial NaCl concentration in bath 3
          vol1 = 20 ; %ml
          vol2 = 10 ; %ml
          vol3 = 10 ; %ml
          qna1init = cnacl1init * vol1;
          qna2init = cnacl2init * vol2;
          qna3init = cnacl3init * vol3;
          qcl1init = cnacl1init * vol1;
          qcl2init = cnacl2init * vol2;
          qcl3init = cnacl3init * vol3;
          psi1Init = 18; %mv
          psi2Init = 0; %mv

          FRT = 0.037442 ; %1/mV
          faraday = 96.5 ; %coul/mmol = mcoul/umol1.0
          pna=0.1 ; %cm/sec = cm3/(cm2 sec)
          pcl = pna/2 ; %cm/sec = cm3/(cm2 sec)
          zcl=-1;
          zna=1;
          gammaMem = 1e-6; %; memCapacitance = 1e-6 farads/cm2
          areaMem = 1.0 ; %cm2
          vmax = 7;
          km = 10;

          tspan = [0 2000];
          y0 = [qna1init; qna2init; qna3init; qcl1init; qcl2init; qcl3init;
          psi1Init; psi2Init];

          [T,Y] = ode15s(@dnaclpsi,tspan,y0);

          cna1 = Y(:,1)/vol1;
          cna2 = Y(:,2)/vol2;
          cna3 = Y(:,3)/vol3;
          ccl1 = Y(:,4)/vol1;
          ccl2 = Y(:,5)/vol2;
          ccl3 = Y(:,6)/vol3;
          psi1 = Y(:,7);
          psi2 = Y(:,8);

          jnap = areaMem*jnapump(vmax,cna1,km);
          jnaghk1 = areaMem*jghk(pna,zna,cna1,cna2,psi1);
          jnaghk2 = areaMem*jghk(pna,zna,cna2,cna3,psi2);
          jclghk1 = areaMem*jghk(pcl,zcl,ccl1,ccl2,psi1);
          jclghk2 = areaMem*jghk(pcl,zcl,ccl2,ccl3,psi2);

          subplot(3,2,1);plot(T,cna1,'r',T,cna2,'-.g',T,cna3,'--b', 'DisplayName','Na in baths 1 & 2 & 3');grid; figure(gcf)
          legend('cna1','cna2','cna3')
          xlabel('temps en s')
          ylabel('[Na+] en mmol/l')
          title('variation de la concentration du sodium en fonction du temps')

          subplot(3,2,2);plot(T,psi1,'r',T,psi2,'-.b', 'DisplayName', 'psi in baths 1 & 2 & 3');grid; figure(gcf)
          legend('psi1','psi2')
          xlabel('temps en s')
          ylabel('psi en mV')
          title('variation de psi en fonction du temps')

          subplot(3,2,3);plot(T,ccl1,'r',T,ccl2,'-.g',T,ccl3,'--b', 'DisplayName','Cl in baths 1 & 2 & 3');grid; figure(gcf)
          legend('ccl1','ccl2','ccl3')
          xlabel('temps en s')
          ylabel('[cl-] en mmol/l')
          title('variation de la concentration du chlore en fonction du temps')

          subplot(3,2,4);plot(T,jnap,'r',T,jnaghk1,'-.g',T,jnaghk2,'--b','DisplayName','jnaghk in baths 1 & 2 & 3');grid; figure(gcf)
          legend('jnap','jnaghk1','jnaghk2')
          xlabel('temps en s')
          ylabel('jna en micromoles/s/cm2')
          title('variation jna en fonction du temps')

          subplot(3,2,5);plot(T,jclghk1,'-.g',T,jclghk2,'--b','DisplayName','jclghk in baths 1 & 2 & 3');grid; figure(gcf)
          legend('jclghk1','jclghk2')
          xlabel('temps en s')
          ylabel('jcl en micromoles/s/cm2')
          title('variation jcl en fonction du temps')

          """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

          si tu peut ,si besoin de savoir comment je peut utiliser "varargout" et "varargin" dans un programme matlab???????????????

          je te remercie vraiment de ton aide

          A plus
          1. Merci bien, j'm'en vais essayer ça. C'était quoi le problème finalement? J'aurai pas été d'un grand secours finalement... :-D
            Pour varargin et varargout c'est quand tu veux pouvoir changer des valeurs par défaut (entre autres) dans une fonction. Par exemple (pour changer de celui donné par Matlab), dans la résolution de ton équa diff, tu peux choisir des options d'entrée ode15s. Dans ce cas tu peux modifier ton programme main en un truc du genre :
            function main(varargin)
            ...
            [T,Y] = ode15s(@dnaclpsi,tspan,y0,varargin);
            ...
            

            Et quand tu lanceras ton main tu pourras lui préciser une liste d'options de résolution si tu veux...

            Pour le varargout, pour ton programme j'ai pas d'exemple en tête. Mais si tu as besoin d'ouvrir un fichier de données sous Matlab, tu as la possibilité de savoir ce qui s'est passé pendant l'ouverture du fichier (réussite, échec, pourquoi...).
            fid = fopen(nom_du_fichier,permission);

            ou si tu veux avoir le message d'erreur
            [fid,message]= fopen(nom_du_fichier,permission);

            Si tu veux garder trace du message.
            Donc si l'ouverture du fichier est contenue dans un programme main, tu peux écrire quelque chose du type
            function [val,varargout]=main(liste_arguments)
            ...
            [fid,message]= fopen(nom_du_fichier,permission);
            if (nargout==1)
            varargout(1)=message;
            end
            ...
            

            Tu pourras lancer le programme en choisissant de garder trace du message ou en prenant seulement la valeur retournée par le programme, au choix...

            Si tu veux pouvoir utiliser un programme qui tourne avec des valeurs par défaut que toi tu as choisies, par exemple pour les concentrations, etc... tout en pouvant les modifier si t'en as envie, pas besoin des vararg, tu utilises juste nargin dans ton programme en lui disant quelles valeurs par défaut prendre quand elles ne sont pas passées en argument. Si c'est plutôt ça que tu voulais, dis-moi.
            A plus
        2. Pour les ode solvers je sais pas mais par expérience Matlab patauge un peu dans la semoule quand il a à travailler avec des Not a Number (NaN). Peut-être une piste...
          1. Bon... désolé atiffa
            Pour le moment je vois pas où ça bloque. Ça marche pour toutes les valeurs jusqu'à 20 j'ai l'impression mais pas pour 20.
            Je continue de chercher quand j'ai un peu de temps.
            A plouche
            1. Re:bonjour:-)

              en fait je pense que je suis pas loin de la solution, parce que j'ai commencer à avoir des sorties graphiques (avec des erreurs bien sûr), mais il y a une seule valeur qui me pose de problème ???????????? à chaque fois que je la modifier ça bloque tous et plus rien qui fonctionne
              si tu veut je peut te passer mon programme mais c'est un peu long:

              """"""""""""""""la 1ére fonction"""""""""""""""""""""""""""""

              function jghki = jghk(pi,zi,cout,cin,psii)
              %JGHK Summary of this function goes here
              % Detailed explanation goes here
              % FRT in 1/mV
              % psi in mV (reference in outside bath)
              % pi (permeability) in cm/s
              % jghk then in micromoles/s/cm2

              FRT = 0.037442;
              if (abs(psii) < 0.001)
              jghki = pi*(cout-cin);
              else
              jghki = -pi*zi*FRT*psii*(cout - cin*exp(zi*FRT*psii))/(1-exp(zi*FRT*psii));
              end

              end
              """"""""""""""""""""""la 2éme fonction""""""""""""""""""""""""""

              function Jnapump = jnapump(vmax,cout,km)

              Jnapump = (vmax*cout)/(km+cout);
              end
              """"""""""""""""""""la 3éme fonction""""""""""""""""""""""""""""
              function dydt = dnaclpsi(t,y)
              %This calculates the RHS of the ODEs for
              % NaCl diffusion across a GHK membrane.
              % Psi is treated as a variable, so this system is stiff.
              % method ode15s works with this, but ode45 does not.
              %
              %cna1 = y(1)/vol1 ; % mmol/l = umol/ml (i.e., qna1 is in umol)
              %cna2 = y(2)/vol2 ; % mmol/l = umol/ml (i.e., qna2 is in umol)
              %cna3 = y(3)/vol3 ; % mmol/l = umol/ml (i.e., qna3 is in umol)
              %ccl1 = y(4)/vol1 ; % mmol/l = umol/ml (i.e., qcl1 is in umol)
              %ccl2 = y(5)/vol2 ; % mmol/l = umol/ml (i.e., qcl2 is in umol)
              %ccl3 = y(6)/vol3 ; % mmol/l = umol/ml (i.e., qcl3 is in umol)
              %psi1 = y(7);
              %psi2 = y(8);

              global vol1 vol2 vol3 pna pcl zna zcl areaMem gammaMem faraday vmax km;
              jna1 = areaMem*jghk(pna,zna,y(1)/vol1,y(2)/vol2,y(7))+ jnapump(vmax,y(1)/vol1,km);
              jna2 = areaMem*jghk(pna,zna,y(2)/vol2,y(3)/vol3,y(8));
              jcl1 = areaMem*jghk(pcl,zcl,y(4)/vol1,y(5)/vol2,y(7));
              jcl2 = areaMem*jghk(pcl,zcl,y(5)/vol2,y(6)/vol3,y(8));
              Itot1 = faraday*(zna*jna1 + zcl*jcl1);
              Itot2 = faraday*(zna*jna2 + zcl*jcl2);

              dydt = [ -jna1
              jna1-jna2
              jna2
              -jcl1
              jcl1-jcl2
              jcl2
              Itot1/gammaMem
              Itot2/gammaMem];
              end %dnaclpsi

              """""""""""""""""""""""""""""""le main.m"""""""""""""""""""""""
              global vol1 vol2 vol3 pna pcl zna zcl areaMem gammaMem faraday vmax km;

              cnacl1init = 50.0 ; %mmol/l, initial NaCl concentration in bath 1
              cnacl2init = 20.0 ; %mmol/l, initial NaCl concentration in bath 2
              cnacl3init = 0.0 ; %mmol/l, initial NaCl concentration in bath 3
              vol1 = 20 ; %ml
              vol2 = 10 ; %ml
              vol3 = 10 ; %ml
              qna1init = cnacl1init * vol1;
              qna2init = cnacl2init * vol2;
              qna3init = cnacl3init * vol3;
              qcl1init = cnacl1init * vol1;
              qcl2init = cnacl2init * vol2;
              qcl3init = cnacl3init * vol3;
              psi1Init = 18; %mv
              psi2Init = 0; %mv

              FRT = 0.037442 ; %1/mV
              faraday = 96.5 ; %coul/mmol = mcoul/umol
              pna=0.1 ; %cm/sec = cm3/(cm2 sec)
              pcl = pna/2 ; %cm/sec = cm3/(cm2 sec)
              zcl=-1;
              zna=1;
              gammaMem = 1e-6; %; memCapacitance = 1e-6 farads/cm2
              areaMem = 1.0 ; %cm2
              vmax = 0.49;
              km = 10;

              tspan = [0 2000];
              y0 = [qna1init; qna2init; qna3init; qcl1init; qcl2init; qcl3init; psi1Init; psi2Init];

              [T,Y] = ode15s(@dnaclpsi,tspan,y0);

              cna1 = Y(:,1)/vol1;
              cna2 = Y(:,2)/vol2;
              cna3 = Y(:,3)/vol3;
              ccl1 = Y(:,4)/vol1;
              ccl2 = Y(:,5)/vol2;
              ccl3 = Y(:,6)/vol3;
              psi1 = Y(:,7);
              psi2 = Y(:,8);
              subplot(3,1,1);plot(T,cna1,'r',T,cna2,'-g',T,cna3,'b', 'DisplayName', 'Na in baths 1 & 2');grid; figure(gcf)
              legend('cna1','cna2','cna3')
              xlabel('temps en s')
              ylabel('[Na+] en mmol/l')
              title('variation de la concentration du sodium en fonction du temps')

              subplot(3,1,2);plot(T,psi1,'r',T,psi2,'b', 'DisplayName', 'psi in baths 1 & 2');grid; figure(gcf)
              legend('psi1','psi2')
              xlabel('temps en s')
              ylabel('psi en mV')
              title('variation de psi en fonction du temps')

              subplot(3,1,3);plot(T,ccl1,'r',T,ccl2,'-g',T,ccl3,'b', 'DisplayName', 'Cl in baths 1 & 2');grid; figure(gcf)
              legend('ccl1','ccl2','ccl3')
              xlabel('temps en s')
              ylabel('[cl-] en mmol/l')
              title('variation de la concentration du chlore en fonction du temps')

              """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

              ce qui me pose problème maintenant c'est le cnacl3initquand je remplace 0 par 20 rien ne marche

              mon niveau en math c'est vraiment niveau bac donc tous ce que tu peut me passer comme exemple ça peut être utile pour moi

              je te re:re:remercie pour ton aide precieuse
              A plus
              1. Salut atiffa
                J'étais justement en train de jeter un œil sur le programme que t'as fait avec berkeley madonna pour voir si je pouvais en faire quelque chose sous Matlab.
                Mais bon, là le me heurte à un truc que je connais pas trop : l'utilisation des ode solvers sous Matlab. En plus en regardant j'ai vu qu'il y en avait une bonne dizaine. Donc le temps de lire et de comprendre ce que fait chacun d'eux...

                Il y a effectivement d'autres méthodes mais finalement je pense que chacune d'elle est en fait plus ou moins implémentée dans les ode solvers.
                Mais si tu veux essayer de le faire toi-même, la méthode des différences finies (tu connais?) consiste à discrétiser ton intervalle de temps, à approcher la dérivée première à l'aide du développement de Taylor à l'ordre 1, à tout écrire sous la forme discrétisée et normalement au final tu as un système linéaire à résoudre pour chaque pas de temps.

                Le programme que tu as écrit, c'est une traduction de celui que tu m'as mis dans le message 8? Si c'est le cas et s'il est pas trop long, est-ce que tu pourrais l'écrire dans ton prochain message? Comme ça ça m'éviterait de faire la traduction Matlab moi-même. Et puis aussi ce serait plus facile pour savoir où se situe l'erreur.

                Pour les liens, je pense que je peux en trouver et te les mettre mais après ça dépend aussi de ce que tu connais en matière de résolution numérique d'équa diiff, je veux pas te mettre un truc trop gamin que tu connais déjà...

                Et... de rien, t'inquiète... :-D
                1. Bonjour sacabouffe (:-D)

                  ce que je trouve pas normale dans ce message d'erreur (de matlab) c'est que j'ai déjà met tous les conditions initiales dans mon programme:

                  """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
                  cnacl1init = 50.0 ; %mmol/l, initial NaCl concentration in bath 1
                  cnacl2init = 20.0 ; %mmol/l, initial NaCl concentration in bath 2
                  cnacl3init = 0.0 ; %mmol/l, initial NaCl concentration in bath 3
                  vol1 = 20 ; %ml
                  vol2 = 10 ; %ml
                  vol3 = 10 ; %ml
                  qna1init = cnacl1init * vol1;
                  qna2init = cnacl2init * vol2;
                  qna3init = cnacl3init * vol3;
                  qcl1init = cnacl1init * vol1;
                  qcl2init = cnacl2init * vol2;
                  qcl3init = cnacl3init * vol3;
                  psi1Init = 18; %mv
                  psi2Init = 0; %mv

                  """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""

                  je sais rien sur ton domaine, mais je veut juste savoir comment tu fait pour résoudre un programme avec des équations différentielles???????????? ( Y aurait-il moyen que tu mettes un lien avec certains exemples c'est cela est possible bien sûr)

                  je sais qu'il y a pas mal des ode solvers de matlab, mais je pense qu'on peut résoudre des eq.diff. sans passer par ce chemin............;
                  c'est ce que j'ai besoin de savoir!!?

                  Je continue de mon coté et si j'ai la solution je ne manquerai pas de t'en faire part!

                  merci beaucoup pour ta gentillesse et pour ta disponibilité :-)

                  A plus
                  A +
                  1. Salut
                    on fait au début ça ma donner des sorties graphiques (qui ne sont pas corrects)
                    j'ai pensé qu'il faut que je change certaines équations ou certaines valeurs, mais sans que je touche à rien il veut même pas afficher les graphes
                    aujourd'hui j'ai essayer de retaper le programme sur mon ordinateur, alors il m'affiche deux messages d'erreur:

                    """"""""""""""""""""
                    ??? Error using ==> odearguments at 117
                    Solving DNACLPSI requires an initial condition vector of length 8.

                    Error in ==> ode15s at 228
                    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

                    >>
                    """"""""""""""""""""

                    qui ce que tu as compris de ces deux messages ???????????

                    je te remercie infiniment de ton aide
                    Aplus
                    1. J'ai jamais utilisé les ode solvers de Matlab mais vraisemblablement il manque les conditions initiales dans ton code...
                      Et je pense que le deuxième message n'est rien d'autre qu'une conséquence du premier. A voir...
                  2. Bonjour sacabouffe,
                    je pense que j'ai encore un petit souci, j'arrive pas à trouver une explication logique
                    le probléme tous simplement est: par exemple hier j'ai implimenter sur matlab un petit programme ca bien marché
                    j'etiend mon ordinateur et je rentre chez moi
                    aujourd'hui j'ai fait tourner le même programme et ca marche pas (sachant que j'ai rien changer de mon programme d'hier)
                    à ton avis ca peut être dit à quoi?????????????,
                    ca me met toujours en retard, parceque chaque fois je me trouve obliger de recommencer de zéro
                    et c'est un peut fatiguant

                    en tous ca je te remercie beaucoup beaucoup
                    et je te souhait un bon weekend
                    1. Salut
                      On peut essayer de répondre à cette petite question pas trop longue, on verra pour le truc plus compliqué plus tard.
                      Peut-être que tu avais des variables en mémoire par exemple. Du coup ça tournait bien... Et pis là tu les as plus...
                      Sinon... ben je vois pas... Ça te met une erreur ou c'est les résultats qui sont pas corrects?
                      Si c'est une erreur, poste la stp que je regarde.
                  • 1
                  • 2