diff --git a/Dual_Numbers.py b/Dual_Numbers.py index fca7aad801d7e29266a52a0ec1fa0086fe010ebf..14aa972e5abb203f210807b49387a98ee6ec32d3 100644 --- a/Dual_Numbers.py +++ b/Dual_Numbers.py @@ -187,11 +187,22 @@ def test(): print(f"(a / b) * c = {a / b * c}") +def ex3(): + u = Dual_Number(-2, 9) + v = Dual_Number(-22, 8) + w = Dual_Number(3, -1) + x = Dual_Number(9, -2) + y = Dual_Number(-8, 10) + + print(f"v * ((u + w) / (x + y)) = {v * ((u + w) / (x + y))}") + + if __name__ == "__main__": - test() + # test() # Exercice1_a() # Exercice1_b() # Exercice1_c() # Exercice1_d() # Test_exp_sin() # sigmoid_exo() + ex3() diff --git a/derive_and_min-max.py b/derive_and_min-max.py index 42cb8803d33112448fbdec31c89e0b10b54c16dd..93479b36d62a403d5e11b7a39acb8bccc450ffc5 100644 --- a/derive_and_min-max.py +++ b/derive_and_min-max.py @@ -29,12 +29,13 @@ import numpy as np # return g(Dual_Number(x, 1)) +# g(x) = x*x*exp( ln( x*x*x*x + 2 ) * sin(x) + 1 ) def g(x: Dual_Number) -> float: - return (Dual_Number.exp((-1) * (x * x) / 7 + x + Dual_Number.sin(1.5 * x)) * Dual_Number.log(x * x + 2) - 7).d + return (x * x * Dual_Number.exp(Dual_Number.log(x * x * x * x + 2) * Dual_Number.sin(x) + 1)).d def h(x: Dual_Number) -> float: - return g(2 * x - 1) + return g(2 * x - 0) # def dgdx(x: float) -> float: @@ -58,8 +59,8 @@ if __name__ == "__main__": # start = -5 # stop = 9 - start = 1.3 - stop = 2.2 + start = -1 + stop = -0.8 # start = 3.5 # stop = 5.5 diff --git a/rf_methods.py b/rf_methods.py index a6e5385c8c12ba5f48ecd857a9bb53b5e4d92057..4e8dabae7944561e2747f095b41c26f2fa606898 100644 --- a/rf_methods.py +++ b/rf_methods.py @@ -1,21 +1,22 @@ import numpy as np from typing import Callable +from Dual_Numbers import Dual_Number # def f(x: float) -> float: # return x ** 4 + x ** 3 + x ** 2 - 1 -def g(x: float) -> float: - return x ** 2 - x - 1 - - -def h(x: float) -> float: - return x ** 2 - 25 - - -def z(x: float) -> float: - return x ** 3 - x ** 2 - 1 +# def g(x: float) -> float: +# return x ** 2 - x - 1 +# +# +# def h(x: float) -> float: +# return x ** 2 - 25 +# +# +# def z(x: float) -> float: +# return x ** 3 - x ** 2 - 1 def rec_regula_falsi(start: float, stop: float, func: Callable[[float], float], @@ -109,7 +110,6 @@ def iter_bisection(init_start: float, init_stop: float, func: def iter_newton_raphson(init_guess: float, f: Callable[[float], float], dfdx: Callable[[float], float], debug: bool) -> float: - prev = init_guess curr = init_guess @@ -118,6 +118,7 @@ def iter_newton_raphson(init_guess: float, f: Callable[[float], float], while np.abs(f(curr)) > 1e-9: if debug: print(f"Iter = {iter}\tx = {curr}\tf(x) = {f(curr)}") + curr = prev - f(prev) / dfdx(prev) prev = curr iter += 1 @@ -125,6 +126,23 @@ def iter_newton_raphson(init_guess: float, f: Callable[[float], float], return curr +def iter_secant(x0: float, x1: float, f: Callable[[float], float], + debug: bool) -> float: + iter = 0 + + while np.abs(f(x1)) > 1e-9 or np.abs(x1 - x0) > 1e-9: + if debug: + print(f"Iter = {iter}\tx = {x1}\tf(x) = {f(x1)}") + + x_tmp = x1 - (x1 - x0) / f(x1) - f(x0) * f(x1) + x0 = x1 + x1 = x_tmp + # curr = prev - (f(prev) - f(curr) / (prev - curr)) * f(prev) + iter += 1 + + return x1 + + if __name__ == "__main__": # print(f"Bissection = {bissect_method(0.5, 2, g)}") # print(f"Regula falsi = {regula_falsi(-3, 7, h)}") @@ -135,10 +153,14 @@ if __name__ == "__main__": # print(f"Iter regula falsi= {iter_regula_falsi(0.5, 2, g, False)}") # print(f"Rec regula falsi = {rec_regula_falsi(0.5, 2, g, False)}") - def f(x): - return x ** 3 - 2 * x ** 2 + 1 + def f(x: float) -> float: + return x ** 2 - 25 + + def f_Dual(x: Dual_Number) -> float: + return (x * x - 25).d - def fprime(x): - return 3 * x ** 2 - 4 * x + 1 + def dfdx(x: float) -> float: + return f_Dual(Dual_Number(x, 1)) - print(f"Newton = {iter_newton_raphson(0, f, fprime, True)}") + print(f"Newton = {iter_newton_raphson(1, f, dfdx, True)}") + print(f"Secant = {iter_secant(4.4, 5.3, f, True)}") diff --git a/serie_taylor/revision_part_b.py b/serie_taylor/revision_part_b.py index cd4123a924ce6c76b4ab43705835569ba11da150..699fe530f446814a0c6311deae264b27d3f64485 100644 --- a/serie_taylor/revision_part_b.py +++ b/serie_taylor/revision_part_b.py @@ -2,55 +2,67 @@ import numpy as np import math import matplotlib.pyplot as plt from rf_methods import iter_bisection, iter_regula_falsi +from Dual_Numbers import Dual_Number def f(x: float) -> float: - return np.sin(x) + np.exp(-x) / 10 + # return np.sin(x) + np.exp(-x) / 10 + return np.sinh(x) - np.cos(x) def f1(x: float) -> float: - return np.cos(x) - np.exp(-x) / 10 + # return np.cos(x) - np.exp(-x) / 10 + return np.cosh(x) + np.sin(x) def f2(x: float) -> float: - return -np.sin(x) + np.exp(-x) / 10 + # return -np.sin(x) + np.exp(-x) / 10 + return np.sinh(x) + np.cos(x) def f3(x: float) -> float: - return -np.cos(x) - np.exp(-x) / 10 + # return -np.cos(x) - np.exp(-x) / 10 + return np.cosh(x) - np.sin(x) def f4(x: float) -> float: - return np.sin(x) + np.exp(-x) / 10 + # return np.sin(x) + np.exp(-x) / 10 + return np.sinh(x) - np.cos(x) def f5(x: float) -> float: - return np.cos(x) + np.exp(-x) / 10 + # return np.cos(x) + np.exp(-x) / 10 + return np.cosh(x) + np.sin(x) + + +def f6(x: float) -> float: + # return np.cos(x) + np.exp(-x) / 10 + return np.sinh(x) + np.cos(x) def T(x: float, a: float) -> float: - return (f(a) / math.factorial(0) * pow(x - a, 0)) + (f1(a) / math.factorial(1) * pow(x - a, 1)) + (f2(a) / math.factorial(2) * pow(x - a, 2)) + (f3(a) / math.factorial(3) * pow(x - a, 3)) + (f4(a) / math.factorial(4) * pow(x - a, 4)) + (f5(a) / math.factorial(5) * pow(x - a, 5)) + return (f(a) / math.factorial(0) * pow(x - a, 0)) + (f1(a) / math.factorial(1) * pow(x - a, 1)) + (f2(a) / math.factorial(2) * pow(x - a, 2)) + (f3(a) / math.factorial(3) * pow(x - a, 3)) + (f4(a) / math.factorial(4) * pow(x - a, 4)) + (f5(a) / math.factorial(5) * pow(x - a, 5)) + (f6(a) / math.factorial(6) * pow(x - a, 6)) if __name__ == "__main__": - x_eval_point = 2 - start = -5 - stop = 9 + x_eval_point = 1 + start = -3 + stop = 3 x_axis = np.arange(start, stop, 0.01) y_eval_point = f(x_eval_point) - print(f"Zéros de la fonction f = {iter_bisection(-4, -2, f, True)}") + print(f"Zéros de la fonction f = {iter_bisection(start, stop, f, True)}") plt.figure(figsize=(8, 6)) plt.xlim(start, stop) plt.ylim(-5, 5) - plt.plot(x_axis, f(x_axis), label='f(x) = sin(x) + exp(-x) / 10') + plt.plot(x_axis, f(x_axis), label='g(t) = sinh(t) - cos(t)') plt.plot(x_axis, T(x_axis, x_eval_point), - label='Polynôme de Taylor de degré 5') + label='Polynôme de Taylor de degré 6') plt.plot(x_eval_point, y_eval_point, marker="o", markerfacecolor="purple") plt.legend() plt.xlabel('x') plt.ylabel('y') - plt.title('Polynôme de Taylor de degré 5 pour f(x)') + plt.title('Polynôme de Taylor de degré 6 pour g(t)') plt.grid(True) plt.show() diff --git a/serie_taylor/rf_methods.py b/serie_taylor/rf_methods.py index e2409e4131a48e98c181b4620bd20feafa6a0fa0..bd4933182fdfaf7ba279f645bc169df0a37e0909 100644 --- a/serie_taylor/rf_methods.py +++ b/serie_taylor/rf_methods.py @@ -91,7 +91,7 @@ def iter_bisection(init_start: float, init_stop: float, func: iter = 0 - while np.abs(stop - start) > 1e-5: + while np.abs(stop - start) > 1e-8: if debug: print(f"Iter = {iter}\tx = {cN}\tf(x) = {func(cN)}")