80 lines
1.6 KiB
Python
80 lines
1.6 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 1 + np.sin(x)
|
|
|
|
|
|
def newton_raphson(x_0, epsilon) -> float:
|
|
x_1 = x_0 - (f(x_0) / f_prime(x_0))
|
|
new_raph_steps.append(x_1)
|
|
|
|
if np.abs(x_1 - x_0) < epsilon:
|
|
return x_1
|
|
elif np.abs(f(x_0)) < epsilon:
|
|
return x_1
|
|
return newton_raphson(x_1, epsilon)
|
|
|
|
|
|
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 dichotomie à moins d'étape que NR, mais NR à l'air plus rapide,
|
|
comme Flash McQueen
|
|
"""
|
|
|
|
|
|
if __name__ == '__main__':
|
|
ex1() |