Skip to content

Commit ca40b8e

Browse files
committed
Add derivative(ex, v) overload
Fix #684
1 parent f0b337b commit ca40b8e

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

docs/src/highlevel.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ modelingtoolkitize
1818
## Differentiation Functions
1919

2020
```@docs
21+
ModelingToolkit.derivative
2122
ModelingToolkit.gradient
2223
ModelingToolkit.jacobian
2324
ModelingToolkit.sparsejacobian

src/direct.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
"""
2+
```julia
3+
derivative(O, v; simplify = true)
4+
```
5+
6+
A helper function for computing the derivative of an expression with respect to
7+
`var`.
8+
"""
9+
function derivative(O, v; simplify = true)
10+
if O isa AbstractArray
11+
Num[expand_derivatives(Differential(v)(value(o)), simplify) for o in O]
12+
else
13+
Num(expand_derivatives(Differential(v)(value(O)), simplify))
14+
end
15+
end
16+
117
"""
218
```julia
319
gradient(O, vars::AbstractVector; simplify = true)
@@ -232,7 +248,9 @@ function toexpr(O; canonicalize=true)
232248
op = operation(O)
233249
args = arguments(O)
234250
if op isa Differential
235-
return :(derivative($(toexpr(args[1]; canonicalize=canonicalize)),$(toexpr(op.x; canonicalize=canonicalize))))
251+
ex = toexpr(args[1]; canonicalize=canonicalize)
252+
wrt = toexpr(op.x; canonicalize=canonicalize)
253+
return :(Differential($wrt)($ex))
236254
elseif op isa Sym
237255
isempty(args) && return nameof(op)
238256
return Expr(:call, toexpr(op; canonicalize=canonicalize), toexpr(args; canonicalize=canonicalize)...)

test/direct.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ canonequal(a, b) = isequal(simplify(a), simplify(b))
1212
Differential(z)(Differential(y)(Differential(x)(t)))
1313
)
1414

15+
@test canonequal(
16+
ModelingToolkit.derivative(sin(cos(x)), x),
17+
-sin(x) * cos(cos(x))
18+
)
19+
1520
eqs =*(y-x),
1621
x*-z)-y,
1722
x*y - β*z]

0 commit comments

Comments
 (0)