πŸ“– ДокумСнтация Qumir

← Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² Playground

← ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ -- ΠΎΠ΄Π½Π° ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹, лСТащая Π² основС практичСски всСх числСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вычисляСт ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ $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$.

ИдСя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

  1. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ $A$ (Π½ΠΈΠΆΠ½ΠΈΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ -- Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ -- Π½ΡƒΠ»ΠΈ) ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ $x$ (всС элСмСнты Ρ€Π°Π²Π½Ρ‹ $1$).
  2. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки $i$ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ строки $A_i$ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ $x$, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² $y_i$.
  3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ $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, нс
ΠΊΠΎΠ½

β–Ά Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€