Metodo del gradiente biconiugato
In matematica , più specificamente nell'analisi numerica , il metodo del gradiente biconiugato è un algoritmo per la risoluzione di un sistema di equazioni lineari
AX=b.{\ displaystyle Ax = b. \,}![{\ displaystyle Ax = b. \,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/83f1eec82741fe1371d5b10a1d8eb2360367c396)
A differenza del metodo del gradiente coniugato , questo algoritmo non richiede che la matrice sia autoaggiunta, d'altra parte, il metodo richiede moltiplicazioni per la matrice adiacente .
A{\ displaystyle A}
A∗{\ displaystyle A ^ {*}}![A ^ {*}](https://wikimedia.org/api/rest_v1/media/math/render/svg/44e23745a51c2c2d8d91fd98c1cf721573747ece)
Algoritmo
- Scegli , un precondizionatore regolare (spesso usato ) e ;X0{\ displaystyle x_ {0}}
y0{\ displaystyle y_ {0}}
M{\ displaystyle M}
M-1=1{\ displaystyle M ^ {- 1} = 1}
vs{\ displaystyle c}![vs](https://wikimedia.org/api/rest_v1/media/math/render/svg/86a67b81c2de995bd608d5b2df50cd8cd7d92455)
-
r0←b-AX0,S0←vs-A∗y0{\ displaystyle r_ {0} \ leftarrow b-Ax_ {0}, s_ {0} \ leftarrow cA ^ {*} y_ {0} \,}
;
-
d0←M-1r0,f0←M-∗S0{\ displaystyle d_ {0} \ leftarrow M ^ {- 1} r_ {0}, f_ {0} \ leftarrow M ^ {- *} s_ {0} \,}
;
- per fareK=0,1,...{\ displaystyle k = 0,1, \ dots \,}
![{\ displaystyle k = 0,1, \ dots \,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/474a0f6e87e1e5a04eac5e205ce9018ce7642e89)
-
αK←SK∗M-1rKfK∗AdK{\ displaystyle \ alpha _ {k} \ leftarrow {s_ {k} ^ {*} M ^ {- 1} r_ {k} \ over f_ {k} ^ {*} Ad_ {k}} \,}
;
-
XK+1←XK+αKdK{\ Displaystyle x_ {k + 1} \ leftarrow x_ {k} + \ alpha _ {k} d_ {k} \,}
(yK+1←yK+αK¯fK){\ Displaystyle \ left (y_ {k + 1} \ leftarrow y_ {k} + {\ overline {\ alpha _ {k}}} f_ {k} \ right) \,}
;
-
rK+1←rK-αKAdK{\ displaystyle r_ {k + 1} \ leftarrow r_ {k} - \ alpha _ {k} Ad_ {k} \,}
, ( e sono i residui);SK+1←SK-αK¯A∗fK{\ displaystyle s_ {k + 1} \ leftarrow s_ {k} - {\ overline {\ alpha _ {k}}} LA ^ {*} f_ {k} \,}
rK=b-AXK{\ displaystyle r_ {k} = b-Ax_ {k}}
SK=vs-A∗yK{\ displaystyle s_ {k} = cA ^ {*} y_ {k}}![{\ displaystyle s_ {k} = cA ^ {*} y_ {k}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/cc2a53d5ece0ea2ba8e1eb4b7bf8a586223f2303)
-
βK←SK+1∗M-1rK+1SK∗M-1rK{\ displaystyle \ beta _ {k} \ leftarrow {s_ {k + 1} ^ {*} M ^ {- 1} r_ {k + 1} \ over s_ {k} ^ {*} M ^ {- 1} r_ {k}} \,}
;
-
dK+1←M-1rK+1+βKdK{\ displaystyle d_ {k + 1} \ leftarrow M ^ {- 1} r_ {k + 1} + \ beta _ {k} d_ {k} \,}
, .fK+1←M-∗SK+1+βK¯fK{\ displaystyle f_ {k + 1} \ leftarrow M ^ {- *} s_ {k + 1} + {\ overline {\ beta _ {k}}} f_ {k} \,}![{\ displaystyle f_ {k + 1} \ leftarrow M ^ {- *} s_ {k + 1} + {\ overline {\ beta _ {k}}} f_ {k} \,}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ffdce4ce09ae2af1ba98e9833ebe3fd905ce63bb)
Discussione
Il metodo è numericamente instabile , ma viene risolto con il metodo stabilizzato del gradiente biconiugato (en) , e rimane molto importante da un punto di vista teorico: definiamo l'iterazione con e ( ) utilizzando le seguenti proiezioni :
XK: =Xj+PKA-1(b-AXj){\ displaystyle x_ {k}: = x_ {j} + P_ {k} A ^ {- 1} \ left (b-Ax_ {j} \ right)}
yK: =yj+A-∗PK∗(vs-A∗yj){\ displaystyle y_ {k}: = y_ {j} + A ^ {- *} P_ {k} ^ {*} \ left (cA ^ {*} y_ {j} \ right)}
j<K{\ displaystyle j <k}![j <k](https://wikimedia.org/api/rest_v1/media/math/render/svg/4bad1af0d1a37fef58095a8f4d0c21a5fa00cb73)
PK: =uK(vK∗AuK)-1vK∗A{\ Displaystyle P_ {k}: = \ mathbf {u_ {k}} \ left (\ mathbf {v_ {k}} ^ {*} A \ mathbf {u_ {k}} \ right) ^ {- 1} \ mathbf {v_ {k}} ^ {*} A}![{\ Displaystyle P_ {k}: = \ mathbf {u_ {k}} \ left (\ mathbf {v_ {k}} ^ {*} A \ mathbf {u_ {k}} \ right) ^ {- 1} \ mathbf {v_ {k}} ^ {*} A}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3fcbd2c63e78cf8d8b70113347dd9fcd20b10c2d)
,
Con e . Possiamo iterare le proiezioni stesse, come
uK=(u0,u1,...uK-1){\ Displaystyle \ mathbf {u_ {k}} = \ left (u_ {0}, u_ {1}, \ dots u_ {k-1} \ right)}
vK=(v0,v1,...vK-1){\ displaystyle \ mathbf {v_ {k}} = \ left (v_ {0}, v_ {1}, \ dots v_ {k-1} \ right)}![{\ displaystyle \ mathbf {v_ {k}} = \ left (v_ {0}, v_ {1}, \ dots v_ {k-1} \ right)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/da70e6513ffafebb2a04e7da04f4df7d53b4f08b)
PK+1=PK+(1-PK)uK⊗vK∗A(1-PK)vK∗A(1-PK)uK{\ displaystyle P_ {k + 1} = P_ {k} + \ left (1-P_ {k} \ right) u_ {k} \ otimes {v_ {k} ^ {*} A \ left (1-P_ { k} \ right) \ over v_ {k} ^ {*} A \ left (1-P_ {k} \ right) u_ {k}}}![{\ displaystyle P_ {k + 1} = P_ {k} + \ left (1-P_ {k} \ right) u_ {k} \ otimes {v_ {k} ^ {*} A \ left (1-P_ { k} \ right) \ over v_ {k} ^ {*} A \ left (1-P_ {k} \ right) u_ {k}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d40a99aa4184c1af021ea9315c27e6855dd5ecab)
.
Le nuove direzioni di discesa e sono quindi ortogonali ai residui: e , che soddisfano la stessa e ( ).
dK: =(1-PK)uK{\ displaystyle d_ {k}: = \ left (1-P_ {k} \ right) u_ {k}}
fK: =(A(1-PK)A-1)∗vK{\ Displaystyle f_ {k}: = \ left (A \ left (1-P_ {k} \ right) A ^ {- 1} \ right) ^ {*} v_ {k}}
vio∗rK=fio∗rK=0{\ displaystyle v_ {i} ^ {*} r_ {k} = f_ {i} ^ {*} r_ {k} = 0}
SK∗uj=SK∗dj=0{\ displaystyle s_ {k} ^ {*} u_ {j} = s_ {k} ^ {*} d_ {j} = 0}
rK=A(1-PK)A-1rj{\ displaystyle r_ {k} = LA \ sinistra (1-P_ {k} \ destra) LA ^ {- 1} r_ {j}}
SK=(1-PK)∗Sj{\ displaystyle s_ {k} = \ sinistra (1-P_ {k} \ destra) ^ {*} s_ {j}}
io,j<K{\ displaystyle i, j <k}![{\ displaystyle i, j <k}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4c1cd56b322c87b27e757ddc777dcc467df5663b)
Il metodo del gradiente biconiugato offre quindi la seguente scelta:
uK: =M-1rK{\ displaystyle u_ {k}: = M ^ {- 1} r_ {k}}![{\ displaystyle u_ {k}: = M ^ {- 1} r_ {k}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a8d3f655c91703e15916fa440b0026286522d3ae)
e .
vK: =M-∗SK{\ displaystyle v_ {k}: = M ^ {- *} s_ {k}}![{\ displaystyle v_ {k}: = M ^ {- *} s_ {k}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e5042f2ff61648cd8a8dcd40dd7214743ef07497)
Questa particolare scelta permette poi di evitare una valutazione diretta di e , e quindi di aumentare la velocità di esecuzione dell'algoritmo.
PK{\ displaystyle P_ {k}}
A-1{\ displaystyle A ^ {- 1}}![A ^ {{- 1}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/83ba3a7118652cffd5de466dc439ee9184371d50)
Proprietà
- Se è autoaggiunto , e , quindi , e il metodo del gradiente coniugato produce lo stesso risultato .A=A∗{\ displaystyle A = A ^ {*}}
y0=X0{\ displaystyle y_ {0} = x_ {0}}
vs=b{\ displaystyle c = b}
rK=SK{\ displaystyle r_ {k} = s_ {k}}
dK=fK{\ displaystyle d_ {k} = f_ {k}}
XK=yK{\ displaystyle x_ {k} = y_ {k}}![{\ displaystyle x_ {k} = y_ {k}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/dfee44f1364a497f266d599dd1a1af9d5ceede10)
- In dimensioni finite , al più tardi quando : Il metodo del gradiente biconiugato fornisce la soluzione esatta dopo aver coperto tutto lo spazio ed è quindi un metodo diretto.Xnon=A-1b{\ displaystyle x_ {n} = A ^ {- 1} b}
Pnon=1{\ displaystyle P_ {n} = 1}![{\ displaystyle P_ {n} = 1}](https://wikimedia.org/api/rest_v1/media/math/render/svg/80094e69fc2a7f012376998e6d35bdb2dd557729)
- La sequenza prodotta dall'algoritmo è biortogonale (in) : e per .fio∗Adj=0{\ displaystyle f_ {i} ^ {*} Ad_ {j} = 0}
Sio∗M-1rj=0{\ displaystyle s_ {i} ^ {*} M ^ {- 1} r_ {j} = 0}
io≠j{\ displaystyle i \ neq j}![{\ displaystyle i \ neq j}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d95aeb406bb427ac96806bc00c30c91d31b858be)
- IF è un polinomio con , allora . L'algoritmo è quindi composto da proiezioni su sottospazi di Krylov (en) ;pj′{\ displaystyle p_ {j '}}
deg(pj′)+j<K{\ Displaystyle deg \ left (p_ {j '} \ right) + j <k}
SK∗pj′(M-1A)uj=0{\ displaystyle s_ {k} ^ {*} p_ {j '} \ sinistra (M ^ {- 1} A \ destra) u_ {j} = 0}
- IF è un polinomio con , allora .pio′{\ displaystyle p_ {i '}}
io+deg(pio′)<K{\ Displaystyle i + deg \ left (p_ {i '} \ right) <k}
vio∗pio′(AM-1)rK=0{\ displaystyle v_ {i} ^ {*} p_ {i '} \ left (AM ^ {- 1} \ right) r_ {k} = 0}![{\ displaystyle v_ {i} ^ {*} p_ {i '} \ left (AM ^ {- 1} \ right) r_ {k} = 0}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba6da354de8edafcbd657af71808787eb22de624)
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">