5.0 KiB
5.0 KiB
In [1]:
import numpy as np
In [2]:
# Un premier exemple de descente par coordonnées
# Itéré intial
x = np.array([-1/2, -1])
maxiter = 10
for k in range(maxiter):
#On mets (de façon optimale) x1
x[0] = (6*x[1]+4)/10
#On mets (de façon optimale) x2
x[1] = (6*x[0]-3)/10
print(f"A l'itété {k}, on trouve x={x}")
In [3]:
def CDquadratic(Q,c,p,x,maxiter=10**2):
# Ce code applique la méthode de descente par coordonnées
# au problème min_x 0.5 x'*Q*x-c'*x+p
# Le x fournit en paramètre est l'itéré initial
# Q nous est donnée sous forme symétrique
n = len(x)
# Une itération coûte O(n^2)
for k in range(maxiter):
# Dans cette boucle, on mets les variables à jour
for i in range(n):
somme = 0
for j in range(n):
if not j==i:
somme += Q[i,j]*x[j]
x[i] = (c[i]-somme)/Q[i,i]
print(f"A l'itété {k}, on trouve x={x}")
return x
In [4]:
Q = np.array([[10, -6],[-6, 10]])
c = np.array([4, -3])
p = 0
x = np.array([-1/2, -1])
xopt = CDquadratic(Q,c,p,x,10)
In [5]:
def leastsquares(A,b,x,maxiter=10**2):
Q = 2*A.T@A
c = 2*A.T@b
p = b.T@b
x = CDquadratic(Q,c,p,x,maxiter)
return x
In [6]:
A = np.array([[1,0], [0,1], [1,1]])
b = np.array([3,2,-3])
x = np.array([1.0, 0.0]) # Attention au entiers
xopt = leastsquares(A,b,x,10)