Понадобилось мне решить систему линейных
уравнений.
Я такую програмку уже, наверное, раз 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
|