Files
tp_ana_num/ex5.py
2025-10-19 19:03:43 +02:00

97 lines
1.9 KiB
Python

import matplotlib.pyplot as plt
import numpy as np
dich_steps = []
new_raph_steps = []
def f(x) -> float:
return np.exp(x) - 2 * np.cos(x)
def dichotomie(x_0, a, b, epsilon, n=0) -> float:
delta = f(a) * f(x_0)
x_1 = (a + b) / 2
dich_steps.append(x_1)
if np.abs(b - a) <= epsilon:
return x_1
if delta < 0:
return dichotomie(x_1, a, x_0, epsilon, n+1)
elif delta == 0:
return x_1
else:
return dichotomie(x_1, x_0, b, epsilon, n+1)
def f_prime(x) -> float:
return np.exp(x) + 2 * np.sin(x)
def newton_raphson(x_0, epsilon, max_iter=1_000) -> float | None:
"""
Condition : connaître la dérivée de f(x)
:param x_0:
:param epsilon:
:param max_iter:
:return:
"""
x = x_0
for _ in range(max_iter):
x_prev = x
fx = f(x)
fpx = f_prime(x)
if np.abs(fx) < epsilon:
return x
elif fpx == 0:
return None
x = x - (fx / fpx)
new_raph_steps.append(x)
if np.abs(x - x_prev) < epsilon:
return x
return None
def ex1() -> None:
x = np.arange(0, 1, 0.001)
f = [np.exp(i) - 2 * np.cos(i) for i in x]
f1 = [np.exp(i) for i in x]
f2 = [2 * np.cos(i) for i in x]
for i in range(len(x)):
if f1[i] == f2[i]:
print(f1[i])
plt.plot(x, f)
plt.plot(x, f1)
plt.plot(x, f2)
plt.grid()
plt.show()
dichotomie_res = dichotomie(0, 0, 1, 10e-6)
print(dichotomie_res)
plt.plot(dich_steps)
plt.title('Convergence de la dichotomie')
plt.show()
newton_raphson_res = newton_raphson(0.1, 10e-6)
print(newton_raphson_res)
plt.plot(new_raph_steps)
plt.title('Convergence de Newton-Raphson')
plt.show()
"""
La NR à moins d'étape que la dichotomie, NR à l'air rapide,
comme Flash McQueen (Kachow)
"""
if __name__ == '__main__':
ex1()