Équations différentielles Scilab

Résolu
ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
 ss_maling25 -
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
A voir également:

28 réponses

ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 835
 
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
0
ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 835
 
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.
0
ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0

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

Posez votre question
Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 835
 
Pas de problème ;-)
À plus tard
0
ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 835
 
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
0
ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 835
 
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
0
ss_maling Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
ça marche. Merci beaucoup.
Je me prépare pour présenter l'état d'avancement de mes travaux. Je reviedrai plus tard.
0
Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 835
 
Salut
Pas de quoi ;-)
Bonne continuation et à bientôt
0
ssmaling
 
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.
0