Équations différentielles Scilab
RésoluDans 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
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.
-
Salut
Pas de quoi ;-)
Bonne continuation et à bientôt-
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.
-
-
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 -
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-
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.
-
-
Pas de problème ;-)
À plus tard-
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
-
-
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. -
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. -
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.032Bon après-midi -
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. -
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 ! -
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+ -
Pas de quoi ;-)
Tiens-nous au courant si t'as d'autres problèmes.
Bonne nuit-
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."
-
-
Message à Sacabouffe,
Pourquoi tu supprimes mon message... T'es propriétaire du site ?
@+ -
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 -
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+ -
Pas de problème ;-)
À bientôt alors ! -
Ok! merci
je suis en train d'essayer le programme. Je t'informerai dans les jours à venir.
A+ -
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 ;-) -
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. -
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 ? -
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