Algoritmul GPPS#
Am "reparat" algoritmul G trecând la algoritmul GPP, adică introducând pivotarea între linii în prealabil. Mergem un pas mai departe și evoluăm algoritmul GPP folosindu-ne de scalare.
Categorii de GPPS#
Diferența principală dintre GPP și GPPS este dată de crearea unui vector adițional, \(\bm{s}=\begin{bmatrix}s_1&\dots&s_n\end{bmatrix}\in\mathbb{R}^n\), denumit vector de scalare (sau factor de scalare). Acest vector se calculează o singură dată, la începutul rulării algoritmului GPPS.
Există multiple modalități de a defini acest vector, dat fiind un sistem de ecuații liniare descris prin matricea extinsă \(\overline{A}\in\mathbb{R}^{n\times(n+1)}\), însă cele mai comune sunt:
-
În funcție de modulul maxim de pe linia \(i\in\overline{1,n}\), începând cu a \(i\)-a coloană:
\[ \boxed{s_i=\max_{j\in\overline{i,n}}\Big\{\left|\overline{a}_{i,j}\right|\Big\}}\,,\,\,\forall i\in\overline{1,n} \]GPP vs GPPSMare atenție însă - spre deosebire de valoarea folosită de GPP, se caută valoarea de modul maxim de pe linie, NU de pe coloană; confuzia aceasta poate da peste cap întregul algoritm.
-
În funcție de suma modulelor de pe linia \(i\in\overline{1,n}\), adică:
\[ s_i=\sum_{j=i}^n\left|\overline{a}_{i,j}\right|,\,\forall i\in\overline{1,n} \]
În explicațiile ce urmează, voi presupune că \(s_i\) se calculează în baza modulului maxim, \(\forall i\in\overline{1,n}\). Vectorul \(\bm{s}\) va fi utilizat în algoritm atunci când se decide care linii trebuie interschimbate. Informații suplimentare vor apărea în paragrafele de mai jos.
Presupunându-se cunoscut vectorul \(\bm{s}\in\mathbb{R}^n\), dacă oricare dintre valorile \(s_i\) este nulă (\(\exists i\in\overline{1,n}\) a.î. \(s_i=0\)), atunci matricea \(A\in\mathbb{R}^{n\times n}\) este singulară, așadar nu poate fi calculată nicio soluție validă pentru \(\bm{x}\in\mathbb{R}^n\).
Explicație algoritmică#
Să vedem acum modul în care ne ajută de fapt vectorul \(\bm{s}\).
Fie \(A\bm{x}=\bm{b}\) un sistem de ecuații liniare, unde \(A\in\mathbb{R}^{n\times n}\) este o matrice pătratică și \(\bm{x},\bm{b}\in\mathbb{R}^n\) sunt vectori coloană. Notăm \(\overline{A}=\begin{bmatrix}A&\bm{b}\end{bmatrix}\) matricea extinsă ce conține elemente de forma \(\overline{a}_{ij}\) pe linia \(i\in\overline{1,n}\), coloana \(j\in\overline{1,n+1}\).
Înainte de orice, se va calcula vectorul \(\bm{s}\) folosind una din formulele prezentate anterior. În cazul de față, folosind modulul maxim, obținem:
\[ \boxed{s_i=\max_{j\in\overline{i,n}}\Big\{\left|\overline{a}_{i,j}\right|\Big\}}\,,\,\,\forall i\in\overline{1,n} \]Pentru fiecare linie \(i\in\overline{1,n-1}\) cu excepția ultimei, se va alege mai întâi o valoare \(k\in\overline{i,n}\) astfel încât \(\left|\frac{\overline{a}_{ki}}{s_k}\right|=\max_{j\in\overline{i,n}}\left\{\left|\frac{\overline{a}_{ji}}{s_j}\right|\right\}\) și se vor interschimba liniile \(i\) și \(k\), respectiv valorile \(s_i\) și \(s_k\).
Apoi, în matricea proaspăt formată, se vor transforma toate elementele aflate pe a \(i\)-a coloană sub diagonala principală (sub \(\overline{a}_{ii}\)), adică elementele \(\overline{a}_{ji}\), \(\forall j\in\overline{i+1,n}\), în zerouri prin scăderea celei de-a \(i\)-a linii scalată cu \(\frac{\overline{a}_{ji}}{\overline{a}_{ii}}\) din cea de-a \(j\)-a linie.
Matematic, pasul \(i\) arată astfel:
-
Interschimbarea celor două linii poate fi scrisă drept:
\[ \exists\,k\in\overline{i,n}: \left|\frac{\overline{a}_{ki}}{s_k}\right|=\max_{j\in\overline{i,n}}\left\{\left|\frac{\overline{a}_{j,i}}{s_j}\right|\right\}\Rightarrow\boxed{\begin{cases}\bm{L_i}(\overline{A})\leftrightarrow\bm{L_k}(\overline{A})&\text{și}\\s_i\leftrightarrow s_j \end{cases}} \] -
Apoi, se poate aplica algoritmul G clasic:
\[ \boxed{\bm{L_j}(\overline{A})\rightarrow \bm{L_j}(\overline{A})-\frac{\overline{a}_{ji}}{\overline{a}_{ii}}\cdot \bm{L_i}(\overline{A})}\,,\,\,\forall j\in\overline{i+1,n} \]
Exemplificarea algoritmului#
Să considerăm același sistem de ecuații liniare, descris direct în forma: \(\overline{A}=\begin{bmatrix} 1 & -2 & 1 & | & 0\\ 2 & 1 & -3 & | & 5\\ 4 & -7 & 1 & | & 1 \end{bmatrix}\).
Urmăm acum pașii descriși anterior:
-
Pasul 1. Calculăm coeficientul de scalare. După cum am discutat, există mai multe modalități de a efectua acest calcul, dar alegem modulul maxim:
\[ S=\begin{bmatrix} 2 & 3 & 7 \end{bmatrix} \] -
Pasul 2a. Deoarece \(\left|\frac{\overline{a}_{21}}{s_2}\right|=\frac{2}{3}\geq\left|\frac{\overline{a}_{31}}{s_3}\right|=\frac{4}{7}\geq\left|\frac{\overline{a}_{11}}{s_1}\right|=\frac{1}{2}\), facem interschimbările de linie și de coeficient de scalare, adică \(\bm{L_1}(\overline{A})\leftrightarrow\bm{L_2}(\overline{A})\) și \(s_1\leftrightarrow s_2\):
\[ \overline{A}=\begin{bmatrix} 2 & 1 & -3 & | & 5\\ 1 & -2 & 1 & | & 0\\ 4 & -7 & 1 & | & 1\\ \end{bmatrix}\text{ și }S=\begin{bmatrix} 3 & 2 & 7 \end{bmatrix} \] -
Pasul 2b. Golirea primei coloane. Se execută:
-
Pasul 3a. Deoarece \(\left|\frac{\overline{a}_{32}}{s_3}\right|=\frac{9}{7}\geq\left|\frac{\overline{a}_{22}}{s_2}\right|=\frac{5}{4}\), facem interschimbările de linie și de coeficient de scalare, adică \(\bm{L_2}(\overline{A})\leftrightarrow\bm{L_3}(\overline{A})\) și \(s_2\leftrightarrow s_3\):
\[ \overline{A}=\begin{bmatrix} 2 & 1 & -3 & | & 5\\ 0 & -9 & 7 & | & -9\\ 0 & -2.5 & 2.5 & | & -2.5 \end{bmatrix}\text{ și }S=\begin{bmatrix} 3 & 7 & 2 \end{bmatrix} \] -
Pasul 3b. Golirea celei de-a doua coloane. Se execută:
\[\bm{L_3}(\overline{A})\rightarrow \bm{L_3}(\overline{A})+\frac{5}{18}\bm{L_2}(\overline{A}) \Rightarrow \overline{A}\approx\begin{bmatrix} 2 & 1 & -3 & | & 5\\ 0 & -9 & 7 & | & -9\\ 0 & 0 & 0.5556 & | & 0 \end{bmatrix}\]
Concluzie. Se rezolvă sistemul superior triunghiular (de jos în sus) și se obține: \(\begin{cases} x_3=0\\ x_2=1\\ x_1=2 \end{cases}\).
Cod ilustrativ#
Pentru a ajunge la algoritmul GPPS, folosim funcția GPP
, primind parametrii reprezentativi sistemului \(A\bm{x}=\bm{b}\):
-
A
- matricea coeficienților sistemului; -
b
- vectorul coloană din partea dreaptă a egalității.
Funcția returnează perechea [A, b]
, echivalentul unui sistem triunghiular de ecuații liniare pe care se poate aplica apoi SST
-ul explicat anterior.
function [A, b] = GPPS(A, b)
[m, n] = size(A);
Ae = [A, b];
for p = [1 : n]
S(p) = max(abs(A(p,:)));
end
for p = [1 : n-1]
% Partea de GPPS:
[piv, l_piv] = max(abs(Ae(p:n, p)) ./ S(:,p:n)');
l_piv = l_piv + p - 1;
temp = Ae(l_piv, :);
Ae(l_piv,:) = Ae(p, :);
Ae(p, :) = temp;
temp = S(l_piv);
S(l_piv) = S(p);
S(p) = temp;
% Algoritmul G:
if (Ae(p ,p) == 0)
continue;
end
for l = p+1 : n
arg = Ae(l, p) / Ae(p, p);
Ae(l, :) = Ae(l, :) - arg * Ae(p, :);
end
end
A = Ae(:, 1:n);
b = Ae(:, n+1);
end
Calcularea complexității#
Calcularea vectorului \(\bm{s}\) se reduce la \((n-i+1)\) operații pentru fiecare element \(s_i\), \(\forall i\in\overline{1,n}\). Așadar, complexitatea adițională \(SPP'(n,m)\) ia forma:
\[ SPP'(n,m)=\sum_{i=1}^n(n-i+1)=O(n^2) \]Complexitatea finală (obținută prin însumarea lui \(SPP'\) la \(PP'+GE=PP\)) devine:
\[ SPP(n,m) = SPP'(n,m) + PP'(n,m) + GE(n,m) \]Așadar, \(SPP(n,m)\in O(mn\mu)=O(mn\cdot\min\{m,n\})\).
Licență#
The book "Metode Numerice", written by Valentin-Ioan Vintilă, is licensed under CC BY-NC-SA 4.0