Оптимизировать параметры в системе нелинейных уравнений одновременно - PullRequest
3 голосов
/ 11 февраля 2012

У меня есть большое количество уравнений (n) с большим количеством неизвестных (m), где m больше, чем n. Я пытаюсь найти значения m, используя n уравнений и большой набор наблюдаемых значений.

Я посмотрел на некоторые реализации Левенберга-Марквардта в C #, но я не смог найти ни одной, которая бы решала более 1 уравнения. Например, я посмотрел на http://kniaz.net/software/LMA.aspx, и это, кажется, то, что я хочу, за исключением того, что он принимает только одно уравнение в качестве параметра, я хочу решить для ряда уравнений одновременно. Аналогично, этот пакет: http://www.alglib.net/ содержит хорошую реализацию LM, но только для одного уравнения.

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

Кроме того, есть ли хорошее и простое для понимания объяснение того, как работает LM и как его реализовать? Я попытался прочитать некоторые учебники по математике, чтобы реализовать его сам, но я довольно невежествен в математике, поэтому большая часть объяснений потеряна для меня.

редактирование:

Подробнее о моей проблеме:

1) Уравнения формируются динамически и могут меняться при каждом запуске моей задачи

2) У меня нет хорошего предположения о начальных параметрах. Я планирую запустить его несколько раз с рандомизированными начальными параметрами, чтобы найти глобальный минимум.

Редактировать 2:

Еще один вопрос, я читаю эту статью: http://ananth.in/docs/lmtut.pdf, и в разделе 2 я увидел следующее:

x = (x1; x2 ... xn) - вектор, и каждый rj это функция от ℜn к ℜ. RJ упоминаются как остатки, и предполагается, что m> = n.

Значит ли это, что LM не работает, если у меня больше параметров, чем функций? Например, если я хочу решить A и B для функции:

Y = AX + B

Это будет невозможно из-за того, что мой вектор параметров имеет размер 2 (A и B), а число моих функций равно 1?

1 Ответ

1 голос
/ 12 февраля 2012

Алгоритм Левенберга-Марквардта может решить вашу проблему; Тем не менее, я не нахожу реализацию в C #, которая реализует этот случай [ОБНОВЛЕНИЕ: смотрите редактирование ниже для получения подробной информации о том, как заставить alglib.net делать то, что вы хотите] . У MINPACK есть точки входа для этого случая (LMDIF1 или LMDIF, если, как вы заявили, вы хотите приблизить производные, используя различия). Вы можете попробовать автоматически перевести C / C ++ версию MINPACK , используя инструменты, перечисленные в предыдущий вопрос о StackOverflow .

Что касается вашего вопроса в «Редактировании 2»: «Значит ли это, что LM не работает, если у меня больше параметров, чем функций?», Ответ: нет, вы не правы. «m» в статье в этой точке фактически, в вашем случае, равно числу ваших уравнений, умноженных на количество имеющихся у вас точек данных (при условии, что вы подразумеваете под «наблюдаемой величиной») является значением для разницы между правой и левой частью каждого уравнения). Другими словами, функции r-sub-i, о которых он говорит, - это как раз те неравенства уравнений (RHS - LHS).

Важное редактирование: теперь я вижу, что второй найденный вами пакет, alglib.net, будет делать то, что вы хотите (но учтите, что он доступен только бесплатно под лицензией GPL). Поскольку вы не хотите предоставлять производные, вы должны использовать схему «V», где, если у вас есть n уравнений и k наблюдаемых значений параметров, вектор f имеет n * k элементов, где

f[i + j*n] = (RHS_of_equation[i](data_point[j]) - LHS_of_equation[i](data_point[j]))

(конечно, i и j начинаются с 0).

...