Equation differentielle sur matlab

Résolu/Fermé
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 - 12 févr. 2008 à 11:51
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 11 juil. 2008 à 18:10
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

25 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
17 févr. 2008 à 18:15
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
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
22 févr. 2008 à 12:58
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
22 févr. 2008 à 13:05
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
23 févr. 2008 à 17:01
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
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
12 févr. 2008 à 18:50
Salut atiffa
Il faudrait être plus clair sur ce que sont tous les termes de ton équa diff.
A plus
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
donner moi une equa diff
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
12 févr. 2008 à 22:01
T'es qui toi Bozo?
Tu t'es perdu?
Tiens prends dont cette équa diff. Elle te fera pas de mal.
Trois fois par jours avant chaque repas.
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
13 févr. 2008 à 13:08
Bonjour Scabouffe,
c'est gentil da ta part de m'apprendre la politesse,
mais ca réponde pas à la question que j'ai poser

je te remercie infiniment
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
13 févr. 2008 à 13:31
Salut atiffa
Mon message ne s'adressait pas à toi!!! :-D
Il s'adressait à kadide qui est venu polluer ton topic.
Cela dit, si j'ai répondu à ton post c'est pour t'aider. Mais tu ne m'aides pas...
Je reformule donc une nouvelle fois le message 1, pourrais-tu, s'il te plaît, préciser ce que sont tous les termes de ton équa diff?
Adtaleur
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
14 févr. 2008 à 09:48
Salut sacabouffe;
on fait il ne s'agit pas d'une seule eq.diff. mais c'est toute un sujet à programmer sur matlab
c'est un sujet en électrophysiologie (plus précisement en diffusion des ions à travers la membrane de tubule rénal)
j'ai besoin de calculer la variation des concentrations ioniques de part et d'autre de la membrane en fonction du temps
dans mon programme: j'ai besoin des differentes constantes, des valeurs initiales de chaque variable (à temps 0)
des équations de concentrations et de flux ionique à travers la membrane
mais le probléme (pour moi) c'est que la solution d'une équation dépend de la solution des autres équations
alors je suis perdu ( dans mon modèle tous vari en fonction du temps (les concentrations et les permeabilités))

je suis vraiment perdu
c'est pour ca je ne peut pas donner un exemple des eq.diff.

je sais pas c'est tu peut m'aider pour résoudre mon probléme ou non

je te remercie
A plus
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
14 févr. 2008 à 13:59
Re salut
Ouais, ouais, ouais, je vois le genre...
Y aurait-il moyen que tu mettes un lien vers un pdf ou autre avec toutes les équations, conditions aux limites et conditions initiales dans ton prochain message, que je jette un œil à tout ça? Parce que là comme ça difficile de te donner des pistes.
Je verrai si je peux te filer un coup de main, ce qui est pas sûr du tout... Mais bon... on verra...
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
14 févr. 2008 à 15:08
Bonjour sacabouffe;

j'ai une version de ce programme qu'etait fait sur un autre logiciel (berkelymadonna) et j'ai besoin de le convertir en matlab:
la version berkelymadonna est le suivant :

""""""""""""""""""""""""""
METHOD stiff

STARTTIME = 0
STOPTIME = 100
DT = 0.002


cnacl1init = 50.0 ; mmol/l ,initial NaCl concentration in bath 1
cnacl2init = 1.0 ;mmol/l ,initial NaCl concentration in bath 2

FRT = 0.037442 ; 1/mV
faraday = 96.5 ; coul/mmol
pna = 0.1 ; cm/sec, pérmeabilite au sodium
pcl = pna/2 ; cm/sec, pérmeabilité au chlore
zcl =-1 ; la valence de cl-
zna = 1 ; la valence de NA+
gammaMem = 1e-6 ; la capacité de la membrane
vol1 = 20 ; ml , le volume dans le compartiment 1
vol1 = 10 ;ml, le volume dans le compartiment 2
areaMem = 1.0 ;cm2, l'aire de la membrane qui sépare les deux compartiments

