La semaine dernière je vous demandais comment résoudre un système non-linéaire relativement simple, cette semaine c’est un système linéaire itératif (car il est implicite). Pour faire simple, je dois résoudre un système assez gros (j’ai pas compté mais ça doit faire une quarantaines d’équations) mais de façon itérative… C’est-à-dire que je fais une estimation d’un paramètre (ici, la température) et je recalcule tous les paramètres jusqu’à avoir convergence (mon critère est: abs(Told - Tnew) < 0.1).
J’ai pas encore tenté d’écrire le code mais j’ai déjà toutes mes équations (je pense) et donc je me demandais quelle était l’approche la plus simple et plus efficace pour le faire ? Comme vous le savez, j’y connais très peu en programmation / Matlab donc ça m’aiderait d’avoir une explication de comment le coder!
Je mettrai mon code après parce qu’il risque de toute façon d’avoir des pépins
Merci d’avance!
Edit:
D’un point de vue de la structure du code ça devrait je pense ressembler à ça (conceptuellement)
BLOC AVEC LE SYSTEME D’EQ LINEAIRE (44) Ax = B
À LA FIN DU SYSTÈME, CALCULER DES VARIABLES AVEC LES SOLUTIONS DE CE SYSTEME
CALCULER DE NOUVELLES VARIABLES (POUR OBTENIR MA TEMPERATURE)
CONDITION "IF" T_ANCIEN - T_NOUVEAU < 0.1 => OK, LES SOLUTIONS SONT LES BONNES
SINON ("ELSE") -> RECALCULER
(J’ai mis en majuscule pour montrer que je vois ça sous forme de différents blocs / étapes).
je dois résoudre un système assez gros (j’ai pas compté mais ça doit faire une quarantaines d’équations) mais de façon itérative
C’est ridiculement petit, résoudre ça de façon directe serait beaucoup plus malin. Il t’est imposé d’utiliser une méthode itérative ? Est-ce que ta matrice est particulière (symétrique et/ou creuse par exemple) ?
Sinon, les méthodes itératives sont déjà implémentées, voir lsqr, gmres, minres pour ne citer que les plus générales (hésite pas à piocher dans "See Also" à la fin des docs de ces fonctions). Remarque qu’elles signalent toutes qu’elles sont pensées pour des matrices grandes (40, c’est pas grand) et creuses (avec plein de zéros).
Ça m’est imposé car c’est un problème d’ingénierie et je dois estimer une température dans une colonne de distillation sauf que je sais pas si la bonne mais comme je connais le flux de produit que je veux sortir, je dois faire en sorte d’avoir les bonnes températures.
J’ai pas complètement écrit la matrice la matrice mais elle est assez creuse (pas symétrique par contre). Je pourrais la copier ici mais je sais pas si c’est une bonne idée au vu de la taille de celle-ci
Ça m’est imposé car c’est un problème d’ingénierie et je dois estimer une température dans une colonne de distillation sauf que je sais pas si la bonne mais comme je connais le flux de produit que je veux sortir, je dois faire en sorte d’avoir les bonnes températures.
Je suis en train de me dire qu’on ne parle peut être pas la même langue, alors je vais essayer de mieux comprendre ton problème.
Est-ce que tu dois résoudre un système du genre MT=R avec M une matrice constante, T ton vecteur d’inconnues et R un vecteur quelconque constant ? Si oui, je ne vois pas en quoi le problème concret que tu tentes de résoudre va imposer le choix d’une méthode itérative.
Ou est-ce que M et R dépendent de T auquel cas ton problème n’est plus linéaire et le choix d’une méthode itérative serait plus compréhensible.
Plutôt que copier la matrice, t’aurais pas une forme générale pour les équations vérifiées par la température ?
Je vais expliquer le problème d’abord pour être plus clair sinon ça reste très flou pour vous. Je dois résoudre un problème de chimie industrielle pour la production d’un polymère (styrène). J’ai deux réactions qui ont lieu dans le réacteur et mes trois derniers éléments (Flash, Dist 1 et Dist 2) sont des unités de séparations où je ne connais pas la température. Cependant je connais la production de styrène que je veux obtenir à la fin. Vu que j’ai cette infos (et d’autres comme la pression etc.), je peux écrire pleins d’équations de conservation de masse etc.
Voici quelques équations (je les mets pas toutes mais elles se ressemble concernant la forme):
(pour 5 "i" différents car j’ai 5 espèces au total, i = EB, CY, H, ST, H ; M(i) c’est des constantes [masse molaire]).
μ2EB=μ1EB(1−XA)
μ2H=μ1H+μ1EBXA−3μ1HXB
(XA et XB sont des constantes connues)
Puis, dans la première unité de séparation [3. FLASH sur le schéma] on enlève "H". Donc, faut imaginer qu’après 3. on a plus que quatre espèces, ie.
μ4.1H=μ4.2H=0 (pareil pour le flux 5)
Finalement, on a les équations qui vont faire intervenir "indirectement" la température au niveau des unités de séparation (3, 4 et 5). Voici un exemple et c’est pareil pour toutes les espèces:
μ4.1i=μ3.2iξ4i(T4D,T4B)
où ξ(...) est une valeur qui est comprise entre 0 et 1 (c’est simplement le pourcentage de ce qui va se retrouver en haut de l’unité de séparation pour l’espèce i). Ce ξ(...) dépend de la volatilé relative et donc de la température. Ces expressions ne sont plus linéaires par contre.
Ce que je peux encore écrire en fonction des températures sachant que
logPs=A−T+CB
où A, B et C sont des constantes que je connais.
Là, on imagine qu’on a fait une itération… Puis je peux calculer mes compositions (fractions molaires car je connais tous les flux, c’est bêtement relié) et calculer une nouvelle température Tnew=i∑xiPs,i .
L’exercice me donne un critère de convergence ∣T5.1,old−T5.1,new∣<0.1[K]
Et mes inconnues sont tous les flux μ (sauf pour ST car je connais la quantité que je veux produire).
J’espère que c’est un peu plus clair. Je sais que c’est assez long et pourtant j’ai réduit au maximum le nombre d’équations… Ça m’a pris pas mal de temps à fixer toutes ces équations, maintenant reste à l’implémenter dans Matlab ce qui a l’air plus complexe que je ne le pensais
Je vais être honnête, je comprends pas grand chose à ces équations ni à tes notations. Mais si j’essaye de résumer, tu as des équations liant les μ (et non les T comme je croyais au début…) avec des coefficients qui sont des fonctions des T, elles même fonctions des μ. Donc ton système n’est pas linéaire, en fait, mais de la forme M(μ)μ=R.
Si je comprends bien, c’est dans un cadre scolaire puisque tu parles d’exercice. Vu la façon dont tu présentes les choses, j’ai l’impression que ton système se comporte de façon sympathique et la solution μ est un point fixe de la suite définit par récurrence par M(μn)μn+1=Rn. Donc probablement que ce qui est attendu est juste de construire la suite des μn à coup de linsolve jusqu’à ce que T(μn+1)−T(μn) converge à la précision souhaitée.
Exactement! Désolé si c’était très ambigu. Je vais tenter de faire un linslove avec la documentation MATLAB et revenir ici si j’ai des soucis. Mais du coup, si c’est un linsolve c’est bien un système linéaire, non?
Est-ce qu’un fsolve ferait l’affaire aussi ? C’est simplement pour éviter de mettre les équations sous forme de matrice car ça risque d’être compliqué vu le nombre d’équations et de paramètres.
Mais du coup, si c’est un linsolve c’est bien un système linéaire, non?
Dans l’expression M(μn)μn+1=Rn, μn+1 est solution d’un système linéaire. Ça n’empêche que le μ que tu cherches lui, est solution d’une équation non linéaire.
Est-ce qu’un fsolve ferait l’affaire aussi ? C’est simplement pour éviter de mettre les équations sous forme de matrice car ça risque d’être compliqué vu le nombre d’équations et de paramètres.
Quitte à utiliser fsolve, t’aurait autant de mettre ton équation sur μ plutôt que te t’embêter à passer par la suite des μn. Il serait par ailleurs absurde de passer par fsolve pour résoudre un système linéaire. Ce sera pas plus compliqué de passer par une matrice de toute façon.
Je voyais pas trop comment créer une matrice avec toutes ces variables mais j’ai écrit le code avec fsolve. Il manque encore des données (les pressions de saturation que je dois chercher avec les coefficients d’Antoine) et le calcul à la fin de mes fractions molaires. Cependant, je vois pas du tout comment faire une boucle / résoudre de manière itérative ce système.
Je laisse quand même toutes les équations pour les curieux même si elles sont pas vraiment utile pour répondre à la question (je suppose). J’ai 45 équations et 45 variables à trouver. Mes paramètres qui dépendent de T sont les ξ (enfin, indirectement car ça dépend de la volatilité relative qui elle dépend de la pression saturante donc de T). J’ai plusieurs températures (4 car deux colonnes et 2 températures par colonnes) mais l’exercice me demande de mettre comme critère de convergence uniquement ∣T5.1,old−T5.1,new∣<0.1 ce qui me perturbe aussi…
J’espère que c’est pas trop bordélique mais tout commentaire est bon à prendre pour que je m’améliore :-)
Je voyais pas trop comment créer une matrice avec toutes ces variables mais j’ai écrit le code avec fsolve.
Encore une fois, c’est complètement aberrant. Tu utilises un solveur hyper-général pensé pour des équations non linéaires, et tu injectes un problème linéaire dedans. C’est inefficace possible, ça ne simplifie pas le code, et en plus ça rend ton intention beaucoup plus difficile à lire. Personne ne va s’attendre à ce que tu utilises fsolve pour résoudre un système linéaire, et encore moins pour résoudre n fois un système linéaire purement accessoire pour résoudre un système non linéaire qui aurait pu être injecté directement dans fsolve. C’est un peu comme si tu voulais détruire un immeuble infesté de mouche, et que tu utilises un bulldozer pour tuer les mouches une par une au lieu de détruire directement l’immeuble.
Il manque encore des données (les pressions de saturation que je dois chercher avec les coefficients d’Antoine) et le calcul à la fin de mes fractions molaires. Cependant, je vois pas du tout comment faire une boucle / résoudre de manière itérative ce système.
Les valeurs successives du vecteur μ sont notées μn. Le cœur de ton programme va ressembler à ça :
tant que ∣T51(μn)−T51(μn+1)∣<0.1
μn←μn+1
calcul de M(μn) et R(μn)
calcul de μn+1 solution de M(μn)μn+1=R(μn)
Pour le calcul de M(μn) et R(μn), ça demande un peu d’organisation. Je vais noter avec un indice les différences composantes du vecteur inconnu μ. Disons pour simplifier que tu as trois inconnues, μ1, μ2 et μ3. Tu as trois équations, mettons
μ1+α(μ)μ2μ2+3μ3μ1−δ(μ)μ3=β(μ)=γ(μ)=0
avec α(μ), β(μ), γ(μ) et δ(μ) des coefficients qui dépendent de μ.
Pour écrire ça sous forme matricielle, il va falloir mettre une équation par ligne dans la matrice. Si je reprends le système d’au dessus et que je rajoute les exposants dénotant les itérations, ça va ressembler à ça :
Je comprends tout à faire le concept mais pas tellement comment l’écrire… J’ai transcrit tout ça dans la matrice qui est donc une 45×45. J’ai pas encore mis les température T51 et T52 mais bon pour ce qui en est des équations on en est presque là (ça sera pareil que pour T41 et T42). À part ça, c’est sûrement plus optimal d’utiliser linsolve mais ça m’a pris du temps vu la taille de la matrice
Ce que je comprends pas c’est quand est-ce que je dois intégrer "mu_old" dans mes équations… Est-ce que c’est au-moment où j’ai une dépendence sur les température ? (donc où j’ai des "xi")
Aussi, je ne vois pas super bien où je pourrais intégrer la boucle while. Est-ce que je met tout le système ? J’aurai aussi des termes non-linéaires vu que la température apparaît dans les équations d’Antoine pour le calcul des pressions saturantes (P_s dans le code).
Je comprends tout à faire le concept
[…]
Ce que je comprends pas c’est quand est-ce que je dois intégrer "mu_old" dans mes équations… Est-ce que c’est au-moment où j’ai une dépendence sur les température ? (donc où j’ai des "xi")
Aussi, je ne vois pas super bien où je pourrais intégrer la boucle while. Est-ce que je met tout le système ? J’aurai aussi des termes non-linéaires vu que la température apparaît dans les équations d’Antoine pour le calcul des pressions saturantes (P_s dans le code).
Ces questions me font dire que tu n’as pas compris l’idée derrière l’algorithme. mu_old va en effet apparaître à travers certains des coefficients (les xi qui dépendent des T qui eux même dépendent de mu).
Pour la boucle while, je l’ai écrit dans ce message. Le but, c’est d’itérer tant que les températures n’ont pas convergées. Et oui tu vas avoir des termes non linéaires en mu_old dans la matrice, c’est le but de toute la méthode : transformer une équation non linéaire en une limite d’un processus itératif linéaire.
Si je reprends le code dans mon message précédent, j’aurai donc un while partir de la ligne 33 jusqu’à la ligne 300? Boucle de la forme:
Jusqu’à la toute fin, même, sinon ça sert pas à grand chose si mu_new et mu_old ne sont pas mis à jour au fur et à mesure.
Et par exemple, à la ligne 194 où j’ai une dépendance sur T, j’aurai xi_5_EB(mu_old) ?
Oui. Enfin, ce sera peut être pas écrit comme ça exactement mais c’est l’idée : la valeur de xi_5_EB va dépendre de mu_old d’une manière ou d’une autre.
D’accord. Par contre, je vois pas comment est-ce que je peux récupérer une solution.. Est-ce que c’est par exemple munew(2) qui va me renvoyer ${\mu {0,EB}}$ ?
Je demande car j’en ai besoin pour calculer les fractions molaire que je calculerais donc juste après la ligne mu_new = linsolve(M, R). Et du coup, ma boucle ira jusqu’après le calcul des nouvelles températures (ie. juste après les fractions molaires…)
Par contre, j’avoue que je vois pas du tout comment je pourrais écrire la valeur de xi_5_EB en fonction de mu_old avec du code…
Est-ce que c’est par exemple munew(2) qui va me renvoyer μ0,EB ?
Ben ça je peux pas le deviner à ta place, je ne sais pas à quelle position dans le vecteur μ tu as mis μ0,EB…
Je demande car j’en ai besoin pour calculer les fractions molaire que je calculerais donc juste après la ligne mu_new = linsolve(M, R). Et du coup, ma boucle ira jusqu’après le calcul des nouvelles températures (ie. juste après les fractions molaires…)
Hmmm, t’aurais pas intérêt à mettre ces calculs là au début de la boucle plutôt qu’à la fin ? Ça t’évite d’avoir à les initialiser.
Par contre, j’avoue que je vois pas du tout comment je pourrais écrire la valeur de xi_5_EB en fonction de mu_old avec du code…
Ben… Ça aussi c’est pas un truc que je peux deviner, c’est toi qui est censé savoir comment ces coefficients se calculent. C’est toi qui m’avait dit que pour une valeur de μ, tu pouvais calculer les T et en déduire les ξ. Ben il suffit d’écrire juste ça.
Au fait, je viens de voir mais là :
while abs(T51(mu_old) - T51(mu_new)) <0.1
ta condition est dans le mauvais sens. while, ça veut dire tant que, pas jusqu’à ce que.
Est-ce que c’est par exemple munew(2) qui va me renvoyer μ0,EB ?
Ben ça je peux pas le deviner à ta place, je ne sais pas à quelle position dans le vecteur μ tu as mis μ0,EB…
Oui oui, je veux dire du point de vue conceptuel. En Matlab, quand c’est un vecteur à une dimension il suffit de faire mu_new(2) et pas mu_new(2,1) ou pas?
Hmmm, t’aurais pas intérêt à mettre ces calculs là au début de la boucle plutôt qu’à la fin ? Ça t’évite d’avoir à les initialiser.
Sûrement Le soucis si je les mets au début c’est que la première fois que la boucle va tourner elle sera perdue car elle aura pas encore de valeurs pour mes mu_new ?
Ben… Ça aussi c’est pas un truc que je peux deviner, c’est toi qui est censé savoir comment ces coefficients se calculent. C’est toi qui m’avait dit que pour une valeur de μ, tu pouvais calculer les T et en déduire les ξ. Ben il suffit d’écrire juste ça.
Ah, ça je l’ai fait avant de lister toutes les équations (lignes 35–60 pour l’unité 4 avant d’initialiser M et R à zéro):
%Splitting ratio xi
%Unit 4
xi_4_lk = 0.99; %EB
xi_4_hk = 0.01; %ST
P_s_4_lk_B = 10^(-(A_EB - B_EB/(T_42 + C_EB))) ;%Antoine Eq for saturation pressure (@ bottom and top of the col)
P_s_4_lk_V = 10^(-(A_EB - B_EB/(T_41 + C_EB)));
P_s_4_hk_B = 10^(-(A_ST - B_ST/(T_42 + C_ST)));
P_s_4_hk_V = 10^(-(A_ST - B_ST/(T_41 + C_ST)));
P_s_4_B_B = 10^(-(A_B - B_B/(T_42 + C_B)));
P_s_4_B_V = 10^(-(A_B - B_B/(T_41 + C_B)));
P_s_4_CY_B = 10^(-(A_CY - B_CY/(T_42 + C_CY)));
P_s_4_CY_V = 10^(-(A_CY - B_CY/(T_41 + C_CY)));
P_4 = 0.05; %pressure of the col 4 [bar]
%Define K-value (ie. P_sat / P_column)
K_4_lk_B = P_s_4_lk_B / P_4;
K_4_lk_V = P_s_4_lk_V / P_4;
K_4_hk_B = P_s_4_hk_B / P_4;
K_4_hk_V = P_s_4_hk_V / P_4;
K_4_B_B = P_s_4_B_B / P_4;
K_4_B_V = P_s_4_B_V / P_4;
K_4_CY_B = P_s_4_CY_B / P_4;
K_4_CY_V = P_s_4_CY_V / P_4;
alpha_4_lkhk = (K_4_lk_B*K_4_lk_V/(K_4_hk_B*K_4_hk_V))^(1/2) % relative volatility between lk and hk (geometric mean). B = Bottom of the col , V = Vapour (ie top of the col)
N_4_min = log(xi_4_lk*(1-xi_4_hk)/xi_4_hk*(1-xi_4_lk))/log(alpha_4_lkhk); %Min number of stages (to calculate splitting ratios of the other comp.)
alpha_4_Bhk = ((K_4_B_B*K_4_B_V)/(K_4_hk_B*K_4_hk_V))^(1/2);% rel. vol. between B and ST (geom. mean)
alpha_4_CYhk = ((K_4_CY_B*K_4_CY_V)/(K_4_hk_B*K_4_hk_V))^(1/2):% rel. vol. between CY and ST (geom. mean)
xi_4_B = ((alpha_4_Bhk)^(N_4_min)*xi_4_hk)/(1+(alpha_4_Bhk-1)*xi_4_hk);
xi_4_ST = 0.01
xi_4_EB = 0.99
xi_4_CY = ((alpha_4_CYhk)^(N_4_min)*xi_4_hk)/(1+(alpha_4_CYhk-1)*xi_4_hk);
%Unit 5
xi_5_lk = 0.99; %CY
xi_5_hk = 0.01; %EB
P_s_5_lk_B = 10^(-(A_CY - B_CY/(T_52 + C_CY))) ;%Antoine Eq for saturation pressure (@ bottom and top of the col)
P_s_5_lk_V = 10^(-(A_CY - B_CY/(T_51 + C_CY)));
P_s_5_hk_B = 10^(-(A_EB - B_EB/(T_52 + C_EB)));
P_s_5_hk_V = 10^(-(A_EB - B_EB/(T_51 + C_EB)));
P_s_5_B_B = 10^(-(A_B - B_B/(T_52 + C_B)));
P_s_5_B_V = 10^(-(A_B - B_B/(T_51 + C_B)));
P_s_5_ST_B = 10^(-(A_ST - B_ST/(T_52 + C_ST)));
P_s_5_ST_V = 10^(-(A_ST - B_ST/(T_51 + C_ST)));
P_5 = 1; %pressure of the col 4 [bar]
%Define K-value (ie. P_sat / P_column)
K_5_lk_B = P_s_5_lk_B / P_5;
K_5_lk_V = P_s_5_lk_V / P_5;
K_5_hk_B = P_s_5_hk_B / P_5;
K_5_hk_V = P_s_5_hk_V / P_5;
K_5_B_B = P_s_5_B_B / P_5;
K_5_B_V = P_s_5_B_V / P_5;
K_5_ST_B = P_s_5_ST_B / P_5;
K_5_ST_V = P_s_5_ST_V / P_5;
alpha_5_lkhk = (K_5_lk_B*K_5_lk_V/(K_5_hk_B*K_5_hk_V))^(1/2) % relative volatility between lk and hk (geometric mean). B = Bottom of the col , V = Vapour (ie top of the col)
N_5_min = log(xi_5_lk*(1-xi_5_hk)/xi_5_hk*(1-xi_5_lk))/log(alpha_5_lkhk); %Min number of stages (to calculate splitting ratios of the other comp.)
alpha_4_Bhk = ((K_5_B_B*K_5_B_V)/(K_5_hk_B*K_5_hk_V))^(1/2);% rel. vol. between B and ST (geom. mean)
alpha_5_SThk = ((K_5_ST_B*K_5_ST_V)/(K_5_hk_B*K_5_hk_V))^(1/2):% rel. vol. between CY and ST (geom. mean)
xi_5_B = ((alpha_5_Bhk)^(N_5_min)*xi_5_hk)/(1+(alpha_5_Bhk -1)*xi_5_hk);
xi_5_EB = 0.01
xi_5_CY = 0.99
xi_5_ST = ((alpha_5_SThk)^(N_5_min)*xi_5_hk)/(1+(alpha_5_SThk -1)*xi_5_hk);
Là, j’ai déjà défini ce qu’était ces ξ. Mon but juste avant ces quelques lignes est de donner des températures (notées T_52, T_51, … dans le code) approximatives pour les faire converger par la suite vers les températures réelles. Mais dans tout ça j’ai jamais dans mon code un "mu_old" ce qui me perturbe énormément pour l’écriture de la boucle.
Ah merci! Je dois donc changer le sens de l’inégalité :-)
Le soucis si je les mets au début c’est que la première fois que la boucle va tourner elle sera perdue car elle aura pas encore de valeurs pour mes mu_new ?
Rien compris, lors du premier tour de boucle, mu_new n’a pas encore été calculé une seule fois, comment diable compte tu te servir de sa valeur ? Au deuxième tour de boucle, le mu_old sera le mu_new du tour précédent et sera utilisé à ce moment là.
Ah, ça je l’ai fait avant de lister toutes les équations (lignes 35–60 pour l’unité 4 avant d’initialiser M et R à zéro):
Elles sortent d’où T_41 et T_42 ? Et les valeurs des différents xi ? De ce que j’avais compris, c’était ça qui dépendait de μ (et donc dans ta boucle, de mu_old). Si ça dépend pas de μ, alors j’ai absolument rien compris à ton problème depuis le départ et j’ai joyeusement écrit des M(μ) alors que ta matrice ne dépend pas de μ…
Rien compris, lors du premier tour de boucle, mu_new n’a pas encore été calculé une seule fois, comment diable compte tu te servir de sa valeur ? Au deuxième tour de boucle, le mu_old sera le mu_new du tour précédent et sera utilisé à ce moment là.
Mais… alors, faut bien que je le mette à la fin vu que j’ai aucune idée des "mu_old"… J’aurai une idée de leur valeur uniquement après la première itération.
T41 et T_42 (idem pour T_51 et T_52) sont des températures de ces fameuses unités de séparation. C’est pour ces paramètres que je "devine" les valeurs… Les ξi (xi) ce sont des formules de mon cours pour ces unités de séparation. Ces ξi ne dépendent pas des flux μ mais uniquement du paramètre $N{min}$ (calculé juste avant par une autre formule) et de la volatilité relative (ie. de la température -> T_41 et T_42 pour l’unité 4)
Pour répéter, tous les μ sont mes inconnues mais les quatre températures T le sont aussi (même si je les devine au début, à la fin elles auront des valeurs différents en fonction de la convergence).
Mais… alors, faut bien que je le mette à la fin vu que j’ai aucune idée des "mu_old"… J’aurai une idée de leur valeur uniquement après la première itération.
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.
T_41 et T_42 (idem pour T_51 et T_52) sont des températures de ces fameuses unités de séparation. C’est pour ces paramètres que je "devine" les valeurs… Les ξi (xi) ce sont des formules de mon cours pour ces unités de séparation.
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.
Ces ξi ne dépendent pas des flux μ mais uniquement du paramètre Nmin (calculé juste avant par une autre formule) et de la volatilité relative (ie. de la température -> T_41 et T_42 pour l’unité 4)
Pareil, tu parles de formule mais sans me dire qui dépend de quoi je suis dans le flou le plus complet.
Pour répéter, tous les μ sont mes inconnues mais les quatre températures T le sont aussi (même si je les devine au début, à la fin elles auront des valeurs différents en fonction de la convergence).
Comme t’as dit trois trucs différents au moins, je me suis un peu perdu en route.
Si j’essaye de re-résumer, tu as des flux (un vecteur de μ) inconnus reliés par plein d’équations qui peuvent se mettre sous forme matricielle. Les coefficients de cette matrice dépendent des coefficients ξ qui je comprends bien sont eux-même des fonctions des températures qui sont aussi des inconnues du problème. Jusque là j’ai bon, ou il me manque un truc ?
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.
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 ξ (y en a plusieurs mais ils sont évalués avec les mêmes équations - simplement les valeurs changent).
Ces fameuses équations pour trouver ξ sont les suivantes:
Étape 1: on cherche un paramètre appelé N_min
Nmin=ln[ξhk(1−ξlk)ξlk(1−ξhk)]/lnαlk,hk
où αij=αijBαijV=Ps,j(TB)Ps,j(TV)Ps,i(TB)Ps,i(TV).
On évalue les Ps,i avec une autre équation non-linéaire qui est:
Ps=10−(A−C+TB)
où la température apparaît!
Étape 2: on calcule le ξ correspondant avec l’équation non-linéaire suivante:
ξj=αj,hkNminξhk/[1+(αj,hkNmin−1)ξhk]
où ξhk est une constante (écrit dans le code)
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).
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