diff --git a/tp8.py b/tp8.py index e65062f..f5a0bc7 100644 --- a/tp8.py +++ b/tp8.py @@ -1,7 +1,8 @@ import matplotlib.pyplot as plt +import numpy as np -def euler(f, n: int, h: float, x_0: float, y_0: float) -> tuple[list[float], list[float]]: +def euler_ex1(f, n: int, h: float, x_0: float, y_0: float) -> tuple[list[float], list[float]]: """ :param f: la fonction f (ou y) @@ -91,5 +92,48 @@ def exercice1() -> None: plt.show() +def euler(f, n: int, h: float, x_0: float, y_0: float) -> tuple[list[float], list[float]]: + """ + + :param f: la fonction f (ou y) + :param n: jusqu'où va le calcul (le nombre d'itérations) + :param h: le pas de chaque itération + :param x_0: dans la condition initiale, c'est la valeur passée en entrée de f + :param y_0: dans la condition initiale, c'est la valeur de sortie de f. + :return: + """ + results_x = [x_0] + results_y = [y_0] + # h c'est delta_x + x = x_0 + y = y_0 + for i in range(n): + y = y + h * x + x = x + h * f(x, y) + results_x.append((i + 1) * h) + results_y.append(y) + + return results_x, results_y + + +def exercice2() -> None: + g = 9.8 # c'est une constante. (intensité de la pesanteur) + dt = .01 # intervale de temps + c_1 = np.pi / 2 + c_2 = 0 + + f = lambda x, y: -x - g * np.sin(y) + + results_x, results_y = euler(f, n=int(15 / dt), h=dt, x_0=c_1, y_0=c_2) + plt.plot(results_x, results_y) + plt.xlabel('t') + plt.ylabel('teta') + plt.title('le mouvement du pendule') + plt.show() + + print(f'Solution pour t = 15 : {results_y[14]}') + + if __name__ == '__main__': - exercice1() + #exercice1() + exercice2()