, , i80and , ( SO-), Apache Math ( ). DerivativeStructure.
i80and DerivativeStructure class:
import java.util.*;
import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
import org.apache.commons.math3.fitting.AbstractCurveFitter;
import org.apache.commons.math3.fitting.leastsquares.LeastSquaresBuilder;
import org.apache.commons.math3.fitting.leastsquares.LeastSquaresProblem;
import org.apache.commons.math3.fitting.WeightedObservedPoint;
import org.apache.commons.math3.linear.DiagonalMatrix;
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
class MyFunc implements ParametricUnivariateFunction {
public double value(double t, double... parameters) {
return parameters[0] * Math.pow(t, parameters[1]) * Math.exp(-parameters[2] * t);
}
public double[] gradient(double t, double... parameters) {
final double a = parameters[0];
final double b = parameters[1];
final double c = parameters[2];
DerivativeStructure aDev = new DerivativeStructure(3, 1, 0, a);
DerivativeStructure bDev = new DerivativeStructure(3, 1, 1, b);
DerivativeStructure cDev = new DerivativeStructure(3, 1, 2, c);
DerivativeStructure y = aDev.multiply(DerivativeStructure.pow(t, bDev))
.multiply(cDev.negate().multiply(t).exp());
return new double[] {
y.getPartialDerivative(1, 0, 0),
y.getPartialDerivative(0, 1, 0),
y.getPartialDerivative(0, 0, 1)
};
}
}
public class MyFuncFitter extends AbstractCurveFitter {
protected LeastSquaresProblem getProblem(Collection<WeightedObservedPoint> points) {
final int len = points.size();
final double[] target = new double[len];
final double[] weights = new double[len];
final double[] initialGuess = { 1.0, 1.0, 1.0 };
int i = 0;
for(WeightedObservedPoint point : points) {
target[i] = point.getY();
weights[i] = point.getWeight();
i += 1;
}
final AbstractCurveFitter.TheoreticalValuesFunction model = new
AbstractCurveFitter.TheoreticalValuesFunction(new MyFunc(), points);
return new LeastSquaresBuilder().
maxEvaluations(Integer.MAX_VALUE).
maxIterations(Integer.MAX_VALUE).
start(initialGuess).
target(target).
weight(new DiagonalMatrix(weights)).
model(model.getModelFunction(), model.getModelFunctionJacobian()).
build();
}
public static void main(String[] args) {
MyFuncFitter fitter = new MyFuncFitter();
ArrayList<WeightedObservedPoint> points = new ArrayList<WeightedObservedPoint>();
WeightedObservedPoint point = new WeightedObservedPoint(1.0,
1.0,
1.0);
points.add(point);
final double coeffs[] = fitter.fit(points);
System.out.println(Arrays.toString(coeffs));
}
}
. , / , , , ( ), , .
, .., , , :
DerivativeStructure aDev = new DerivativeStructure(3, 2, 0, a);
DerivativeStructure bDev = new DerivativeStructure(3, 2, 1, b);
DerivativeStructure cDev = new DerivativeStructure(3, 2, 2, c);
y.getPartialDerivative(2, 0, 0),
y.getPartialDerivative(0, 2, 0),
y.getPartialDerivative(0, 0, 2)
, - -.