Skip to content
Snippets Groups Projects
Commit f7ba1330 authored by iliya.saroukha's avatar iliya.saroukha :first_quarter_moon:
Browse files

feat: working on ex2

parents
No related branches found
No related tags found
No related merge requests found
.venv/
*.pdf
import numpy as np
import math
from matplotlib import pyplot as plt
from scipy.interpolate import lagrange
#############################################################################
######################### Variables globales ################################
#############################################################################
Nmbre_derivees = 14
Nmbre_pts = 201
def Base_function(x): return np.sin(np.pi*np.cos(4*x*x))
Taylor_points = np.array([-0.8, 0.25, 0.8])
Borne_a = 1
Borne_b = 4
def sigma(a, b, x): return (b-a)/2*x + (b+a)/2
def amgis(a, b, x): return -1 + 2*(x-a)/(b-a)
#############################################################################
############ Fonctions necessaires a la production des donnees ##############
#############################################################################
def deltas2(lstx, lsty, depth=1):
N = len(lstx)
deltas_dic = {tuple([l]): y for l, y in enumerate(lsty)}
for k in range(1, min(depth, N)):
for l in range(N - k):
indices_now = tuple(range(l, k+l+1))
deltas_dic[indices_now] = (
deltas_dic[indices_now[1:]] - deltas_dic[indices_now[:-1]])/(lstx[k+l]-lstx[l])
return deltas_dic
def approx_der_lst(lstx, lsty, a, depth):
D = deltas2(lstx, lsty, depth=depth)
indices = [l for l, x in enumerate(lstx) if x >= a]
index = indices[0]
lst_return = []
l = 0
while (index - l >= 0) and (index + l < len(lstx)) and (l < depth):
der_temp = []
indices_now = range(index - l, index + 1)
for m in indices_now:
approx_der_temp = D[tuple(range(m, m+l+1))]*np.math.factorial(l)
der_temp.append(approx_der_temp)
approx_der = sum(der_temp)/(len(der_temp))
lst_return.append(approx_der)
l += 1
return lst_return
#############################################################################
##### Classe regroupant toutes les donnees pertinentes d'une fonction #######
#############################################################################
class Function_data:
def __init__(self, f=lambda x: x):
self.function = f
def approx_der_temp(pt, width=.1, number_points=Nmbre_derivees):
t = np.linspace(pt - width, pt + width, 2*number_points + 1)
return approx_der_lst(t, f(t), pt, number_points)
def max_der(a, b, width=.1, number_points=12, total_number=Nmbre_derivees):
ts = np.linspace(a, b, total_number)
max_ret = [0]*(number_points-1)
for p in ts:
der = approx_der_temp(p)
max_ret = [max(oldmax, abs(der[l]))
for l, oldmax in enumerate(max_ret)]
return max_ret
self.approx_derivatives = approx_der_temp
self.values = lambda t: f(t)
self.max_der = max_der
#############################################################################
######## Classe regroupant toutes les donnees fournies a l'etudiant #########
#############################################################################
class Student_data:
def __init__(self):
self.a, self.b = Borne_a, Borne_b
def f_ab(x): return Base_function(amgis(Borne_a, Borne_b, x))
F = Function_data(f_ab)
self.Maximal_derivatives_values = F.max_der(
Borne_a, Borne_b, number_points=Nmbre_derivees, total_number=Nmbre_pts)
self.Taylor_points = [sigma(Borne_a, Borne_b, p)
for p in Taylor_points]
self.Taylor_derivatives_values = {pt: F.approx_derivatives(
pt, number_points=Nmbre_derivees) for pt in self.Taylor_points}
self.f = f_ab
def compute_taylor_series(x, pt, derivs):
sum = 0
for nth_deg, nth_deriv in enumerate(derivs):
sum += (nth_deriv / math.factorial(nth_deg)) * (x - pt)**nth_deg
return sum
###########################################################################
#### Exemple d'utilisation de la classe, avec explication des donnees #####
###########################################################################
SD = Student_data()
print(f"bornes de l'intervalle considere: [{SD.a},{SD.b}]")
print()
print(f"Points ou on connait la derivee : {SD.Taylor_points}")
print(f"Valeurs des derivees 0 a {Nmbre_derivees-1}:")
for x in SD.Taylor_points:
print(f"x = {x}, dérivées: {SD.Taylor_derivatives_values[x]}")
print()
print(f"Valeurs maximales des derivees 0 a {
Nmbre_derivees-1} sur l'intervalle [{SD.a},{SD.b}]: {SD.Maximal_derivatives_values}")
print()
print("La fonction est dans la variable SD.f, si on doit l'évaluer en certains points")
print()
print(f"valeur de la fonction en x = {SD.Taylor_points} : {
[SD.f(x) for x in SD.Taylor_points]}")
print(f"valeur de la fonction en a et b: {SD.f(SD.a), SD.f(SD.b)}")
# Exemple de graphe de la fonction f.
# t = np.linspace(SD.a, SD.b, Nmbre_pts)
# y = compute_taylor_series(
# t, SD.Taylor_points[1], SD.Taylor_derivatives_values[SD.Taylor_points[1]])
# plt.plot(t, SD.f(t), "k")
# plt.show()
###########################################################################
#### Exercices #####
###########################################################################
def ex2():
t = np.linspace(SD.a, SD.b, Nmbre_pts)
y0 = compute_taylor_series(
t, SD.Taylor_points[0], SD.Taylor_derivatives_values[SD.Taylor_points[0]])
y1 = compute_taylor_series(
t, SD.Taylor_points[1], SD.Taylor_derivatives_values[SD.Taylor_points[1]])
y2 = compute_taylor_series(
t, SD.Taylor_points[2], SD.Taylor_derivatives_values[SD.Taylor_points[2]])
fig, axs = plt.subplots(2, 2, figsize=(18, 12))
axs[0, 0].plot(t, SD.f(t), color='black')
axs[0, 0].set_title('Fonction $f$ originale')
axs[0, 0].grid()
axs[0, 1].plot(t, SD.f(t), color='black', label='$f$')
axs[0, 1].plot(t, y0, color='orange', label='$T_{f}$')
axs[0, 1].set_title(
f'Développement de $T_f$ en $a = {SD.Taylor_points[0]}$')
axs[0, 1].set_ylim([-1.2, 1.2])
axs[0, 1].grid()
axs[0, 1].legend()
axs[1, 0].plot(t, SD.f(t), color='black', label='$f$')
axs[1, 0].plot(t, y1, color='blue', label='$T_{f}$')
axs[1, 0].set_title(
f'Développement de $T_f$ en $a = {SD.Taylor_points[1]}$')
axs[1, 0].set_ylim([-1.2, 1.2])
axs[1, 0].grid()
axs[1, 0].legend()
axs[1, 1].plot(t, SD.f(t), color='black', label='$f$')
axs[1, 1].plot(t, y2, color='violet', label='$T_{f}$')
axs[1, 1].set_title(
f'Développement de $T_f$ en $a = {SD.Taylor_points[2]}$')
axs[1, 1].set_ylim([-1.2, 1.2])
axs[1, 1].grid()
axs[1, 1].legend()
fig.tight_layout()
plt.show()
ex2()
# Graphique des polynômes de Taylor
# fig, axes = plt.subplots(1, 3)
# for i, pt in enumerate(SD.Taylor_points):
# ax = axes[i]
# t = np.linspace(SD.a, SD.b, Nmbre_pts)
# ax.plot(t, SD.f(t), label="Fonction f(x)")
# taylor_poly = np.poly1d(
# SD.Taylor_derivatives_values[SD.Taylor_points[i]][::-1])
# ax.plot(t, taylor_poly(t), label=f"Polynôme de Taylor en x={pt}")
# ax.legend()
# ax.set_title(f"Polynôme de Taylor en x={pt}")
# plt.show()
figs/ex2_taylor.png

157 KiB

---
title: |
Contrôle 4
subtitle: Mathématiques en technologies de l'information 4 -- ISC_421
author:
- Iliya Saroukhanian
lang: fr-CH
date: today
date-format: long
format:
pdf:
documentclass: scrreprt
papersize: a4
highlight-style: github
toc: true
lof: true
number-sections: true
colorlinks: true
---
# Graphe de divers polynômes de Taylor
![Graphiques de la fonction $f$ et de ses développements de Taylor en divers points](./figs/ex2_taylor.png)
# Exercice 2
# Exercice 3
# Exercice 4
# Conclusion
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment