так, как я и ожидал, причина основной проблемы была наиглупейшей из возможных - я пробовал макрос на системе ЛУ, матрица которой вырождена)) другое дело, что значения находятся неверные, но это уже совсем другая история видимо, извиняюсь за весь сыр-бор если кто-то решит ткнуть меня носом в место, где код выполняет неверный алгоритм решения - буду очень благодарен, но и на этом результате всем спасибо!
P.S. подправил код, теперь все верно)) можно закрывать тему, думаю
ocet p, значит все-таки проблема в процедуре SolveLinearEquation с передачей аргументов, ибо в упор не вижу где может быть ошибка с заполнением массивов. понятно, спасибо
nilske, ИИ очень слаб в VBA) правда я еще слабее, но все же. можно даже сказать, что это на 50% мой код ахах. какие-то пространные пояснения выдает, но не может понять о какой ошибке кода я ему там затираю
Sanja, запускаю через окно модуля VBA кнопкой run, так как этот макрос не сохраняется в списке макросов (тот что на картинке). пытался добавить в тот же макрос еще один код, который и должен передавать ему 4 аргумента, но либо тот же результат, либо вылазила ошибка, что макрос gaus не определен. если создавать отдельный модуль - результат тот же. при этом другие макросы работают хорошо. про то, что нужно передать 4 аргумента знал, но уже думаю, что наверное плохо понимаю как это работает, раз не выходит) unitgod, к сожалению, не могу прикрепить конкретно мой файл, там куча листов и уже проделанной работы. но могу создать новый и сохранить там этот макрос) правда есть ли в этом смысл не знаю вот код, которым пытался передать аргументы, но что-то тщетно с ним:
Код
Sub SolveLinearEquation()
Dim n As Integer
Dim A() As Double, F() As Double, X() As Double
Dim i As Integer, j As Integer
' Определить количество уравнений (число строк в матрице A)
n = Range("A1").CurrentRegion.Rows.Count
' Инициализировать массивы A() и F()
ReDim A(1 To n, 1 To n)
ReDim F(1 To n)
ReDim X(1 To n)
' Заполнить массив A() данными из указанных ячеек
For i = 1 To n
For j = 1 To n
A(i, j) = Cells(i, j).Value
Next j
Next i
' Заполнить массив F() данными из столбца свободных членов
For i = 1 To n
F(i) = Cells(i, n + 1).Value
Next i
' Вызвать процедуру для решения системы уравнений
Call sub_gaus(n, A, F, X)
' Вывести результат на лист Excel
For i = 1 To n
Cells(i, n + 2).Value = X(i)
Next i
End Sub
Sub gaus(ByVal n, ByRef A() As Double, _
ByRef F() As Double, ByRef X() As Double)
Dim i As Integer, j As Integer, k As Integer
Dim AA() As Double: ReDim AA(1 To n, 1 To n)
Dim FF() As Double: ReDim FF(1 To n)
Dim B() As Double: ReDim B(1 To n, 1 To n)
Dim G() As Double: ReDim G(1 To n)
'Прямой ход:
For i = 1 To n
For j = 1 To n
AA(i, j) = A(i, j)
Next j
FF(i) = F(i)
Next i
For k = 1 To n - 1
For j = k + 1 To n
B(k, j) = AA(k, j) / AA(k, k)
Next j
G(k) = FF(k) / AA(k, k)
'конец шага № k и начало шага № k + 1
For i = k + 1 To n
For j = k + 1 To n
AA(i, j) = AA(i, j) - AA(i, k) * _
B(k, j)
Next j
FF(i) = FF(i) - AA(i, k) * G(k)
Next i
Next k
G(n) = FF(n) / AA(n, n)
'Обратный ход:
X(n) = G(n)
For k = n - 1 To 1 Step -1
X(k) = G(k)
For j = k + 1 To n
X(k) = X(k) - B(k, j) * X(j)
Next j
Next k
End Sub
при запуске, вместо выполнения решения СЛУ методом Гаусса, открывается окно выбора макроса...