Gilles, What I gather from the documentation is that the intended purpose is > to track the values of some function and all its derivatives when the > function is defined programmatically (using the usual arithmetical > operators, and generalizations of the functions defined in the "Math" > JDK class). IIUC, one gains automatic access to the derivatives > without defining them analytically (only the function need be defined). >
Yes, the function is defined programmatically. How is "function" defined here? > "function" is a ParameUnivariateFunction instance which implements UnivariateFunction interface with parameters ( https://github.com/meteoinfo/MeteoInfo/blob/master/meteoinfo-math/src/main/java/org/meteoinfo/math/optimize/ParamUnivariateFunction.java). Its is used to wrap the Jython function ( https://github.com/meteoinfo/MeteoInfo/blob/master/meteoinfo-lab/pylib/mipylib/numeric/optimize/minpack.py#L78-L135 ). The test Jython script and result figure from current curve_fit function can be found here: http://www.meteothink.org/downloads/temp/curve_fit-1.png , http://www.meteothink.org/downloads/temp/curve_fit-2.png, http://www.meteothink.org/downloads/temp/curve_fit-3.png. Your code of gradient method (as below) was also tested with good result ( http://www.meteothink.org/downloads/temp/curve_fit-4.png). But of course it can only work for that specific function. public double[] gradient(double x, double ... parameters) { > final double a = parameters[0]; > final double b = parameters[1]; > final double c = parameters[2]; > final double[] grad = new double[3]; > grad[0] = Math.exp(-b * x); > grad[1] = -a * x * grad[0]; > grad[2] = 1; > return grad; > } > Regards Yaqiang On Tue, Aug 2, 2022 at 1:21 AM Gilles Sadowski <gillese...@gmail.com> wrote: > Hello. > > Le lun. 1 août 2022 à 16:03, Yaqiang Wang <yaqiang.w...@gmail.com> a > écrit : > > > > Gilles, > > > > Thanks so much for your patiently response! I know I can write a gradient > > method for a specific function, but my purpose is to make the gradient > > method suitable for any function of yi = f(xi, p1, p2, p3, ...). That > means > > the users don't need to override a new fixed gradient method for a new > > function, just like the SciPy's curve_fit ( > > > https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html > ). > > So I tried to calculate gradient array through numerical differentiation > ( > > > https://github.com/meteoinfo/MeteoInfo/blob/master/meteoinfo-math/src/main/java/org/meteoinfo/math/optimize/MyParametricUnivariateFunction.java#L33-L56 > , > > the code also is attache below), and please let me know whether the code > is > > correct for my purpose? Thanks! > > I'm still confused about your use case (maybe because I did not see > the figures of what you expect vs what you got). > > I've never used the "DerivativeStructure" (and I've just noticed that the > link to the reference document is not accessible anymore). > > What I gather from the documentation is that the intended purpose is > to track the values of some function and all its derivatives when the > function is defined programmatically (using the usual arithmetical > operators, and generalizations of the functions defined in the "Math" > JDK class). IIUC, one gains automatic access to the derivatives > without defining them analytically (only the function need be defined). > > > > > @Override > > public double[] gradient(double v, double... parameters) { > > function.setParameters(parameters); > > How is "function" defined here? > > > > > // create a differentiator > > FiniteDifferencesDifferentiator differentiator = > > new FiniteDifferencesDifferentiator(nbPoints, stepSize); > > If you assume that "function" is defined analytically, you don't need to > use "FiniteDifferentiator" (moreover, its use is not recomended IIUC > the documentation). > However, if the derivatives cannot be expressed analytically, it seems > that "DerivativeStructure" is an overly complex utility if in the end, it's > just replacing the finite differences formulae[1] which you can write in > about the same number lines as your code below. > > Regards, > Gilles > > [1] https://en.wikipedia.org/wiki/Numerical_differentiation > > > > > // create a new function that computes both the value and the > derivatives > > // using DerivativeStructure > > UnivariateDifferentiableFunction diffFunc = > > differentiator.differentiate(function); > > > > double y = function.value(v); > > int n = parameters.length; > > double[] gradients = new double[n]; > > for (int i = 0; i < n; i++) { > > DerivativeStructure xDS = new DerivativeStructure(n, 1, i, > > parameters[i]); > > DerivativeStructure yDS = diffFunc.value(xDS); > > int[] idx = new int[n]; > > idx[i] = 1; > > gradients[i] = yDS.getPartialDerivative(idx); > > } > > > > return gradients; > > } > > > > > > By the way, I am using Apache commons math 3.6.1 at present. Today I also > > tried the 4.0-SNAPSHOT version but the result is the same. > > > > Regards > > Yaqiang > > > >>> [...] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@commons.apache.org > For additional commands, e-mail: user-h...@commons.apache.org > > -- ************************************************* Dr. Yaqiang Wang Chinese Academy of Meteorological Sciences (CAMS) 46, Zhong-Guan-Cun South Avenue Beijing, 100081 China yaqiang.w...@gmail.com www.meteothink.org **************************************************