Unfortunately, I can not figure out how to calculate partial gradients using DerivativeStructure, so I used a simple way to calculate the gradients of the parameters ( https://github.com/meteoinfo/MeteoInfo/blob/9586b1a850721e418370a8a3d90af1e8fea03674/meteoinfo-math/src/main/java/org/meteoinfo/math/optimize/MyParametricUnivariateFunction.java). The result looks reasonable: http://www.meteothink.org/downloads/temp/curve_fit.png.
Regards Yaqiang On Tue, Aug 2, 2022 at 7:34 PM Gilles Sadowski <gillese...@gmail.com> wrote: > Hello. > > Le mar. 2 août 2022 à 10:42, Yaqiang Wang <yaqiang.w...@gmail.com> a > écrit : > > > > 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. > > Perhaps have a look at > > https://commons.apache.org/proper/commons-math/commons-math4-legacy/apidocs/org/apache/commons/math4/legacy/analysis/differentiation/GradientFunction.html > The associated unit test could also help figure out how to use > "DerivativeStructure": > > https://commons.apache.org/proper/commons-math/commons-math4-legacy/xref-test/org/apache/commons/math4/legacy/analysis/differentiation/GradientFunctionTest.html > > > > > 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. > > Sure, but I still can't figure out where the problem is: Do you want to > implement the fitting using numerical derivatives because the gradient > cannot be expressed simply, or just to save one input (the equivalent > of the code below)? > In the latter case, I believe that "DerivativeStructure" could do it. But > so should it, with a package that performs symbolic differentiation (?). > > > 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, > Gilles > > P.S. If you succeed in framing the solution to your problem with > "DrivativeStructure", > we are interested in documenting it in "SimpleCurveFitter". > > >>> [...] > > --------------------------------------------------------------------- > 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 **************************************************