Я пытаюсь перестроить некоторый код Matlab в C, который использует их функцию fsolve. Из документации он использует алгоритм «рефлексивной области доверия» (я уже построил его с использованием алгоритма Левенберга-Марквардта, и он сходится совершенно по-другому). Кто-нибудь может порекомендовать библиотеку для выполнения этого типа оптимизации в C / C ++?
Существует два типа алгоритмов общего назначения, для которых существует гарантия глобальной конвергенции (при стандартных допущениях не спрашивайте :)). Этими методами являются поиск строки и методы области доверия. Если вы хотите, вы можете прочитать больше на эту тему в книге Носедал-Райт: численная оптимизация.
Я не пробовал Knitro в последнее время.
Ipopt самый надежный решатель из тех, что я пробовал, я очень рекомендую его. Он реализует метод поиска строки и написан на C ++.
Не уверен, что «рефлексивный» добавляет к определению «область доверия». Тем не мение, Knitro является мощным оптимизатором внутренней точки доверия с интерфейсом C / C ++. К несчастью, Knitro доступно только бесплатно в ограниченном выпуске для студентов; полная версия требует коммерческой лицензии.
Существует также Ipopt, который не доверительный регион, но тем не менее мощный мощный основанный на C / C ++ механизм нелинейной ограниченной оптимизации с лицензией с открытым исходным кодом.
Вы пытались проверить, является ли ваша функция выпуклой, если LM и некоторые другие алгоритмы выпуклой оптимизации сходятся по-разному, есть хороший шанс, что базовая функция не является выпуклой. Также вы проверили, имеет ли функция стоимости хотя бы порядок 2. Если это так, минимизация квадрата функции стоимости может быть лучше, чем минимизация только функции стоимости.