à jour
This commit is contained in:
parent
65f1eb78d9
commit
d0ec6464cc
@ -253,4 +253,15 @@ def main(argv):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
||||
# main(sys.argv[1:])
|
||||
m = np.array(
|
||||
[
|
||||
[2, 3],
|
||||
[3, 2]
|
||||
]
|
||||
)
|
||||
u1, u2, l1, l2 = diagonaliser_matrice22(m)
|
||||
u1 /= np.linalg.norm(u1)
|
||||
u2 /= np.linalg.norm(u2)
|
||||
print(u1, u2)
|
||||
print(l1, l2)
|
114
4/tp4_Voisin.py
Normal file
114
4/tp4_Voisin.py
Normal file
@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
auteur: Dylan Voisin - M1 Informatique Luminy
|
||||
MNI: TP 4
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
from numpy.polynomial import polynomial as P
|
||||
from copy import deepcopy as dp
|
||||
from math import isclose
|
||||
|
||||
def vect_propre(A, µ=1, nb_iter=15):
|
||||
I = np.identity(A.shape[0])
|
||||
v = np.ones(A.shape[0])
|
||||
inv = np.linalg.inv(A - µ*I)
|
||||
for i in range(nb_iter):
|
||||
v = inv @ v / np.linalg.norm(inv@v)
|
||||
return v
|
||||
|
||||
def vect_propre2(A, eps = 0.1):
|
||||
v = np.random.random(A.shape[0])
|
||||
v /= np.linalg.norm(v)
|
||||
lambda_ = v.transpose() @ A @ v
|
||||
eps = 1e-13
|
||||
écart = float('inf')
|
||||
while écart > eps:
|
||||
w = lambda_ * A @ v
|
||||
v = w / np.linalg.norm(w)
|
||||
old = lambda_
|
||||
lambda_ = (v.transpose() @ A @ v) / (v.transpose() @ v)
|
||||
écart = abs(old - lambda_)
|
||||
return v
|
||||
|
||||
def vect_propre_généralisé(A, eps = 1-9):
|
||||
A_ = A @ A.transpose()
|
||||
v = vect_propre2(A_, eps)
|
||||
v = (v.transpose() @ A @ v) / (v.transpose() * v)
|
||||
return v
|
||||
|
||||
def eval_poly(p, x):
|
||||
"""un polynome sera représenté par une liste pleine de ses coefficients
|
||||
f = a_0 + a_1 * x ** 1 + … + a_n * x ** b_n
|
||||
[a_0, a_1, a_2, …, a_n]
|
||||
"""
|
||||
return sum(p[i] * x ** i for i in range(len(p)))
|
||||
|
||||
def dichotomie(size, step):
|
||||
l = [0, size]
|
||||
lc = dp(l)
|
||||
for i in range(step):
|
||||
for j in range(len(l)-1):
|
||||
m = (l[j+1] + l[j]) / 2
|
||||
lc.insert(2*(j+1)-1, m)
|
||||
yield m
|
||||
l = dp(lc)
|
||||
|
||||
def newton(p, epsilon_f = 1e-13, epsilon_c = 1e-9):
|
||||
"""peut faire une boucle infinie à cause de l'imprécision
|
||||
à régler avec les paramètres epsilon, mais l'imprécision va
|
||||
se répercuter sur les valeurs des racines"""
|
||||
x = np.random.random() * 100
|
||||
pp = np.polyder(p[::-1])[::-1]
|
||||
roots = []
|
||||
while True:
|
||||
# toujours de l'imprécision à gérer
|
||||
if abs(eval_poly(p, x)) < epsilon_f:
|
||||
roots.append(x)
|
||||
p = P.polydiv(p, (-x, 1))[0]
|
||||
# on purge l'imprécision
|
||||
p = list(map(lambda x: x if abs(x) > epsilon_c else 0, p))
|
||||
pp = np.polyder(p[::-1])[::-1]
|
||||
if len(p) == 1:
|
||||
return roots # f = c
|
||||
fpx = eval_poly(pp, x)
|
||||
if fpx == 0:
|
||||
print(x)
|
||||
# extremum (local ou non)
|
||||
old = x
|
||||
step = 5
|
||||
maxrange = 1000
|
||||
eps = 1*10**(-8)
|
||||
sg = np.sign(eval_poly(pp, x-eps))
|
||||
sd = np.sign(eval_poly(pp, x+eps))
|
||||
for diff in dichotomie(maxrange, step):
|
||||
if np.sign(eval_poly(pp, x-diff)) != sg:
|
||||
x = x - diff
|
||||
break
|
||||
elif np.sign(eval_poly(pp, x+diff)) != sd:
|
||||
x = x + diff
|
||||
break
|
||||
if x == old:
|
||||
return roots # on considère qu'on a toutes les racines
|
||||
x -= eval_poly(p, x) / eval_poly(pp, x)
|
||||
return roots
|
||||
|
||||
if __name__ == '__main__':
|
||||
m = np.array(
|
||||
[
|
||||
[2, 3],
|
||||
[3, 2]
|
||||
]
|
||||
)
|
||||
v = vect_propre(m)
|
||||
v /= np.linalg.norm(v)
|
||||
print(v)
|
||||
v = vect_propre2(m)
|
||||
print(v)
|
||||
v = vect_propre_généralisé(m)
|
||||
v /= np.linalg.norm(v)
|
||||
print(v)
|
||||
# p = (0, 1, -2) # -2x²+x
|
||||
p = (30, -19, -15, 3, 1) # (x+5)(x-3)(x-1)(x+2)
|
||||
print(newton(p))
|
Reference in New Issue
Block a user