проблемаЯ пытаюсь использовать собственные неподдерживаемые Левенберга Марквардта, чтобы найти оптимальные параметры для двух линейных уравнений. Когда я запускаю свой код, алгоритм очень быстро сходится к неправильному ответу.
ожидаемый: Я сгенерировал набор терминов 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.
Мои уравнения были правильными. Если у кого-то еще есть эта проблема, я рекомендую просто придумать тестовый пример. Например, в моем коде я просто упростил мои уравнения
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 минимизирует параметры до правильных значений. Зависит от того, как вы их инициализируете.
Других решений пока нет …