Méthode de Thomas python.
RésoluBonjour,
J'ai écrit un programme sur la méthode de Thomas qui fonctionne, voir ci-dessous :
import numpy as np def tridiag(a, b, c, y): n = len(y) D = [0] * n B = [0] * n D[0] = c[0] / b[0] B[0] = y[0] / b[0] for i in range(1, n): # On met jusqu'à n car en python le dernier élément n'est pas pris et si n=3 i=0, 1, 2 denom = b[i] - a[i] * D[i - 1] D[i] = c[i] / denom B[i] = (y[i] - a[i] * B[i - 1]) / denom x = np.zeros(n, dtype=float) x[-1] = B[-1] for i in range(n - 2, -1, -1): x[i] = B[i] - D[i] * x[i + 1] return x
On me demande à présent de résoudre ceci, mais je ne sais pas du tout comment identifier a, b, c, y dans ce cas-là.
On cherche à résoudre l'équation différentielle suivante:
$f''(x) + 16 f(x) = 4x$ pour $x \in [0, 1]$avec les conditions limites suivantes:
$f(0) = f(1) = 0$Donnez la solution exacte de cette équation, notée $\tilde{f}(x)$
Cordialement,
Lisa.
- Thomas vergeat
- Il veut recevoir les messages de thomas mais ne plus voir ses photos dans son fil d'actualité sur facebook - Guide
- Il veut recevoir les messages de thomas mais ne plus voir ses photos dans son fil d'actualité sur facebook. - Forum Facebook
- Thomas sabo avis ✓ - Forum Vos droits sur internet
- Thomas en arabe - Forum Windows
- Sue thomas l'oeil du fbi streaming vf - Forum Cinéma / Télé
6 réponses
Je déterre ce vieux sujet (c'est mal) car pour une raison mystérieuse il est remonté dans ma liste de discussion active. Un article wikipedia est depuis apparu qui permet désormais de comprendre la question.
On cherche à résoudre l'équation différentielle suivante:
$f''(x) + 16.f(x) = 4.x$ pour $x \in [0, 1]$
Pour résoudre une équation différentielle d'ordre 2 égale à un polynôme d'ordre 1, on peut utiliser la technique de résolution est présentée dans cette vidéo.
- La première étape consiste à résoudre l'équation différentielle d'ordre 2 en ignorant le polynôme (donc $f''(x) + 16.f(x) = 0$) afin de trouver une solution auxiliaire qui permettra à terme de trouver la solution finale. Dans la vidéo elle est notée $y_0$. Pour la trouver on suit cette méthodologie.
- Le polynôme caractéristique est $r^2 + 16 = 0$ dont les racines sont $r_1 = 4.i$ et $r_2 = -4.i$ (où $i$ est l'unité imaginaire).
- Comme $r_1$ et $r_2$ sont deux racines distinctes, $y_0$ est de la forme $y_0(x) = \mu.e^{r_1.x} + \lambda.e^{r_2.x}$ où $\lambda$ et $\mu$ sont deux réels (qu'on détermine généralement à l'aide des conditions limites).
- La seconde étape consiste à trouver un polynôme auxiliaire "compatible" avec l'équation différentielle de départ. Pour cela, comme l'explique la vidéo (1:50), ce polynôme $p$ doit être du même ordre que celui présent dans l'équation différentielle, donc un polynôme d'ordre 1, donc ce polynôme $p$ est d'ordre 1 : $p(x) = a.x + b$. La vidéo traite un cas plus compliqué où ce polynôme est d'ordre 3 ce qui montre toute la puissance de cette technique. Une fois ce polynôme choisi et on le dérive pour pour déterminer $p'$ et $p"$ en vue de le réinjecter dans l'équation différentielle de départ.
- $p'(x) = a$
- $p"(x) = 0$
- Puis on substitue dans l'équation différentielle initiale $f$ par $p$, $f'$ par $f'$ et $f"$ par $p"$ : $p''(x) + 16.p(x) = 0 + 16 a.x = 4.x$ et donc $a = 1/4$ donc $p(x) = x/4$.
- La troisième étape (dans la vidéo 6:30) consiste à rassembler la solution auxiliaire $y_0$ et le polynôme auxiliaire $p$ pour trouver la solution de l'équation différentielle de départ (notée $\tilde{f}$ dans l'énoncé) que je note $y$ pour être cohérent avec la vidéo, et qui est de la forme $y(x) = y_0(x) + p(x)$.
- En effet, comme $y_0$ et $p$ ont été déterminée pour satisfaire individuellement notre équation différentielle, on peut les superposer.
- Si tu ne sais pas ce que le théorème de superposition, c'est très simple. Il suffit d'injecter $y_0$ et $p$ dans l'équation différentielle de départ :
- $f"(x) + 4.f(x) = (y_0 + p)"(x) + 4.(y_0 + p)(x)$
- $... = (y_0"(x) + 4.y_0(x)) + (p(x) + 4.p"(x))$
- $... = p(x) + 4.p"(x)$ (puisque $(y_0"(x) + 4.y_0(x)) = 0$)
- $... = 4.x$ (puisqu'on a construit $p$ pour cela) et donc on retombe bien sur nos pieds !
- On obtient donc $f(x) = y_0(x) + p(x) = \mu.e^{r_1.x} + \lambda.e^{r_2.x} + x/4$ avec $r_1 = -4.i$ et $r_2 = -4.i$. À ce stade $f$ représente un ensemble de fonctions car $\mu$ et $\lambda$ n'ont pas encore été déterminées.
- C'est là que les conditions initiales entrent en jeu : elles vont restreindre l'ensemble fonctions candidates en déterminant les valeurs possibles de $\mu$ et $\lambda$.
- $f(0) = 0$ :
- $\mu.e^{r_1.0} + \lambda.e^{r_2.0} + 0/4 = 0$
- $\mu + \lambda = 0$
- $\mu = -\lambda$
- $f(x) = \mu.(e^(r_1.x) - e^(r_2.x)) + x / 4$
- Comme $r_1 = 4.i$ et $r_2 = -4.i$
- $f(x) = e^(4.i.x) - e^(-4.i.x) + x / 4$
- $f(x) = 2.cos(x / 4) + x / 4$, car pour rappel $cos(x) = (e^{i.x} + e^{-i.x}) /2$
- $f(1) = 0$ :
- $f(1) = 2.\mu.cos(1 / 4) + 1 / 4 = 0$ et donc $\mu = -1 / (8.cos(1/4))$.
- Et donc (si je n'ai pas fait d'erreur) $f(x) = cos(x / 4) / (4.cos(1 / 4)) + x / 4$
Et donc pour reboucler avec la question initiale, je ne vois pas le rapport avec l'algorithme de Thomas qui cherche à résoudre un (cas particulier) de système d'équations.
bonjour,
ta boucle for contredit le commentaire sur la même ligne.
comment testes-tu ton code? es-tu certain qu'il donne le bon résultat?
comprends-tu à quoi sert ce programme?
Ah, pourtant c'est mon professeur qui a fait le programme (parce que j'étais en retard sur les autres).
Mon prof m'a dit que je trouvais le bon résultat avec ça, oui.
Pas très bien car c'est un chapitre sur lequel j'ai des difficultés.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour fleurdepoirier,
Il ne faut pas mal prendre la réponse de yg_be, mais simplement comprendre qu'on manque d'information pour pouvoir te répondre efficacement.
Peux-tu commencer par expliquer le contexte :
- Qu'est ce que la méthode de Thomas ? (je ne trouve pas d'article wikipedia qui en parle)
- À quoi correspond dans ta fonction les paramètres a, b, c, y ? À quoi correspond la valeur retournée x ?
- Peux-tu donner un exemple d'utilisation qui nous permettrait de comprendre quel est le rapport avec le lien que tu donnes ?
Cela augmentera les chances que quelqu'un comprendre le problème, ce qu'il faut faire, et ce qui te bloque.
Bonne chance
Bonjour,
Les aspects mathématique et programmatique me dépassent, mais c'est que tu n'avais pas bien cherché et ce n'est pas bien non plus encore que tu n'y sois pour rien parce que l'auteur a évoqué (et avant que tu ne corriges le titre) la méthode et non pas l'algorithme de Thomas, mais même sur les premiers termes on y arrive quoique moins naturellement.
à partir de ce départ qui évoquera ces initiales, on va d'ailleurs augmenter les retours par une recherche de style "TDMA (ou TriDiagonal Matrix Algorithm) Python".
Il est largement documenté depuis au moins les années 2010-2015 dans un ensemble de cours en ligne de niveau L3, cursus ingénieur 1ère ou 2ème année...
Je ne sais pas pourquoi je ne l'ai pas trouvé à l'époque. Peut-être aussi que comme la "vraie question" ne semble pas avoir de grand rapport avec l'algorithme de Thomas, j'ai pensé à l'époque que ça n'était pas ça. Bref :-)