Note that there are some explanatory texts on larger screens.

plurals
  1. POLimitations of the Levenberg-Marquardt algorithm
    primarykey
    data
    text
    <p>I am using <a href="http://en.wikipedia.org/wiki/Levenberg-Marquardt_algorithm" rel="nofollow">Levenberg-Marquardt algorithm</a> to minimize a non-linear function of 6 parameters. I have got about 50 data points for each minimization, but I do not get sufficiently accurate results. Does the fact, that my parameters differ from each other by a few orders of magnitudes can be so much significant? If yes, where should I look for the solution? If no, what kind of limitations of LMA you met in your work (it may help to find other problems with my applictaion)? Many Thanks for your help. </p> <p>Edit: The problem I am trying to solve is to determine the best transformation T:</p> <pre><code>typedef struct { double x_translation, y_translation, z_translation; double x_rotation, y_rotation, z_rotation; } transform_3D; </code></pre> <p>to fit the set of 3D points to the bunch of 3D lines. In detail I have got a set of coordinates of 3D points and equations of corresponding 3D lines, which should go through those points (in ideal situation). The LMA is minimizing the summ of distances of the transfomed 3D points to corresponding 3D lines. The transform function is as follows:</p> <pre><code>cv::Point3d Geometry::transformation_3D(cv::Point3d point, transform_3D transformation) { cv::Point3d p_odd,p_even; //rotation x p_odd.x=point.x; p_odd.y=point.y*cos(transformation.x_rotation)-point.z*sin(transformation.x_rotation); p_odd.z=point.y*sin(transformation.x_rotation)+point.z*cos(transformation.x_rotation); //rotation y p_even.x=p_odd.z*sin(transformation.y_rotation)+p_odd.x*cos(transformation.y_rotation); p_even.y=p_odd.y; p_even.z=p_odd.z*cos(transformation.y_rotation)-p_odd.x*sin(transformation.y_rotation); //rotation z p_odd.x=p_even.x*cos(transformation.z_rotation)-p_even.y*sin(transformation.z_rotation); p_odd.y=p_even.x*sin(transformation.z_rotation)+p_even.y*cos(transformation.z_rotation); p_odd.z=p_even.z; //translation p_even.x=p_odd.x+transformation.x_translation; p_even.y=p_odd.y+transformation.y_translation; p_even.z=p_odd.z+transformation.z_translation; return p_even; } </code></pre> <p>Hope this explanation will help a bit...</p> <p>Edit2:</p> <p>Some exemplary data is pasted below. 3D lines are described by the center point and the directional vector. Center point for all lines are (0,0,0) and 'uz' coordinate for each vector is equal to 1. Set of 'ux' coordinates of directional vectors:</p> <pre><code>-1.0986, -1.0986, -1.0986, -1.0986, -1.0990, -1.0986, -1.0986, -1.0986, -0.9995, -0.9996, -0.9996, -0.9995, -0.9995, -0.9995, -0.9996, -0.9003, -0.9003, -0.9004, -0.9003, -0.9003, -0.9003, -0.9003, -0.9003, -0.8011, -0.7020, -0.7019, -0.6028, -0.5035, -0.5037, -0.4045, -0.3052, -0.3053, -0.2062, -0.1069, -0.1069, -0.1075, -0.1070, -0.1070, -0.1069, -0.1069, -0.1070, -0.0079, -0.0079, -0.0079, -0.0078, -0.0078, -0.0079, -0.0079, 0.0914, 0.0914, 0.0913, 0.0913, 0.0914, 0.0915, 0.0914, 0.0914 </code></pre> <p>Set of 'uy' coordinates of directional vectors:</p> <pre><code>-0.2032, -0.0047, 0.1936, 0.3919, 0.5901, 0.7885, 0.9869, 1.1852, -0.1040, 0.0944, 0.2927, 0.4911, 0.6894, 0.8877, 1.0860, -0.2032, -0.0047, 0.1936, 0.3919, 0.5902, 0.7885, 0.9869, 1.1852, 1.0860, 0.9869, 1.1852, 1.0861, 0.9865, 1.1853, 1.0860, 0.9870, 1.1852, 1.0861, -0.2032, -0.0047, 0.1937, 0.3919, 0.5902, 0.7885, 0.9869, 1.1852, -0.1039, 0.0944, 0.2927, 0.4911, 0.6894, 0.8877, 1.0860, -0.2032, -0.0047, 0.1935, 0.3919, 0.5902, 0.7885, 0.9869, 1.1852 </code></pre> <p>and set of 3D points in (x. y. z. x. y. z. x. y. z. ...) form:</p> <pre><code> {{0, 0, 0}, {0, 16, 0}, {0, 32, 0}, {0, 48, 0}, {0, 64, 0}, {0, 80, 0}, {0, 96, 0}, {0, 112,0}, {8, 8, 0}, {8, 24, 0}, {8, 40, 0}, {8, 56, 0}, {8, 72, 0}, {8, 88, 0}, {8, 104, 0}, {16, 0, 0}, {16, 16,0}, {16, 32, 0}, {16, 48, 0}, {16, 64, 0}, {16, 80, 0}, {16, 96, 0}, {16, 112, 0}, {24, 104, 0}, {32, 96, 0}, {32, 112, 0}, {40, 104, 0}, {48, 96, 0}, {48, 112, 0}, {56, 104, 0}, {64, 96, 0}, {64, 112, 0}, {72, 104, 0}, {80, 0, 0}, {80, 16, 0}, {80, 32, 0}, {80,48, 0}, {80, 64, 0}, {80, 80, 0}, {80, 96, 0}, {80, 112, 0}, {88, 8, 0}, {88, 24, 0}, {88, 40, 0}, {88, 56, 0}, {88, 72, 0}, {88, 88, 0}, {88, 104, 0}, {96, 0, 0}, {96, 16, 0}, {96, 32, 0}, {96, 48,0}, {96, 64, 0}, {96, 80, 0}, {96, 96, 0}, {96, 112, 0}} </code></pre> <p>This is kind of an "easy" modelled data with very small rotations.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload