2015-11-19 7 views
0

Я пытаюсь решить систему уравнений, которая возникает в результате оценки дифференциального уравнения 4-го порядка. Для этого требуется создать большую матрицу (А), обычно 105 х 105, принимая обратное и умножая на матрицу 105 х 1 (В). Для этого я использую линейную алгебру подход, решая Ax = B.Решение большой системы уравнений с использованием VBA

Запуск следующего кода:

Dim A(1 To 105, 1 To 105) As Double 
Dim B(1 To 105) As Double 
Dim i As Integer 

' Used to make sure all values of A are initialized to zero 
For i = 1 To 105 
    For j = 1 To 105 
     A(i, j) = 0 
    Next 
Next 

For i = 1 To 105 
    A(i, i) = EI 
    A(i, i + 1) = -4 * EI + axial * h^2 
    A(i, i + 2) = 6 * EI - 2 * axial * h^2 + km(i) * h^4 
    A(i, i + 3) = -4 * EI + axial * h^2 
    A(i, i + 4) = EI 

B(i) = W * h^4 

Next 
Dim x(1 To 105) As Variant 
x = Application.WorksheetFunction.MMult((Application.WorksheetFunction.MInverse(A)), B) 

результатов «ошибка времени выполнения„1004“: Не удается получить свойство MINVERSE класса рабочего листа «

Я исследовал эту ошибку, и, похоже, это означает, что я передаю плохие данные функции как текстовые, так и пустые значения, поэтому я добавил две петли вверху, чтобы инициализировать матрицу А до 0 однако это ничего не делало. Изучив еще несколько, я нашел несколько неясных сообщений о максимальном размере матриц 52 х 52, но не смог найти больше информации об этом.

+0

Ограничение 52 x 52 было снято в версии 2007 года, я верю, но большие матрицы часто близки к сингулярным, что, я думаю, будет проблемой здесь. Вместо этого попробуйте найти методы для инвертирования разреженных матриц, которые могут быть более эффективными и точными для этого типа проблем. Также обратите внимание, что последний аргумент в коде требует транспонирования. –

ответ

0

Да, существует ограничение 52 х 52, как указано в официальной документации.

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.worksheetfunction.minverse.aspx

EDIT

документация кажется неправильным. Я протестировал =MINVERSE(A1:DA105), и он работает хорошо.

Скорее всего, ваша матрица содержит числа, которые генерируют очень большие числа, и это терпит неудачу. Я заполнил свою матрицу 105 строк числами от 1 до 105, и она не срабатывала. Затем я положил =RAND() во все ячейки, и это сработало.

Если проблемы с большими числами, возможно, есть трюки, такие как заполнение матрицы логарифмом чисел. Это трюк, который я использую в других случаях, я не знаю, можно ли его использовать с матрицей.

+0

Спасибо, я исследую другие методы решения систем уравнений. –

+0

@AndrewGulbronson Пожалуйста, не забудьте принять ответ, если вы сочтете это полезным. –

+0

Интересно, я просто проверил те же тесты на своей машине, и это не сработало. Спасибо за продолжение! –