I do not have your answer, your  question is a good one.

On Sunday, July 17, 2016 at 11:13:38 AM UTC-4, Young Chun wrote:
>
> I have an optimization problem that involves series of high order 
> derivatives of f(x). 
> So, to get a decent value, I need to calculate higher order derivative at 
> least to 40~50th order. 
>
> Initially, I tried to use ForwardDiff package with automatic 
> differentiation but kept facing the following error message
>
> <div id="inner-editor"><br class="Apple-interchange-newline">using 
> DualNumbers using ForwardDiff f(x::Vector) = sum(sin, x) + prod(tan, x) * 
> sum(sqrt, x); x = rand(5) g = ForwardDiff.derivative(f);</div>
>
> using DualNumbers
>
> using ForwardDiff
>
> f(x::Vector) = sum(sin, x) + prod(tan, x) * sum(sqrt, x);
>
> x = rand(5)
>
> g = ForwardDiff.derivative(f);
>
> LoadError: MethodError: `derivative` has no method matching 
> derivative(::Function)
> Closest candidates are:
>   derivative(::Any, !Matched::Any)
> while loading In[28], in expression starting on line 4
>
>
>
> So, I moved on to D(f) instead from Root package and it works quite well 
> for a small order (like 10th order derivative)
>
> <div id="inner-editor"><br class="Apple-interchange-newline">using 
> DualNumbers using ForwardDiff using Roots using ForwardDiff using JuMP # 
> Need to say it whenever we use JuMP using Gadfly function hder(f, n::Real) 
> # subroutine to calculate higher order derivative temp = f; if n==0 return 
> temp else for i=1:1:n temp = D(temp) end return temp end end</div>
>
> using DualNumbers
>
> using ForwardDiff
>
> using Roots
>
> using ForwardDiff
>
> ​
>
> using JuMP  
>
> using Gadfly
>
> ​
>
> function hder(f, n::Real) # subroutine to calculate n-th order derivative 
>
>     temp = f;
>
>     if n==0
>
>         return temp 
>
>     else
>
>         for i=1:1:n
>
>             temp = D(temp)
>
>         end
>
>         return temp
>
>     end
>
> end
>
> Out[7]:
>
> hder (generic function with 1 method)
>
> f(x) = (cos(x)) * exp(-1/5 * x)
> g0 = hder(f, 0)
> g1 = hder(f, 1)
> g2 = hder(f, 2)
> g3 = hder(f, 3)
> g4 = hder(f, 4)
> g5 = hder(f, 5)
> g6 = hder(f, 6)
> g7 = hder(f, 7)
> g8 = hder(f, 8)
>
> plot([g0, g1, g2, g3, g4, g5, g6, g7, g8], 0, 5pi)
>
>
> <https://lh3.googleusercontent.com/-RCrcnLVFPhE/V4tfcG9uSEI/AAAAAAAAGUU/unxjN7x60jgPaEcCmcRlykx8WpbMxJBnACLcB/s1600/Screen%2BShot%2B2016-07-17%2Bat%2B11.35.09.png>
> However, if I push the limit and ask to calculate, like 30th order 
> derivative, the program never ends and keep calculating for hours.
> Is there a better way to do this type of task? either by using ForwardDiff 
> package or by modifying my function?
> I just learned Julia last week, so please understand if my question sounds 
> stupid. 
>
>
>
>

Reply via email to