Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ Π½Π° Π²Π΅ΠΊΡΠΎΡ
Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ Π½Π° Π²Π΅ΠΊΡΠΎΡ -- ΠΎΠ΄Π½Π° ΠΈΠ· Π±Π°Π·ΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ, Π»Π΅ΠΆΠ°ΡΠ°Ρ Π² ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅Ρ ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ $y = A \cdot x$ Π΄Π»Ρ Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΌΡΠ»Π΅.
ΠΠ°Π΄Π°ΡΠ°
ΠΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ $A$ ΡΠ°Π·ΠΌΠ΅ΡΠ° $n \times n$ Π½Π° Π²Π΅ΠΊΡΠΎΡ $x$ Π΄Π»ΠΈΠ½Ρ $n$:
$y_i = \sum_{j=0}^{n-1} A_{i,j} \cdot x_j, \quad i = 0, \ldots, n-1$
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ:
$A_{i,j} = \begin{cases} 1, & j \le i \ 0, & j > i \end{cases}$
ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ $x_j = 1$. ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: $y_i = i + 1$.
ΠΠ΄Π΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°
- ΠΠ°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΡΡ $A$ (Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ -- Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ -- Π½ΡΠ»ΠΈ) ΠΈ Π²Π΅ΠΊΡΠΎΡ $x$ (Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠ°Π²Π½Ρ $1$).
- ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ $i$ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ $A_i$ Π½Π° Π²Π΅ΠΊΡΠΎΡ $x$, Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² $y_i$.
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ $e_i = y_i - (i + 1)$ ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ Π½ΠΎΡΠΌΡ $|e|2$ ΠΈ $|e|\infty$.
Π Π°Π·Π±ΠΎΡ
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΠ°Π΄Π°ΡΠΌ ΡΠ°Π·ΠΌΠ΅Ρ $n = 256$ ΠΈ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² A Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΡΡ, ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ x ΠΈ y Π΄Π»Ρ Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠΎΠ²:
ΡΠ΅Π» n,i,j
n := 256
Π²Π΅Ρ ΡΠ°Π± A[0:n-1,0:n-1]
Π²Π΅Ρ ΡΠ°Π± x[0:n-1]
Π²Π΅Ρ ΡΠ°Π± y[0:n-1]
Π²Π΅Ρ sum, absv
Π²Π΅Ρ res_l2_sq, res_l2, res_inf, err
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΈ Π²Π΅ΠΊΡΠΎΡΠ°
ΠΠ°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ $A$ ΠΊΠ°ΠΊ Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ ($A_{i,j} = 1$ ΠΏΡΠΈ $j \le i$, ΠΈΠ½Π°ΡΠ΅ $0$), Π° Π²Π΅ΠΊΡΠΎΡ $x$ -- Π΅Π΄ΠΈΠ½ΠΈΡΠ°ΠΌΠΈ:
| ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ A ΠΈ x
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
Π΅ΡΠ»ΠΈ j <= i ΡΠΎ
A[i,j] := 1.0
ΠΈΠ½Π°ΡΠ΅
A[i,j] := 0.0
Π²ΡΠ΅
ΠΊΡ
x[i] := 1.0
ΠΊΡ
Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ Π½Π° Π²Π΅ΠΊΡΠΎΡ
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π±Π»ΠΎΠΊ -- Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠΈΠΊΠ»Π°. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ $i$ ΡΡΠΈΡΠ°Π΅ΠΌ ΡΡΠΌΠΌΡ $y_i = \sum_j A_{i,j} \cdot x_j$:
| ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ y = A * x
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
sum := 0.0
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
sum := sum + A[i,j] * x[j]
ΠΊΡ
y[i] := sum
ΠΊΡ
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ $i$ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ $e_i = y_i - (i+1)$ ΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΡΠΌΡ -- $|e|2$ (Π΅Π²ΠΊΠ»ΠΈΠ΄ΠΎΠ²Π° Π½ΠΎΡΠΌΠ°, ΠΊΠΎΡΠ΅Π½Ρ ΠΈΠ· ΡΡΠΌΠΌΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ²) ΠΈ $|e|\infty$ (ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅):
| ΠΡΠΎΠ²Π΅ΡΠΊΠ°: ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ y[i] = i+1
res_l2_sq := 0.0
res_inf := 0.0
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
err := y[i] - (i + 1.0)
absv := err; Π΅ΡΠ»ΠΈ absv < 0.0 ΡΠΎ absv := -absv Π²ΡΠ΅
res_l2_sq := res_l2_sq + err * err
Π΅ΡΠ»ΠΈ absv > res_inf ΡΠΎ res_inf := absv Π²ΡΠ΅
ΠΊΡ
res_l2 := sqrt(res_l2_sq)
Π²ΡΠ²ΠΎΠ΄ "matvec: ||e||_2^2 = ", res_l2_sq, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matvec: ||e||_2 = ", res_l2, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matvec: ||e||_inf = ", res_inf, Π½Ρ
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ Π½Π° Π²Π΅ΠΊΡΠΎΡ -- $O(n^2)$. ΠΡΠΎ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΠΊΠ°ΠΊ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π±Π»ΠΎΠΊ Π²ΠΎ Π²ΡΠ΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ Π°Π»Π³Π΅Π±ΡΠ°ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ (Π‘ΠΠΠ£) -- Π½Π°Π±ΠΎΡΠ° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ Π²ΠΈΠ΄Π° $Ax = b$.
ΠΠΎΠ»Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
Π°Π»Π³ main
Π½Π°Ρ
| ΠΠ°ΡΠ²Π΅ΠΊΡ: y = A * x, Π³Π΄Π΅ A β Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ,
| x β Π²Π΅ΠΊΡΠΎΡ ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ. ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ y[i] = i+1.
ΡΠ΅Π» n,i,j
n := 256
Π²Π΅Ρ ΡΠ°Π± A[0:n-1,0:n-1]
Π²Π΅Ρ ΡΠ°Π± x[0:n-1]
Π²Π΅Ρ ΡΠ°Π± y[0:n-1]
Π²Π΅Ρ sum, absv
Π²Π΅Ρ res_l2_sq, res_l2, res_inf, err
| ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ A ΠΈ x
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
Π΅ΡΠ»ΠΈ j <= i ΡΠΎ
A[i,j] := 1.0
ΠΈΠ½Π°ΡΠ΅
A[i,j] := 0.0
Π²ΡΠ΅
ΠΊΡ
x[i] := 1.0
ΠΊΡ
| ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ y = A * x
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
sum := 0.0
Π½Ρ Π΄Π»Ρ j ΠΎΡ 0 Π΄ΠΎ n-1
sum := sum + A[i,j] * x[j]
ΠΊΡ
y[i] := sum
ΠΊΡ
| ΠΡΠΎΠ²Π΅ΡΠΊΠ°: ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ y[i] = i+1
res_l2_sq := 0.0
res_inf := 0.0
Π½Ρ Π΄Π»Ρ i ΠΎΡ 0 Π΄ΠΎ n-1
err := y[i] - (i + 1.0)
absv := err; Π΅ΡΠ»ΠΈ absv < 0.0 ΡΠΎ absv := -absv Π²ΡΠ΅
res_l2_sq := res_l2_sq + err * err
Π΅ΡΠ»ΠΈ absv > res_inf ΡΠΎ res_inf := absv Π²ΡΠ΅
ΠΊΡ
res_l2 := sqrt(res_l2_sq)
Π²ΡΠ²ΠΎΠ΄ "matvec: ||e||_2^2 = ", res_l2_sq, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matvec: ||e||_2 = ", res_l2, Π½Ρ
Π²ΡΠ²ΠΎΠ΄ "matvec: ||e||_inf = ", res_inf, Π½Ρ
ΠΊΠΎΠ½