Как оптимизировать решение нелинейных уравнений? - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть нелинейные уравнения, такие как:

Y = f1 (X)

Y = f2 (X)

...

Y = fn (X)

Как правило, они не имеют точного решения, поэтому я использую метод Ньютона решить их.Метод основан на итерациях, и я ищу способ оптимизировать вычисления.Как можно минимизировать время расчета?Избегать вычисления квадратных корней или других математических функций?Может быть, я должен использовать сборку внутри кода C ++ (решение написано на C ++)?

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010

Популярным подходом для нелинейных задач наименьших квадратов является алгоритм Левенберга-Марквардта.Это своего рода смесь Гаусса-Ньютона и метода градиентного спуска.Он сочетает в себе лучшее из обоих миров (хорошо ориентируется в пространстве поиска некорректных задач и быстро сходится).Но есть много места для маневра с точки зрения реализации.Например, если квадратная матрица J ^ TJ (где J - матрица Якоби, содержащая все производные для всех уравнений) является разреженной, вы можете использовать итерационный алгоритм CG для быстрого решения систем уравнений вместо прямого метода, такого как факторизация Холецкого J^ TJ или QR-разложение J.

Но не просто предполагайте, что какая-то часть медленная и должна быть написана на ассемблере.Ассемблер - это последнее, что нужно учитывать.Перед тем, как идти по этому пути, вы всегда должны использовать профилировщик, чтобы проверить узкие места.

1 голос
/ 08 декабря 2010

Вы говорите о ряде однопараметрических функций для решения по одной или системе многопараметрических уравнений для совместного решения?

Если первое, то я часто обнаруживал, что находкалучшее начальное приближение (с которого начинается цикл Ньютона-Рафсона) может сэкономить больше времени выполнения, чем полировка самого цикла, потому что сходимость в цикле может быть сначала медленной, но позже быстрой.Если вы ничего не знаете о функциях, то найти приличное начальное приближение сложно, но сначала стоит попробовать несколько секущих итераций.Вы также можете посмотреть на метод Брента

0 голосов
/ 22 декабря 2018

Рассмотрите возможность параллельного использования Rational Root Test. Если невозможно использовать значения абсолютной точности, тогда используйте результаты, наиболее близкие к нулю, как наилучшее соответствие для продолжения по методу Ньютона. Найдя один корень, вы можете уменьшить оценку уравнения, разделив его на моном (x-корень). Здесь реализованы разделительные и рациональные корневые тесты https://github.com/ohhmm/openmind/blob/sh/omnn/math/test/Sum_test.cpp#L260

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...