Files
opti-non-lin/1-coordinate-descent.ipynb
2026-01-18 17:29:00 +01:00

176 lines
5.0 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "075806aa",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c9235b01",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A l'itété 0, on trouve x=[-0.2 -0.42]\n",
"A l'itété 1, on trouve x=[ 0.148 -0.2112]\n",
"A l'itété 2, on trouve x=[ 0.27328 -0.136032]\n",
"A l'itété 3, on trouve x=[ 0.3183808 -0.10897152]\n",
"A l'itété 4, on trouve x=[ 0.33461709 -0.09922975]\n",
"A l'itété 5, on trouve x=[ 0.34046215 -0.09572271]\n",
"A l'itété 6, on trouve x=[ 0.34256637 -0.09446018]\n",
"A l'itété 7, on trouve x=[ 0.34332389 -0.09400566]\n",
"A l'itété 8, on trouve x=[ 0.3435966 -0.09384204]\n",
"A l'itété 9, on trouve x=[ 0.34369478 -0.09378313]\n"
]
}
],
"source": [
"# Un premier exemple de descente par coordonnées\n",
"\n",
"# Itéré intial\n",
"x = np.array([-1/2, -1])\n",
"\n",
"maxiter = 10\n",
"for k in range(maxiter):\n",
" #On mets (de façon optimale) x1\n",
" x[0] = (6*x[1]+4)/10\n",
" #On mets (de façon optimale) x2\n",
" x[1] = (6*x[0]-3)/10\n",
" print(f\"A l'itété {k}, on trouve x={x}\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "999a5a80",
"metadata": {},
"outputs": [],
"source": [
"def CDquadratic(Q,c,p,x,maxiter=10**2):\n",
" # Ce code applique la méthode de descente par coordonnées\n",
" # au problème min_x 0.5 x'*Q*x-c'*x+p\n",
" # Le x fournit en paramètre est l'itéré initial\n",
" # Q nous est donnée sous forme symétrique\n",
" n = len(x)\n",
" # Une itération coûte O(n^2)\n",
" for k in range(maxiter):\n",
" # Dans cette boucle, on mets les variables à jour\n",
" for i in range(n):\n",
" somme = 0\n",
" for j in range(n):\n",
" if not j==i:\n",
" somme += Q[i,j]*x[j]\n",
" x[i] = (c[i]-somme)/Q[i,i]\n",
" print(f\"A l'itété {k}, on trouve x={x}\")\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d7a850ff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A l'itété 0, on trouve x=[-0.2 -0.42]\n",
"A l'itété 1, on trouve x=[ 0.148 -0.2112]\n",
"A l'itété 2, on trouve x=[ 0.27328 -0.136032]\n",
"A l'itété 3, on trouve x=[ 0.3183808 -0.10897152]\n",
"A l'itété 4, on trouve x=[ 0.33461709 -0.09922975]\n",
"A l'itété 5, on trouve x=[ 0.34046215 -0.09572271]\n",
"A l'itété 6, on trouve x=[ 0.34256637 -0.09446018]\n",
"A l'itété 7, on trouve x=[ 0.34332389 -0.09400566]\n",
"A l'itété 8, on trouve x=[ 0.3435966 -0.09384204]\n",
"A l'itété 9, on trouve x=[ 0.34369478 -0.09378313]\n"
]
}
],
"source": [
"Q = np.array([[10, -6],[-6, 10]])\n",
"c = np.array([4, -3])\n",
"p = 0\n",
"x = np.array([-1/2, -1])\n",
"xopt = CDquadratic(Q,c,p,x,10)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "960500d8",
"metadata": {},
"outputs": [],
"source": [
"def leastsquares(A,b,x,maxiter=10**2):\n",
" Q = 2*A.T@A\n",
" c = 2*A.T@b\n",
" p = b.T@b\n",
" x = CDquadratic(Q,c,p,x,maxiter)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "560043ef",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"A l'itété 0, on trouve x=[ 0. -0.5]\n",
"A l'itété 1, on trouve x=[ 0.25 -0.625]\n",
"A l'itété 2, on trouve x=[ 0.3125 -0.65625]\n",
"A l'itété 3, on trouve x=[ 0.328125 -0.6640625]\n",
"A l'itété 4, on trouve x=[ 0.33203125 -0.66601562]\n",
"A l'itété 5, on trouve x=[ 0.33300781 -0.66650391]\n",
"A l'itété 6, on trouve x=[ 0.33325195 -0.66662598]\n",
"A l'itété 7, on trouve x=[ 0.33331299 -0.66665649]\n",
"A l'itété 8, on trouve x=[ 0.33332825 -0.66666412]\n",
"A l'itété 9, on trouve x=[ 0.33333206 -0.66666603]\n"
]
}
],
"source": [
"A = np.array([[1,0], [0,1], [1,1]])\n",
"b = np.array([3,2,-3])\n",
"x = np.array([1.0, 0.0]) # Attention au entiers\n",
"xopt = leastsquares(A,b,x,10)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "optinonlin",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}