Upsi = FRT*psi ; dimentionless membrane potential

na1=qna1/vol1 ;mmol/l, concentration de Na dans le compartiment 1
na2=qna2/vol2 ;mmol/l, concentration de Na dans le compartiment 2
cl1=qcl1/vol1 ;mmol/l, concentration de Cl dans le compartiment 1
cl2=qcl2/vol2 ;mmol/l, concentration de Cl dans le compartiment 2
qna1>
""""""""""Equation JGHK pour calculer le flux ionique à travers la membrane"""""""""""""""""""""""""

JghkNa = -pna*zna*Upsi*(na1-na2*exp(zna*Upsi))/(1-exp(zna*Upsi)) ; umol/cm2/sec
JghkNa0 = pna*(na1-na2) ;use Fick near psi=0


JghkCl = -pcl*zcl*Upsi*(cl1-cl2*exp(zcl*Upsi))/(1-exp(zcl*Upsi)) ; umol/cm2/sec
JghkCl0 = pcl*(cl1-cl2) ;use Fick near psi=0


JNa = if (abs(Upsi)<=0.001) then JghkNa0 else JghkNa ; umol/cm2/sec
JCl = if (abs(Upsi)<=0.001) then JghkCl0 else JghkCl ; umol/cm2/sec

"""""""""""""""""""""le coursnt total"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Itot = areaMem*faraday*(zna*JNa+zcl*JCl) ;mA/cm2

""""""""""""""""les eq.diff.""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

d/dt (qna1) = -areaMem*JNa

d/dt (qcl1) = -areaMem*JCl

d/dt (qna2) = -areaMem*JNaqna1>

d/dt (qcl2) = -areaMem*JCl

d/dt (psi) = Itot/gammaMem


""""""""""""""""""""""""""les valeurs initiales""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

init psi = 18 ;mv
init qna1 =cnacl1init*vol1
init qcl1 =cnacl1init*vol1
init qna2 =cnacl2init*vol2qna1>
init qcl2 =cnacl2init*vol2



limit qna1>=0
limit qna2>=0
limit qcl1>=0
limit qcl2>=0
limit psi>=-200
limit psi<=200
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

et c'est tout pour le momment
je sais pas c'est tu va le comprend ou non

et je te remercie encore pour ton aide et ta patience
A plus
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
14 févr. 2008 à 15:33
Re salut :-D (on n'arrête plus...)
De rien...
Je jetterai un œil plus tard et je te dirai si je suis arrivé à quelque chose.
A plus
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832 > Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009
15 févr. 2008 à 13:43
Je regarde ce soir ou ce we, promis.
PS : Mets tes autres topics en résolu
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
15 févr. 2008 à 15:51
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
15 févr. 2008 à 15:57
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.
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
16 févr. 2008 à 16:21
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
17 févr. 2008 à 16:02
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...
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
17 févr. 2008 à 17:43
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 +
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
17 févr. 2008 à 18:48
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 févr. 2008 à 11:12
Salut atiffa
En fait la description de Wikipédia pour les différences finies m'a l'air plutôt bien faite, donc si tu veux te faire une idée...
Wikipédia Méthodes des différences finies
Je cherche ce qui va pas dans ton code, si de ton côté t'as des nouvelles, dis-moi.
Ciao
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 févr. 2008 à 18:03
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
19 févr. 2008 à 18:11
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...
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
21 févr. 2008 à 12:02
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
21 févr. 2008 à 18:22
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
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
22 févr. 2008 à 12:28
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
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
22 févr. 2008 à 18:06
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
22 févr. 2008 à 18:21
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.
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
22 févr. 2008 à 20:35
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 :-)
0
atiffa Messages postés 54 Date d'inscription lundi 4 février 2008 Statut Membre Dernière intervention 10 juin 2009 12
28 févr. 2008 à 10:00
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
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
28 févr. 2008 à 15:23
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
0