[Matlab] Résoudre un système linéaire itératif

a marqué ce sujet comme résolu.

Ben… Non, tu te donnes un mu_old pour commencer l’itération. Enfin, vu ce que tu dis ensuite, j’ai probablement toujours pas compris correctement le problème.

Je peux mettre n’importe quoi ? Je peux pas initialiser à zéro car je vais devoir faire un ratio pour obtenir une fraction (molaire).

Je sais pas ce que sont ces "fameuses unités de séparation". Encore une fois, je comprends pas ton problème chimique, mais si tu me donnes un problème mathématiquement bien posé on arrivera à avancer. Quand tu parles de "formules" dans tous les sens, ça m’avance pas parce que ça me dit pas qui dépend de qui. J’ai juste besoin de savoir qui est fonction de quoi dans ton problème, et si ces fonctions sont linéaires ou non.

OK. Désolé. Du coup, sans parler chimie mais simplement mathématiquement voici:

  • Toutes les équations que j’ai écris dans le code M(.., ..) sont linéaires et sont simplement des conservations de masse;

  • Cependant, dans ces équation on retrouve un paramètre qu’il faut évaluer avec des équations non-linéaire. C’est les fameux ξ\xi (y en a plusieurs mais ils sont évalués avec les mêmes équations - simplement les valeurs changent).

  • Ces fameuses équations pour trouver ξ\xi sont les suivantes:

Étape 1: on cherche un paramètre appelé N_min

Nmin=ln[ξlk(1ξhk)ξhk(1ξlk)]/lnαlk,hk{N_{\min }} = \ln \left[ {\frac{{{\xi _{lk}}(1 - {\xi _{hk}})}}{{{\xi _{hk}}(1 - {\xi _{lk}})}}} \right]/\ln {\alpha _{lk,hk}}

αij=αijBαijV=Ps,i(TB)Ps,i(TV)Ps,j(TB)Ps,j(TV){\overline \alpha _{ij}} = \sqrt {\alpha _{ij}^B\alpha _{ij}^V} = \sqrt {\frac{{{P_{s,i}}({T^B}){P_{s,i}}({T^V})}}{{{P_{s,j}}({T^B}){P_{s,j}}({T^V})}}}.

On évalue les Ps,iP_{s,i} avec une autre équation non-linéaire qui est:

Ps=10(ABC+T){P_s} = {10^{ - (A - \frac{B}{{C + T}})}}

où la température apparaît!

Étape 2: on calcule le ξ\xi correspondant avec l’équation non-linéaire suivante:

ξj=αj,hkNminξhk/[1+(αj,hkNmin1)ξhk]{\xi _j} = \alpha _{j,hk}^{{N_{\min }}}{\xi _{hk}}/\left[ {1 + (\alpha _{j,hk}^{{N_{\min }}} - 1){\xi _{hk}}} \right]

ξhk\xi_{hk} est une constante (écrit dans le code)

Maintenant, ce qui me pose question, c’est comment tu calcules ces températures, de quelles autres variables elles dépendent. Sans lien entre les températures et les flux je vois mal comment tu comptes t’en sortir.

adri1

C’est la que j’ai besoin des fractions molaires (donc des mu). Chaque nouvelle température sera calculée à partir de là avec une relation (que j’ai pas écrite car j’en suis pas encore sûr.. je dois demander vérification).

J’espère que c’est (finalement) clair!

+0 -0

OK, merci, maintenant c’est parfaitement clair, et je suis rassuré parce que ça se présente comme ce que je pensais avoir compris à partir de tes messages précédents.

Si j’essaye de réexpliquer le truc en reprenant mes notations, voici comment je vois les choses.

Ton but ultime, c’est de résoudre M(μ)μ=R(μ)M(\mu)\mu=R(\mu). Une fois que tu as la solution de cette équation, tu pourras calculer T(μ)T(\mu) et ξ(T(μ))\xi(T(\mu)) et tout ce que tu veux (tu connaîtras donc entièrement ton système).

Tu vas d’abord choisir une valeur initiale devinée pour les flux, appelons-la μ0\mu^0 (c’est ton premier mu_old, je répondrais à ta question de savoir si on peut mettre n’importe quoi dedans à la fin de mon message). Avec ça, tu vas pouvoir calculer T0(μ0)T^0(\mu^0) et ξ0(T0)\xi^0(T^0).

Maintenant, pour trouver une solution à ton équation non linéaire M(μ)μ=R(μ)M(\mu)\mu=R(\mu), on va définir la suite des μn\mu^n par l’équation linéaire suivante sur μn+1\mu^{n+1} : M(μn)μn+1=R(μn)M(\mu^n)\mu^{n+1}=R(\mu^n) (il est facile de se convaincre que μn=μ\mu^n=\mu est un point fixe de cette suite, toute la question des méthodes itératives est de savoir si on peut effectivement l’atteindre et en combien de temps).

Le code général va ressembler à ça (tu en as déjà le plus gros) :

  • choix de μ0\mu^0 ;
  • calcul de T0T^0 ;
  • on donne à T1T^{-1} (qui est une variable purement fictive) une valeur bidon pour entrer dans la boucle (e.g. T0+1T^0+1) ;
  • tant que on T(μn+1)T(μn)>0.1|T(\mu^{n+1}) - T(\mu^n)|>0.1 ;

    • μn\mu^n prend la valeur de μn+1\mu^{n+1} ;
    • TnT^n prend la valeur de Tn+1T^{n+1} ;
    • on calcule ξn\xi^n (qui dépend de μn\mu^n via TnT^n) ;
    • on résout Mnμn+1=RnM^n\mu^{n+1} = R^n avec linsolve ;
    • on calcule Tn+1T^{n+1} pour pouvoir le comparer avec TnT^n au tour suivant.
  • une fois que le calcul à convergé, μn+1\mu^{n+1} et Tn+1T^{n+1} sont (si tu as du bol) la solution que tu cherches.

Pour le choix de μ0\mu^0, c’est toute une question de la forme du résidu μμn\mu-\mu^n autour de μ\mu et μ0\mu^0. Si tu as de la chance et qu’il est concave, tu vas converger sans soucis. Sinon, tu risque de te retrouver dans des minimums locaux (et si t’as vraiment pas de bol, de tourner autour de la solution sans y descendre). En pratique, c’est pour ça qu’on se rabat sur des solveurs déjà écrit comme ceux listés en début de sujet. Là, comme c’est pour un cours, tu ne devrais pas avoir ce genre de soucis j’imagine, et ça devrait converger gentiment. Au cas où, si tu vois que ça prend des plombes, tu peux essayer de tracer μn+1\mu^{n+1} en fonction de μn\mu^n. Si tu vois des cercles ou des tourbillons, change le μ0\mu^0 initial parce que ça veut dire que tu es en train de tourner dans l’espace des phases.

+1 -0

Merci beaucoup ! J’ai réussi à faire fonctionner tout ça. En lisant un peu plus de documentation, je me suis rendu compte qu’on pouvait simplement écrire "X = M/R" dans Matlab. J’imagine que c’est encore plus efficace qu’un linsolve?

Non, ça l’est moins (ou pareil en étant optimiste). Quand tu fais R/M (et pas M/R d’ailleurs, fais gaffe), tu inverses M et tu multiplies R par le résultat. C’est une façon naive de résoudre Mx=R, et linsolve implémente très probablement une manière plus intelligente (à base de factorisation LU j’imagine). (Dans le meilleur des cas, matlab est pas trop con et appelle linsolve quand tu fais une division matricielle, donc tu as la même performance, mais j’en doute).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte