मैं जानता हूँ कि इस सवाल का बहुत पुराना है और i80and इस का जवाब दे एक उत्कृष्ट काम किया है, लेकिन मैं सिर्फ करने के लिए सोचा जोड़ें (भविष्य में एसओ -र्स के लिए) कि अपाचे मैथ के साथ डेरिवेटिव्स या आंशिक डेरिवेटिव्स की गणना करने का एक बहुत आसान तरीका है (इसलिए आपको जैकोबियन मैट्रिक्स के लिए अपना खुद का अंतर नहीं करना है)। यह DerivativeStructure है।
DerivativeStructure वर्ग का उपयोग करने के i80and के जवाब का विस्तार:
//Everything stays the same except for the Jacobian Matrix
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);
}
// Jacobian matrix of the above. In this case, this is just an array of
// partial derivatives of the above function, with one element for each parameter.
public double[] gradient(double t, double... parameters) {
final double a = parameters[0];
final double b = parameters[1];
final double c = parameters[2];
// Jacobian Matrix Edit
// Using Derivative Structures...
// constructor takes 4 arguments - the number of parameters in your
// equation to be differentiated (3 in this case), the order of
// differentiation for the DerivativeStructure, the index of the
// parameter represented by the DS, and the value of the parameter itself
DerivativeStructure aDev = new DerivativeStructure(3, 1, 0, a);
DerivativeStructure bDev = new DerivativeStructure(3, 1, 1, b);
DerivativeStructure cDev = new DerivativeStructure(3, 1, 2, c);
// define the equation to be differentiated using another DerivativeStructure
DerivativeStructure y = aDev.multiply(DerivativeStructure.pow(t, bDev))
.multiply(cDev.negate().multiply(t).exp());
// then return the partial derivatives required
// notice the format, 3 arguments for the method since 3 parameters were
// specified first order derivative of the first parameter, then the second,
// then the third
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>();
// Add points here; for instance,
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));
}
}
और बस हो गया।मुझे पता है कि यह एक बहुत ही जटिल/भ्रमित वर्ग का उपयोग करने के लिए है, लेकिन यह निश्चित रूप से काम में आता है जब आप बहुत ही जटिल समीकरणों से निपट रहे हैं जो हाथ से आंशिक डेरिवेटिव प्राप्त करने में परेशानी होगी (यह मेरे साथ बहुत पहले नहीं हुआ), या जब आप आंशिक डेरिवेटिव प्राप्त करना चाहते हैं तो दूसरे या तीसरे क्रम में कहें।
दूसरा, तीसरा, वगैरह आदेश डेरिवेटिव के मामले में, तुम सब करना होगा:
// specify the required order as the second argument, say second order so 2
DerivativeStructure aDev = new DerivativeStructure(3, 2, 0, a);
DerivativeStructure bDev = new DerivativeStructure(3, 2, 1, b);
DerivativeStructure cDev = new DerivativeStructure(3, 2, 2, c);
// and then specify the order again here
y.getPartialDerivative(2, 0, 0),
y.getPartialDerivative(0, 2, 0),
y.getPartialDerivative(0, 0, 2)
उम्मीद है, यह किसी को कुछ समय मदद करता है।
मैं अंक संग्रह के बारे में उलझन में हूं। क्या उनके पास कोई X_value नहीं है ?? लक्ष्य में केवल वाई-मान क्यों होता है? –
इसके अलावा मैं पैरामीटर पर बाधाओं को कैसे जोड़ूं (उदाहरण के लिए कि f (x) = c * ln (a * x) में पैरामीटर हमेशा सकारात्मक होना चाहिए)? –