using Plots, SymPy, ForwardDiff, LinearAlgebra xs_ys(vs) = (A=hcat(vs...); Tuple([A[i,:] for i in eachindex(vs[1])])) xs_ys(v,vs...) = xs_ys([v, vs...]) xs_ys(r::Function, a, b, n=100) = xs_ys(r.(range(a, stop=b, length=n))) function arrow!(plt::Plots.Plot, p, v; kwargs...) if length(p) == 2 quiver!(plt, xs_ys([p])..., quiver=Tuple(xs_ys([v])); kwargs...) elseif length(p) == 3 # 3d quiver needs support # https://github.com/JuliaPlots/Plots.jl/issues/319#issue-159652535 # headless arrow instead plot!(plt, xs_ys(p, p+v)...; kwargs...) end end arrow!(p,v;kwargs...) = arrow!(Plots.current(), p, v; kwargs...) ForwardDiff.gradient(ex::SymPy.Sym, vars=free_symbols(ex)) = [diff(ex, v) for v in vars]