>> I didn't expect to have to use weights for this calculation, is there
>> a way to define the weights properly (for dummies like me)?
>
> The weights are mainly used as relatively to each other, if some points
> are considered to be more accurate than others. Typically, each point
> should have a weight related to the variance of the error for the point,
> or to the unit of the measurements (for example when mixing distances
> and angles in the residuals, which is not your case).
>
> If all your points are measured in the same way, they all have the same
> variance and hence they should share the same weight. Then, as the
> meaning of the weight is only relative, if they all have the same weight
> you may well use simply 1.0 as the global weight for everyone.
That all makes perfectly sense, thank you very much!
Best regards,
Andrea
>
> best regards,
> Luc
>
>>
>> Thanks,
>> Andrea
>>
>>
>>
>>
>> On Fri, Dec 6, 2013 at 10:58 AM, Luc Maisonobe <luc@spaceroots.org> wrote:
>>> Hi Andrea,
>>>
>>> Le 06/12/2013 10:02, andrea antonello a écrit :
>>>> Hi Ted,
>>>> thanks for the reply.
>>>>
>>>>> How would you like to handle the fact that you may have an infinite number
>>>>> of solutions? Will you be happy with any of them? Or do you somehow
want
>>>>> to find all of them?
>>>>
>>>> I am afraid my math knowledge goes only to a certain point here (too
>>>> few it seems).
>>>> In my usecase I am trying to define a terrain model from sparse points
>>>> (lidar elevation points).
>>>> So my idea was to get a set of points (given X, Y, Z) to define the
>>>> parameters of the equation and then be able to calculate an elevation
>>>> (Z) for any position I need interpolated.
>>>>
>>>> I would then expect to have an exact value once the parameters are defined.
>>>>
>>>> I am not sure how to find the parameters though...
>>>
>>> For this use case, I would suggest to use any kind of multivariate
>>> optimizer. Your Z variable is linear in 6 unknown parameters (a, b, c,
>>> d, e and f). What you want is find values for these 6 parameters such
>>> that the quadratic sum of residuals is minimum, i.e. you want to minimize:
>>>
>>> sum (Z_i  Z(X_i, Y_i))^2
>>>
>>> Where X_i, Y_i, Z_i are the coordinates for point i and Z(X_i, Y_i) is
>>> the theoretical value from you model equation, which depends on the 6
>>> parameters.
>>>
>>> As Z is linear in the 6 parameters, the sum above is quadratic, so your
>>> problem is a least squares problem. Take a look at the
>>> fitting.leastsquares package. You have the choice among two solvers
>>> there: GaussNewton and LevenbergMarquardt. As you problem is simple
>>> (linear Z), both should give almost immediate convergence, pick up one
>>> as you want. Start with something roughly along this line (of course,
>>> you should change the convergence threshold to something meaningful for
>>> your data):
>>>
>>> // your points
>>> final double[] xArray = ...;
>>> final double[] yArray = ...;
>>> final double[] zArray = ...;
>>>
>>> // start values for a, b, c, d, e, f, all set to 0.0
>>> double[] initialGuess = new double[6];
>>>
>>> // model: this computes the theoretical z values, given a current
>>> // estimate for the parameters a, b, c ...
>>> MultivariateVectorFunction model =
>>> new MultivariateVectorFunction() {
>>> double[] value(double[] parameters) {
>>> double[] computedZ = new double[zArray.length];
>>> for (int i = 0; i < computedZ.length; ++i) {
>>> double x = xArray[i];
>>> double y = yArray[i];
>>> computedZ[i] = parameter[0] * x * x +
>>> parameter[1] * y * y +
>>> parameter[2] * x * y +
>>> parameter[3] * x +
>>> parameter[4] * y +
>>> parameter[5];
>>> }
>>> return computedZ;
>>> }
>>> };
>>>
>>> // jacobian: this computes the Jacobian of the model
>>> MultivariateMatrixFunction jacobian =
>>> new MultivariateMatrixFunction() {
>>> double[][] value(double[] parameters) {
>>> double[][] jacobian =
>>> new double[zArray.length][parameters.length];
>>> for (int i = 0; i < computedZ.length; ++i) {
>>> double x = xArray[i];
>>> double y = yArray[i];
>>> jacobian[i][0] = x * x;
>>> jacobian[i][1] = y * y;
>>> jacobian[i][2] = x * y;
>>> jacobian[i][3] = x;
>>> jacobian[i][4] = y;
>>> jacobian[i][5] = 1;
>>> }
>>> return jacobian;
>>> }
>>> };
>>>
>>> // convergence checker
>>> ConvergenceChecker<PointVectorValuePair> checker =
>>> new SimpleVectorValueChecker(1.0e6, 1.0e10);
>>>
>>> // configure optimizer
>>> LevenbergMarquardtOptimizer optimizer =
>>> new LevenbergMarquardtOptimizer().
>>> withModelAndJacobian(model, jacobian).
>>> withTarget(zArray).
>>> withStartPoint(initialGuess).
>>> withConvergenceChecker(checker);
>>>
>>> // perform fitting
>>> PointVectorValuePair result = optimizer.optimize();
>>>
>>> // extract parameters
>>> double[] parameters = result.getPoint();
>>>
>>>
>>> BEware I just wrote the previous code in the mail, it certainly has
>>> syntax errors and missing parts, it should only be seen as a skeleton.
>>>
>>> best regards,
>>> Luc
>>>
>>>
>>>>
>>>> Cheers,
>>>> Andrea
>>>>
>>>>
>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Thu, Dec 5, 2013 at 5:31 AM, andrea antonello <andrea.antonello@gmail.com
>>>>>> wrote:
>>>>>
>>>>>> Hi, I need a hint about how to solve an equation of the type:
>>>>>> Z = aX^2 + bY^2 + cXY + dX + eY + f
>>>>>>
>>>>>> Is an example that handles such a case available? A testcase code
maybe?
>>>>>>
>>>>>> Thanks for any hint,
>>>>>> Andrea
>>>>>>
>>>>>> PS: is there a way to search the mailinglist for topics? I wasn't
able
>>>>>> to check if this had already been asked.
>>>>>>
>>>>>> 
>>>>>> To unsubscribe, email: userunsubscribe@commons.apache.org
>>>>>> For additional commands, email: userhelp@commons.apache.org
>>>>>>
>>>>>>
>>>>
>>>> 
>>>> To unsubscribe, email: userunsubscribe@commons.apache.org
>>>> For additional commands, email: userhelp@commons.apache.org
>>>>
>>>>
>>>
>>>
>>> 
>>> To unsubscribe, email: userunsubscribe@commons.apache.org
>>> For additional commands, email: userhelp@commons.apache.org
>>>
>>
>> 
>> To unsubscribe, email: userunsubscribe@commons.apache.org
>> For additional commands, email: userhelp@commons.apache.org
>>
>>
>>
>
>
> 
> To unsubscribe, email: userunsubscribe@commons.apache.org
> For additional commands, email: userhelp@commons.apache.org
>

To unsubscribe, email: userunsubscribe@commons.apache.org
For additional commands, email: userhelp@commons.apache.org
