15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


МАТЕМАТИКА

Понадобилось мне решить систему линейных уравнений.
Я такую програмку уже, наверное, раз 20 писал на разных языках, начиная с
алгола А вот для VB почему-то лень стало. Дня три искал везде по сети, но так и не
нашел. Неужели никому не надо?
Короче говоря, сел и написал свою. Может быть она еще кому-нибудь пригодится?
Владимир Мизгулин
 
Sub Eq_Sol(a() As Double, b() As Double, x() As Double, n As Integer)
' Решение системы линейных уравнений AX = B
' методом Халецкого (http://www.chat.ru/~alglib/).
' Обращение:
'  Call (A(),B(),X(),N)
' где N - кол-во уравнений (неизвестных), A - матица коэффициентов (N*N),
'       B - столбец (N), X - решение системы (N).
' Метод: матрицу A можно представить в виде A = L*R,
' где L - левая (нижняя) треугольная матрица,
' R - правая (верхняя) треугольная матрица с единицами по диагонали,
' тогда AX = LRX = L(RX) = LY = B,
' т.е. надо решить две простые системы LY = B и затем RX = Y
' Перед обращением следет проверить, что A(1,1) <> 0.
' Имеет ли система решение прграмма не проверяет.

Dim L(1 To 20, 1 To 20), R(1 To 20, 1 To 20), Y(1 To 20)
Dim i As Integer, j As Integer, k As Integer
For i = 1 To n
   L(i, 1) = a(i, 1)
   R(1, i) = a(1, i) / a(1, 1)
Next i
Y(1) = b(1) / a(1, 1)
For i = 2 To n
   R(i, i) = 1
   j = 2
   Do
      L(i, j) = a(i, j)
      R(i, j) = 0
      For k = 1 To j - 1
         L(i, j) = L(i, j) - L(i, k) * R(k, j)
      Next
      j = j + 1
   Loop Until j > i
   R(i, i) = 1
   Do
      L(i, j) = 0
      R(i, j) = a(i, j)
      Y(i) = b(i)
      For k = 1 To i - 1
         R(i, j) = R(i, j) - L(i, k) * R(k, j)
         Y(i) = Y(i) - L(i, k) * Y(k)
      Next
      R(i, j) = R(i, j) / L(i, i)
      Y(i) = Y(i) / L(i, i)
      j = j + 1
   Loop Until j > n
Next
x(n) = Y(n)
For i = n - 1 To 1 Step -1
   x(i) = Y(i)
   For k = i + 1 To n
      x(i) = x(i) - R(i, k) * x(k)
   Next
Next
End Sub