Hi Paweł, Thanks for the clarification, I agree that this code is likely too specialized for Calculus.jl. I'm not very familiar with PDE solution techniques, but you may want to take a look at the various JuliaDiff (http://www.juliadiff.org/) projects. It's possible that by using one of the truncated taylor series approaches, you could compute exact derivatives without the need for finite differences. I'm also happy to add a link to FDD.jl when it's published in METADATA.
Miles On Thursday, October 16, 2014 7:41:34 AM UTC-4, Paweł Biernat wrote: > > 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ł >>> >>
