Можно ли использовать Эйгена Левенберга Марквардта с линейными уравнениями и постоянным якобианом?

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

ожидаемый: Я сгенерировал набор терминов tU, tX, tZ, tY и tV, используя параметры tFx = 13,7, tFy = 13,5, tCx = 0,0, tCy = 0,0. Я ожидаю, что LM вернет те же значения, которые использовались для генерации tU, tX, tZ, tY и tV.

Наблюдаемый: Когда я запускаю LM для уравнений, получается tFx = 13,0, tFy = 13,0, tCx = 0,0, tCy = 0,0.

Подход:
Я пытаюсь найти оптимальный набор параметров для следующих двух уравнений:

  aH(i) = tU - tFx*tX / tZ - tCx;
aH(i + mObjectPoints.size()) = tV - tFy*tY / tZ - tCy;

Мой вектор параметров:

double tFx = aP(0);
double tFy = aP(1);
double tCx = aP(2);
double tCy = aP(3);

а а — мой функциональный вектор. Приведенные выше уравнения дают постоянный якобиан, который не зависит от aP.

  aFjac(i, 0) = -1 * tX / tZ;
aFjac(i, 1) = 0;
aFjac(i, 2) = -1;
aFjac(i, 3) = 0;
aFjac(i + mObjectPoints.size(), 0) = 0;
aFjac(i + mObjectPoints.size(), 1) = -1*tY/tZ;
aFjac(i + mObjectPoints.size(), 2) = 0;
aFjac(i + mObjectPoints.size(), 3) = -1;

Я использую в основном, следуя приведенному примеру Вот. Как в примере, я использую оператор и df, которые следуют:

int operator()(const Eigen::VectorXd &aP,        //Input
Eigen::VectorXd &aH) const  //Output

int df(const InputType &aP, JacobianType& aFjac)

Способ проверки минимума заключается в следующем:

  Eigen::LevenbergMarquardt<CameraMatrixFunctor> lm(tFunctor);

lm.parameters.factor = 0.001;
lm.parameters.maxfev = 500;
lm.parameters.xtol = 1e-5;lm.minimize(tP);

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

0

Решение

Мои уравнения были правильными. Если у кого-то еще есть эта проблема, я рекомендую просто придумать тестовый пример. Например, в моем коде я просто упростил мои уравнения

aH(i) = tFx- tCx;
aH(i + mObjectPoints.size()) = tFy - tCy;

и тогда якобиан становится

aFjac(i, 0) = 1;
aFjac(i, 1) = 0;
aFjac(i, 2) = -1;
aFjac(i, 3) = 0;
aFjac(i + mObjectPoints.size(), 0) = 0;
aFjac(i + mObjectPoints.size(), 1) = 1;
aFjac(i + mObjectPoints.size(), 2) = 0;
aFjac(i + mObjectPoints.size(), 3) = -1;

Затем LM минимизирует параметры до правильных значений. Зависит от того, как вы их инициализируете.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]