Hi Miles, FiniteDifferenceDerivatives.jl contains methods that generalize those used in Calculus.jl (general k-point methods vs fixed 2-point methods).
But at the same time I don't think that Calculus.jl would benefit from general k-point methods, because the use cases of both packages differ greatly. FDD.jl is useful mostly when you have to work with a function given at fixed mesh points (for example when solving PDEs with method of lines), then the only way to increase the precision of the derivative is to increase the order of method. On the other hand, in Calculus.jl you can evaluate the function to be differentiated wherever you want so there is no fixed mesh and you can just use a lower order method with a smaller step size to compensate for the low order. Also Calculus.jl uses (and implements) d-dimensional finite difference schemes necessary to compute gradients, while in FDD.jl I only implemented a 1-dimensional case. So far I have not looked at a general d-dimensional, n-point, k-derivative methods and I don't even know whether they exist. In summary, it would be possible to use FDD.jl in Calculus.jl, although it would probably be an overkill and with current implementation of FDD.jl it would decrease the performance. Best, Paweł W dniu środa, 15 października 2014 22:06:40 UTC+2 użytkownik Miles Lubin napisał: > > Hi Paweł, > > How does your approach compare with the implementation of finite > differences in Calculus.jl? It would be great if you could contribute any > new techniques there. > > Miles > > On Wednesday, October 15, 2014 6:48:29 AM UTC-4, Paweł Biernat wrote: >> >> Hi, >> I have been experimenting with various finite difference algorithms for >> computing derivatives and I found and implemented a general algorithm for >> computing arbitrarily high derivative to arbitrarily high order [1]. So >> for anyone interested in playing with it I wrapped it up in a small package. >> >> I would also like to ask for your an advice on how to improve the >> performance of the function fdd, so far for a first derivative on a three >> point stencil (on a non-uniformly spaced mesh) it takes ten times as much >> time to compute the derivative, when compared to a hand crafted >> implementation of the same function. For a comparison you can call >> >> using FiniteDifferenceDerivatives >> x=linspace(0,1,1000) >> f=sin(x) >> df=copy(x) >> @elapsed for i = 1:1000; fdd(1,3,x,f); end # general function => ~0.5 s >> @elapsed for i = 1:1000; fdd13(x,f); end # hand crafted => ~0.05 s >> >> Obviously, most of the time is spent inside fddcoeffs. One way I could >> increase the performance is to cache the results of fddcoeffs (its result >> depends only on the mesh). In my use case however, the mesh changes often >> and fddcoeffs has to be called every time fdd is called. I also tried to >> replace x[i1:i1+order-1] with view(x,i1:i1+order-1) in the call to >> fddcoeffs (with view from ArrayViews), but it didn't result in much of an >> improvement. I also played with swapping the indexing order of c in >> fddcoeffs, but to no avail (maybe because the typical size of the matrix c >> is small (3x3 or similar)). Maybe I should try to inline the fddcoeffs >> into the main body of fdd (I did this in my earlier version, and it >> actually resulted in an improvement, but it looked kind of less elegant)? >> Any advice (or pull requests) would be welcome. >> >> [1] https://github.com/pwl/FiniteDifferenceDerivatives.jl >> >> Cheers, >> Paweł >> >
