BTW Luc. This derivatives structure is simply a godsent for big optimization problems.
Cheers, -Ajo. On Wed, Aug 28, 2013 at 11:13 AM, Ajo Fod <ajo....@gmail.com> wrote: > That works very well. > > I missed the default value of 0 earlier > > Thanks, > -Ajo > > > On Wed, Aug 28, 2013 at 11:05 AM, Luc Maisonobe <luc.maison...@free.fr>wrote: > >> Le 28/08/2013 19:59, Ajo Fod a écrit : >> > Its a=0 that bothers me. x > 0 in my case. >> >> Then everything should be OK with the current code, which reads: >> >> final double[] function = new double[1 + order]; >> if (a == 0) { >> if (operand[operandOffset] == 0) { >> function[0] = 1; >> double infinity = Double.POSITIVE_INFINITY; >> for (int i = 1; i < function.length; ++i) { >> infinity = -infinity; >> function[i] = infinity; >> } >> } else if (operand[operandOffset] < 0) { >> Arrays.fill(function, Double.NaN); >> } >> } else { >> function[0] = FastMath.pow(a, operand[operandOffset]); >> final double lnA = FastMath.log(a); >> for (int i = 1; i < function.length; ++i) { >> function[i] = lnA * function[i - 1]; >> } >> } >> >> So when a == 0 and operand[operandOffset] > 0, you don't enter in any of >> the branches above (you enter the top level if, but don't enter any of >> the second level if/else if). This means that you skip directly from the >> allocation of the array function to its use, and hence you have the >> default values of a newly allocated array, which is guaranteed to be 0. >> >> Does this fits your needs? >> >> Luc >> >> > >> > In the code I use, the DerivativeStructure evaluates to NaN for a=0 >> when x >> >> 0 . I think we agree that in this condition the derivative should >> > evaluate to 0. >> > >> > Perhaps I wrote something to mislead you on this detail. >> > >> > -Ajo >> > >> > >> > On Wed, Aug 28, 2013 at 10:36 AM, Luc Maisonobe <luc.maison...@free.fr >> >wrote: >> > >> >> Hi Ajo, >> >> >> >> Le 28/08/2013 16:56, Ajo Fod a écrit : >> >>> To define things precisely: >> >>> y = f(a,x) = |a|^x >> >>> >> >>> Can we agree that: >> >>> df(a,x)/dx -> 0 when a->0 and x > 0 :[ NOTE: x > 0] >> >> >> >> Yes, of course, it is perfectly true. >> >> >> >>> >> >>> If this is acceptable, we get this very useful property that df >> (a,x)/dx >> >> is >> >>> defined and continuous for all a provided x>0 because we use the >> modulus >> >> of >> >>> a in the function definition. >> >> >> >> Yes, as long as we don't have x = 0, we remain in a smooth, >> indefinitely >> >> differentiable domain. >> >> >> >>> In optimization, with this patch at |a|=0, I >> >>> can set an optimizer to search the whole real line without worrying >> about >> >>> a=0 otherwise I've to look out for a=0 explicitly. It seems >> unnecessary >> >> to >> >>> add a constraint to make |a|>0. I already have a constraint for x >0. >> >> >> >> I don't understand what you mean here. If you already know that x > 0, >> >> then you don't have to worry about a=0 or a>0 since in this case both >> >> approaches lead to the same result. >> >> >> >> If you look at the graph for df(a,x)/dx for a few values of a, you will >> >> see that we have: >> >> >> >> lim a->0+ df(a,x)/dx = 0 for x > 0 >> >> lim a->0+ df(a,x)/dx = -infinity for x = 0 >> >> >> >> and this despite df(a,x)/dx = ln(a) a^x is a continuous function, >> >> indefinitely differentiable. The limit of a continuous indefinitely >> >> differentiable function may be a non continuous function. It is a >> >> counter-intuitive result, I agree, but thre are many other examples of >> >> such strange behaviour in mathematics (if I remember well, Fourier >> >> transforms of step function exhibit the same paroble, backward). >> >> >> >> If you have x>0, you are already on the safe side of the singularity, >> so >> >> this is were I lose your tracks and don't understand how the singular >> >> point x=0 bothers you. >> >> >> >> best regards, >> >> Luc >> >> >> >>> >> >>> Cheers, >> >>> Ajo. >> >>> >> >>> >> >>> >> >>> On Tue, Aug 27, 2013 at 1:49 PM, Luc Maisonobe <luc.maison...@free.fr >> >>> wrote: >> >>> >> >>>> Hi Ajo, >> >>>> >> >>>> Le 27/08/2013 16:44, Ajo Fod a écrit : >> >>>>> Thanks for the constant structure. >> >>>>> >> >>>>> No. The limit value when x->0+ is 1, not O. >> >>>>> >> >>>>> I agree with this. I was just going for the derivatives = 0. >> >>>>> >> >>>>> >> >>>>>> The nth derivative of a^x can be computed analytically as ln(a)^n >> a^x, >> >>>>>> so the initial slope at x=0 is simply ln(a), positive for a > 1, >> zero >> >>>>>> for a = 1, negative for 0 < a < 1 with a limit at -inifnity when a >> -> >> >>>> 0+. >> >>>>>> >> >>>>> >> >>>>> Lets think about this for a sec: >> >>>>> Derivative of |a|^x wrt x at x=2.0 for various values of a >> >>>>> Derivative@0.031250=-0.003384 >> >>>>> Derivative@0.015625=-0.001015 >> >>>>> Derivative@0.007813=-0.000296 >> >>>>> Derivative@0.003906=-0.000085 >> >>>>> Derivative@0.001953=-0.000024 >> >>>>> ... tends to 0 >> >>>> >> >>>> yes, because 2.0 > 0. >> >>>> >> >>>>> >> >>>>> Derivative of |a|^x wrt x at x=0.5 for various values of a >> >>>>> Derivative@0.031250=-0.612555 >> >>>>> Derivative@0.007813=-0.428759 >> >>>>> Derivative@0.001953=-0.275612 >> >>>>> Derivative@0.000488=-0.168418 >> >>>>> Derivative@0.000122=-0.099513 >> >>>>> Derivative@0.000031=-0.057407 >> >>>>> Derivative@0.000008=-0.032528 >> >>>>> Derivative@0.000002=-0.018176 >> >>>>> ... tends to 0 when a->0 >> >>>> >> >>>> yes because 0.5 > 0. >> >>>> >> >>>>> >> >>>>> The code I used for the print outs is: >> >>>>> static final double EPS = 0.0001d; >> >>>>> >> >>>>> public static void main(final String[] args) { >> >>>>> final double x = 0.5d; >> >>>>> int from = 5; >> >>>>> int to = 20; >> >>>>> System.out.println("Derivative of |a|^x wrt x at x=" + x); >> >>>>> for (int p = from; p < to; p+=2) { >> >>>>> double a = Math.pow(2d, -p); >> >>>>> final double calc = (Math.pow(a, x + EPS) - Math.pow(a, >> >> x)) / >> >>>>> EPS; >> >>>>> System.out.format("Derivative@%f=%f \n", a, calc); >> >>>>> } >> >>>>> } >> >>>>> >> >>>>> As for the x=0 case: >> >>>>> 1^0 = 1 >> >>>>> 0.5^0 = 1 >> >>>>> 0.0001^0 = 1 >> >>>>> 0^0 is technically undefined, but 1 is a good definition: >> >>>>> http://www.math.hmc.edu/funfacts/ffiles/10005.3-5.shtml >> >>>> >> >>>> Yes. >> >>>> >> >>>>> ... so, a good value for the differential of da^x/dx limit x->0 and >> >>>> a->0 = >> >>>>> 0 >> >>>> >> >>>> I don't agree. What you wrote in the lines above is another way to >> say >> >>>> what I wrote in my previous message: the value at x=0 is always y=1, >> and >> >>>> the value for x > 0 tends to 0 as a->0+. >> >>>> >> >>>> So the function always starts at 1 and dives more and more steeply >> as a >> >>>> becomes smaller, and the derivative at 0 becomes more and more >> negative, >> >>>> up to -infinity, *not* 0. >> >>>> >> >>>> The function is ill-behaved and the fact the derivative is infinite >> is >> >>>> consistent with this ill-behaviour. >> >>>> >> >>>> The definition of the derivative is : >> >>>> >> >>>> f'(x) = lim (f(x+h) - f(x))/h when h -> 0+ >> >>>> >> >>>> when f(x) = 0^x and assuming 0^0 = 1 as you have agreed above, this >> >> gives: >> >>>> >> >>>> f'(0) = lim (0^(0+h) - 0^0)/h = lim (0 - 1)/h = -infinity >> >>>> >> >>>> which is exactly the same result as computing for a non-null a and >> then >> >>>> reducing it: d(a^x)/dx = ln(a) a^x = ln(a) when x=0, diverges to >> >>>> -infinity when a converges to 0. >> >>>> >> >>>>> >> >>>>> >> >>>>> As mentioned earlier, I think the cause for this is that log|a| -> >> >>>> infinity >> >>>>> slower than |a|^x -> 0 as |a|->0 . >> >>>> >> >>>> But a^x does *not* converge to 0 for x = 0! a^0 is always 1 >> (rigorously) >> >>>> regardless of the value of a as long as it is not 0, and then when we >> >>>> change a we can also consider the limit is 1 when a-> 0. This >> convention >> >>>> is well accepted. This convention is implemented in the Java standard >> >>>> Math.pow function, and we followed this trend. This is the reason why >> >>>> the functions becomes more and more steep as a becomes smaller. At >> the >> >>>> end, it is a discontinuous function (and hence should not be >> >>>> differentiable, or it is differentiable only if we use extended real >> >>>> numbers with infinity added). >> >>>> >> >>>> This is the heart of the ill-behaviour of 0^0. We want to compute it >> as >> >>>> a limit value for a^b when both parameters converge to 0, but we get >> a >> >>>> different result if we first set a fixed and converge b to 0, and >> later >> >>>> reduce a down to zero (your approach), and when we do the opposite. >> In >> >>>> one case we get 0, in the other case we get 1. >> >>>> >> >>>> Lets put it another way: >> >>>> If we consider the derivative f'(0) should be 0, then the value f(0) >> >>>> should also be considered equal to zero. This would mean as soon as >> we >> >>>> get a tiny non-zero a (say the smallest number that can be >> represented >> >>>> as a double), then f(0) would jump from 0 to 1 instantly, and f'(0) >> >>>> would jump from 0 to -infinity instantly. So we would have at a = 0 >> an >> >>>> initial null derivative, then a jump to a very negative derivative >> as a >> >>>> leaves 0, then the derivative would become less and less negative as >> a >> >>>> increase up to 1, at a=1 the derivative would again be 0, then the >> >>>> derivative would continue to increase and becode positive as a grows >> >>>> larger than 1 (all these derivatives are computed at x=0, and as >> written >> >>>> previously, they are simply equal to log(a)). >> >>>> >> >>>> To summarize, the two choices are: >> >>>> 1) - first considering a fixed a, strictly positive, >> >>>> - then looking globally at the function a^x for all values x>=0, >> >>>> - then reducing a, noting that all functions start at the same >> >>>> point x=0, y=1 and the derivatives become more and more >> negative >> >>>> as the function becomes more and more ill-behaved >> >>>> 2) - first considering a fixed x, strictly positive, >> >>>> - then reducing a and identifying the limit values is 0 for all >> a, >> >>>> - then building a function by packing all the x>0, which is very >> >>>> smooth as it is identically 0 for all x>0 >> >>>> - finally adding the limit value at x=0, which in this case would >> >>>> be 0 (and the derivative would also be 0). >> >>>> >> >>>> it seems well accepted to consider the value of 0^0 should be set to >> 1, >> >>>> and as a consequence the corresponding derivative with respect to x >> >>>> should be set to -infinity. >> >>>> >> >>>> I fully agree it is not a perfect solution, it is an arbitrary >> choice. >> >>>> However, this choice is consistent with what all implementations of >> the >> >>>> pow function I have seen (i.e. 0^0 set to 1 instead of 0). >> >>>> >> >>>> Your approach is not wrong, it is as valid as the other one. It is >> >>>> simply not the common choice. >> >>>> >> >>>> I would say an even better choice would have been to say 0^0 *is not* >> >>>> defined and even the value should be set to NaN (not even speaking of >> >>>> the derivative). >> >>>> >> >>>> Does this seem acceptable to you? >> >>>> >> >>>> best regards, >> >>>> Luc >> >>>> >> >>>>> >> >>>>> Cheers, >> >>>>> Ajo. >> >>>>> >> >>>>> >> >>>>>> The limit curve corresponding to a = 0 is therefore a singular >> >> function >> >>>>>> with f(0) = 1 and f(x) = 0 for all x > 0. The fact f(0) = 1 and >> not 0 >> >> is >> >>>>>> consistent with the derivative being negative infinity, as by >> >> definition >> >>>>>> the derivative is the limit of [f(0+h) - f(0)] / h when h->0+, as >> the >> >>>>>> finite difference is -1/h. >> >>>>>> >> >>>>>>> } >> >>>>>>> }else{ >> >>>>>>> for (int i = 0; i < function.length; ++i) { >> >>>>>>> function[i] = Double.NaN; >> >>>>>>> } >> >>>>>> >> >>>>>> This alternative case is a good improvement, thanks for it. I >> forgot >> >> to >> >>>>>> handle negative cases properly. I have therefore changed the code >> >>>>>> (committed as r1517788) with this improvement, together with >> several >> >>>>>> test cases. >> >>>>>> >> >>>>>>> } >> >>>>>>> } else { >> >>>>>>> >> >>>>>>> >> >>>>>>> in place of : >> >>>>>>> >> >>>>>>> if (a == 0) { >> >>>>>>> if (operand[operandOffset] == 0) { >> >>>>>>> function[0] = 1; >> >>>>>>> double infinity = Double.POSITIVE_INFINITY; >> >>>>>>> for (int i = 1; i < function.length; ++i) { >> >>>>>>> infinity = -infinity; >> >>>>>>> function[i] = infinity; >> >>>>>>> } >> >>>>>>> } >> >>>>>>> } else { >> >>>>>>> >> >>>>>>> >> >>>>>>> PS: I think you made a change to DSCompiler.pow too. If so, what >> >>>> happens >> >>>>>>> when a=0 & x!=0 in that function? >> >>>>>> >> >>>>>> No, I didn't change the other signatures of the pow function. So >> the >> >>>>>> value should be OK (i.e. 1) but all derivatives, including the >> first >> >>>>>> one, should be NaN. What the new function brings is a correct >> negetive >> >>>>>> infinity first derivative at singularity point, better accuracy for >> >>>>>> non-singular points, and possibly faster computation. >> >>>>>> >> >>>>>> best regards, >> >>>>>> Luc >> >>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> On Mon, Aug 26, 2013 at 12:38 AM, Luc Maisonobe < >> l...@spaceroots.org> >> >>>>>> wrote: >> >>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> Ajo Fod <ajo....@gmail.com> a écrit : >> >>>>>>>>> Are you saying patched the code? Can you provide the link? >> >>>>>>>> >> >>>>>>>> I committed it in the development version. You just have to >> update >> >>>> your >> >>>>>>>> checked out copy from either the official >> >>>>>>>> Apache subversion repository or the git mirror we talked about >> in a >> >>>>>>>> previous thread. >> >>>>>>>> >> >>>>>>>> The new method is a static one called pow and taking a and x as >> >>>>>> arguments >> >>>>>>>> and returning a^x. Not to >> >>>>>>>> Be confused with the non-static methods that take only the power >> as >> >>>>>>>> argument (either int, double or >> >>>>>>>> DerivativeStructure) and use the instance as the base to apply >> power >> >>>> on. >> >>>>>>>> >> >>>>>>>> Best regards, >> >>>>>>>> Luc >> >>>>>>>> >> >>>>>>>>> >> >>>>>>>>> -Ajo >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> On Sun, Aug 25, 2013 at 1:20 PM, Luc Maisonobe < >> l...@spaceroots.org >> >>> >> >>>>>>>>> wrote: >> >>>>>>>>> >> >>>>>>>>>> Le 24/08/2013 11:24, Luc Maisonobe a écrit : >> >>>>>>>>>>> Le 23/08/2013 19:20, Ajo Fod a écrit : >> >>>>>>>>>>>> Hello, >> >>>>>>>>>>> >> >>>>>>>>>>> Hi Ajo, >> >>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> This shows one way of interpreting the derivative for >> strictly >> >> +ve >> >>>>>>>>>> numbers. >> >>>>>>>>>>>> >> >>>>>>>>>>>> public static void main(final String[] args) { >> >>>>>>>>>>>> final double x = 1d; >> >>>>>>>>>>>> DerivativeStructure dsA = new DerivativeStructure(1, >> 1, >> >> 0, >> >>>>>>>>> x); >> >>>>>>>>>>>> System.out.println("Derivative of |a|^x wrt x"); >> >>>>>>>>>>>> for (int p = 10; p < 21; p++) { >> >>>>>>>>>>>> double a; >> >>>>>>>>>>>> if (p < 20) { >> >>>>>>>>>>>> a = 1d / Math.pow(2d, p); >> >>>>>>>>>>>> } else { >> >>>>>>>>>>>> a = 0d; >> >>>>>>>>>>>> } >> >>>>>>>>>>>> final DerivativeStructure a_ds = new >> >>>>>>>>> DerivativeStructure(1, >> >>>>>>>>>> 1, >> >>>>>>>>>>>> a); >> >>>>>>>>>>>> final DerivativeStructure out = a_ds.pow(dsA); >> >>>>>>>>>>>> final double calc = (Math.pow(a, x + EPS) - >> >>>>>>>>> Math.pow(a, x)) >> >>>>>>>>>> / >> >>>>>>>>>>>> EPS; >> >>>>>>>>>>>> System.out.format("Derivative@%f=%f %f\n", a, >> >> calc, >> >>>>>>>>>>>> out.getPartialDerivative(new int[]{1})); >> >>>>>>>>>>>> } >> >>>>>>>>>>>> } >> >>>>>>>>>>>> >> >>>>>>>>>>>> At this point I"m explicitly substituting the rule that >> >>>>>>>>>> derivative(|a|^x) = >> >>>>>>>>>>>> 0 for |a|=0. >> >>>>>>>>>>> >> >>>>>>>>>>> Yes, but this fails for x = 0, as the limit of the finite >> >>>>>>>>> difference is >> >>>>>>>>>>> -infinity and not 0. >> >>>>>>>>>>> >> >>>>>>>>>>> You can build your own function which explicitly assumes a is >> >>>>>>>>> constant >> >>>>>>>>>>> and takes care of special values as follows: >> >>>>>>>>>>> >> >>>>>>>>>>> public static DerivativeStructure aToX(final double a, >> >>>>>>>>>>> final >> DerivativeStructure >> >>>>>>>>> x) { >> >>>>>>>>>>> final double lnA = (a == 0 && x.getValue() == 0) ? >> >>>>>>>>>>> Double.NEGATIVE_INFINITY : >> >>>>>>>>>>> FastMath.log(a); >> >>>>>>>>>>> final double[] function = new double[1 + x.getOrder()]; >> >>>>>>>>>>> function[0] = FastMath.pow(a, x.getValue()); >> >>>>>>>>>>> for (int i = 1; i < function.length; ++i) { >> >>>>>>>>>>> function[i] = lnA * function[i - 1]; >> >>>>>>>>>>> } >> >>>>>>>>>>> return x.compose(function); >> >>>>>>>>>>> } >> >>>>>>>>>>> >> >>>>>>>>>>> This will work and provides derivatives to any order for >> almost >> >> any >> >>>>>>>>>>> values of a and x, including a=0, x=1 as in your exemple, but >> >> also >> >>>>>>>>>>> slightly better for a=0, x=0. However, it still has an >> important >> >>>>>>>>>>> drawback: it won't compute the n-th order derivative correctly >> >> for >> >>>>>>>>> a=0, >> >>>>>>>>>>> x=0 and n > 1. It will provide NaN for these higher order >> >>>>>>>>> derivatives >> >>>>>>>>>>> instead of +/-infinity according to parity of n. >> >>>>>>>>>> >> >>>>>>>>>> I have added a similar function to the DerivativeStructure >> class >> >>>>>>>>> (with >> >>>>>>>>>> some errors above corrected). The main interesting property of >> >> this >> >>>>>>>>>> function is that it is more accurate that converting a to a >> >>>>>>>>>> DerivativeStructure and using the general x^y function. It does >> >> its >> >>>>>>>>> best >> >>>>>>>>>> to handle the special case, but as written above, this does NOT >> >> work >> >>>>>>>>> for >> >>>>>>>>>> general combination (i.e. more than one variable or more than >> one >> >>>>>>>>>> order). As soon as there is a combination, the derivative will >> >>>>>>>>> involve >> >>>>>>>>>> something like df/dx * dg/dy and as infinities and zeros are >> >>>>>>>>> everywheren >> >>>>>>>>>> NaN appears immediately for these partial derivatives. This >> cannot >> >>>> be >> >>>>>>>>>> avoided. >> >>>>>>>>>> >> >>>>>>>>>> If you stay away from the singularity, the function behaves >> >>>>>>>>> correctly. >> >>>>>>>>>> >> >>>>>>>>>> best regards, >> >>>>>>>>>> Luc >> >>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> This is a known problem that we already encountered when >> dealing >> >>>>>>>>> with >> >>>>>>>>>>> rootN. Here is an extract of a comment in the test case >> >>>>>>>>>>> testRootNSingularity, where similar NaN appears instead of +/- >> >>>>>>>>> infinity. >> >>>>>>>>>>> The dsZero instance in the comment is simple the x parameter >> of >> >> the >> >>>>>>>>>>> function, as a derivativeStructure with value 0.0 and >> depending >> >> on >> >>>>>>>>>>> itself (dsZero = new DerivativeStructure(1, maxOrder, 0, >> 0.0)): >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> // the following checks shows a LIMITATION of the current >> >>>>>>>>> implementation >> >>>>>>>>>>> // we have no way to tell dsZero is a pure linear variable x >> = 0 >> >>>>>>>>>>> // we only say: "dsZero is a structure with value = 0.0, >> >>>>>>>>>>> // first derivative = 1.0, second and higher derivatives = >> 0.0". >> >>>>>>>>>>> // Function composition rule for second derivatives is: >> >>>>>>>>>>> // d2[f(g(x))]/dx2 = f''(g(x)) * [g'(x)]^2 + f'(g(x)) * g''(x) >> >>>>>>>>>>> // when function f is the nth root and x = 0 we have: >> >>>>>>>>>>> // f(0) = 0, f'(0) = +infinity, f''(0) = -infinity (and higher >> >>>>>>>>>>> // derivatives keep switching between +infinity and -infinity) >> >>>>>>>>>>> // so given that in our case dsZero represents g, we have >> g(x) = >> >> 0, >> >>>>>>>>>>> // g'(x) = 1 and g''(x) = 0 >> >>>>>>>>>>> // applying the composition rules gives: >> >>>>>>>>>>> // d2[f(g(x))]/dx2 = f''(g(x)) * [g'(x)]^2 + f'(g(x)) * g''(x) >> >>>>>>>>>>> // = -infinity * 1^2 + +infinity * 0 >> >>>>>>>>>>> // = -infinity + NaN >> >>>>>>>>>>> // = NaN >> >>>>>>>>>>> // if we knew dsZero is really the x variable and not the >> >> identity >> >>>>>>>>>>> // function applied to x, we would not have computed f'(g(x)) >> * >> >>>>>>>>> g''(x) >> >>>>>>>>>>> // and we would have found that the result was -infinity and >> not >> >>>>>>>>> NaN >> >>>>>>>>>>> >> >>>>>>>>>>> Hope this helps >> >>>>>>>>>>> Luc >> >>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> Thanks, >> >>>>>>>>>>>> Ajo. >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> On Fri, Aug 23, 2013 at 9:39 AM, Luc Maisonobe >> >>>>>>>>> <luc.maison...@free.fr >> >>>>>>>>>>> wrote: >> >>>>>>>>>>>> >> >>>>>>>>>>>>> Hi Ajo, >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Le 23/08/2013 17:48, Ajo Fod a écrit : >> >>>>>>>>>>>>>> Try this and I'm happy to explain if necessary: >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> public class Derivative { >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> public static void main(final String[] args) { >> >>>>>>>>>>>>>> DerivativeStructure dsA = new >> DerivativeStructure(1, >> >> 1, >> >>>>>>>>> 0, >> >>>>>>>>>> 1d); >> >>>>>>>>>>>>>> System.out.println("Derivative of constant^x wrt >> x"); >> >>>>>>>>>>>>>> for (int a = -3; a < 3; a++) { >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> We have chosen the classical definition which implies c^x is >> >> not >> >>>>>>>>>> defined >> >>>>>>>>>>>>> for real r and negative c. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Our implementation is based on the decomposition c^r = >> exp(r * >> >>>>>>>>> ln(c)), >> >>>>>>>>>>>>> so the NaN comes from the logarithm when c <= 0. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Noe also that as explained in the documentation here: >> >>>>>>>>>>>>> < >> >>>>>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>> >> >>>>>>>> >> >>>>>> >> >>>> >> >> >> http://commons.apache.org/proper/commons-math/userguide/analysis.html#a4.7_Differentiation >> >>>>>>>>>>>>>> , >> >>>>>>>>>>>>> there are no concepts of "constants" and "variables" in this >> >>>>>>>>> framework, >> >>>>>>>>>>>>> so we cannot draw a line between c^r as seen as a univariate >> >>>>>>>>> function >> >>>>>>>>>> of >> >>>>>>>>>>>>> r, or as a univariate function of c, or as a bivariate >> function >> >>>>>>>>> of c >> >>>>>>>>>> and >> >>>>>>>>>>>>> r, or even as a pentavariate function of p1, p2, p3, p4, p5 >> >> with >> >>>>>>>>> both c >> >>>>>>>>>>>>> and r being computed elsewhere from p1...p5. So we don't >> make >> >>>>>>>>> special >> >>>>>>>>>>>>> cases for the case c = 0 for example. >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> Does this explanation make sense to you? >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> best regards, >> >>>>>>>>>>>>> Luc >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>>> final DerivativeStructure a_ds = new >> >>>>>>>>>> DerivativeStructure(1, >> >>>>>>>>>>>>> 1, >> >>>>>>>>>>>>>> a); >> >>>>>>>>>>>>>> final DerivativeStructure out = a_ds.pow(dsA); >> >>>>>>>>>>>>>> System.out.format("Derivative@%d=%f\n", a, >> >>>>>>>>>>>>>> out.getPartialDerivative(new int[]{1})); >> >>>>>>>>>>>>>> } >> >>>>>>>>>>>>>> } >> >>>>>>>>>>>>>> } >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>> On Fri, Aug 23, 2013 at 7:59 AM, Gilles >> >>>>>>>>> <gil...@harfang.homelinux.org >> >>>>>>>>>>>>>> wrote: >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> On Fri, 23 Aug 2013 07:17:35 -0700, Ajo Fod wrote: >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Seems like the DerivativeCompiler returns NaN. >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> IMHO it should return 0. >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> What should be 0? And Why? >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Is this worthy of an issue? >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> As is, no. >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> Gilles >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>>> Thanks, >> >>>>>>>>>>>>>>>> -Ajo >> >>>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>> >> >>>>>> >> >>>> >> >> >> ------------------------------**------------------------------**--------- >> >>>>>>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscribe@commons.** >> apache.org >> >> < >> >>>>>>>>>>>>> dev-unsubscr...@commons.apache.org> >> >>>>>>>>>>>>>>> For additional commands, e-mail: >> dev-h...@commons.apache.org >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>>> >> >>>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>> >> >> --------------------------------------------------------------------- >> >>>>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >>>>>>>>>>>>> For additional commands, e-mail: >> dev-h...@commons.apache.org >> >>>>>>>>>>>>> >> >>>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>> >> >> --------------------------------------------------------------------- >> >>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >>>>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>> --------------------------------------------------------------------- >> >>>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >>>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >> --------------------------------------------------------------------- >> >>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >> >>>>>>>> >> >>>>>>>> >> >>>>>>> >> >>>>>> >> >>>>>> >> >>>>>> >> --------------------------------------------------------------------- >> >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >> >>>>>> >> >>>>>> >> >>>>> >> >>>> >> >>>> >> >>>> --------------------------------------------------------------------- >> >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >>>> For additional commands, e-mail: dev-h...@commons.apache.org >> >>>> >> >>>> >> >>> >> >> >> >> >> >> --------------------------------------------------------------------- >> >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> >> For additional commands, e-mail: dev-h...@commons.apache.org >> >> >> >> >> > >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> >> >