Hi!
I think I'm beginning to understand now (thanks to your awesome
explanations). Yes, wow, calculating the derivatives of F(t) wrt to the
parameters isn't that hard. I thought way too complicated, I'm afraid.
Now I'm just unsure about one thing:
>
> [Since the model "F(t)" refers to earlier times, I guess that you'll have
> to create a specific class in order to look up the correct "S", "b" and
> "I".]
>
>
After thinking about it, do you mean I should solve my problem like that:
MultivariateJacobianFunction distanceToCurrentF = new
MultivariateJacobianFunction() {
public Pair<RealVector, RealMatrix> value(final RealVector params) {
Vector3D approx = new Vector3D(params.getEntry(0),
params.getEntry(1), params.getEntry(2)); //get current estimations of
alpha, beta and gamma
RealVector value = new ArrayRealVector(observedValues.length);
RealMatrix jacobian = new
Array2DRowRealMatrix(observedValues.length, 3); // can I even use
Array2DRowRealMatrix if I have 3 columns?
for (int i = 0; i < observedValues.length; ++i) {
Vector o = observedValues[i];
// calculate current values using helper.calculate...();
double modelF = (helper.getCurrentS() +
helper.getCurrentB()) * helper.getCurrentI(i);
value.setEntry(i, modelF);
jacobian.setEntry(i, 0, derivative of dF/dalpha);
jacobian.setEntry(i, 1, derivative of dF/dbeta);
jacobian.setEntry(i, 2, derivative of dF/dgamma);
}
return new Pair<RealVector, RealMatrix>(value, jacobian);
}
};
Is that somehow correct? I'm unsure because in the example were vectors
used for geometrical points and thus, I'm wondering if I can use an
Array2DRowRealMatrix or if I need something else?
And as for the optimization step:
double[] prescribedValues = new double[observedValues.length];
Arrays.fill(prescribedValues, alpha, beta, gamma); // this will not
work, because I cannot use Arrays.fill() with two additional
parameters, what else should I use here? As in: what else can I use to
process my target?
// least squares problem to solve : modeled radius should be close
to target radius
LeastSquaresProblem problem = new LeastSquaresBuilder().
start(new double[] { 0.0, 1.0 } /* I
suppose I cannot add two further double arrays representing beta and
gamma in that way? Do I need a RealVector instead? Like a RealVector
that contains three Real Vector with the boundaries for alpha, beta
and gamma?*/).
model(distancesToCurrentF).
target(prescribedValues).
lazyEvaluation(false).
maxEvaluations(1000).
maxIterations(1000).
build();
LeastSquaresOptimizer.Optimum optimum = new
LevenbergMarquardtOptimizer().optimize(problem);
I hope this gets formatted in a readable way as my posts are somewhat
strangely formatted after submitting them. :P
Thanks again for answering my questions and giving me all that input! It's
highly appreciated.
Best regards
Thom
PS: sorry for my rough English, I'm obviously struggling along with finding
the best/right terms describing mathematical issues. :P