Skip to content

Commit 2351ae9

Browse files
direct calculus
1 parent 42e2727 commit 2351ae9

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

src/ModelingToolkit.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ include("equations.jl")
8888
include("function_registration.jl")
8989
include("simplify.jl")
9090
include("utils.jl")
91+
include("direct.jl")
9192
include("systems/diffeqs/diffeqsystem.jl")
9293
include("systems/diffeqs/first_order_transform.jl")
9394
include("systems/nonlinear/nonlinear_system.jl")

src/direct.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
function gradient(O::Operation, vars::AbstractVector{Operation}; simplify = true)
2+
out = [expand_derivatives(Differential(v)(O)) for v in vars]
3+
simplify ? simplify_constants.(out) : out
4+
end
5+
6+
function jacobian(ops::AbstractVector{Operation}, vars::AbstractVector{Operation}; simplify = true)
7+
out = [expand_derivatives(Differential(v)(O)) for O in ops, v in vars]
8+
simplify ? simplify_constants.(out) : out
9+
end
10+
11+
function hessian(O::Operation, vars::AbstractVector{Operation}; simplify = true)
12+
out = [expand_derivatives(Differential(v2)(Differential(v1)(O))) for v1 in vars, v2 in vars]
13+
simplify ? simplify_constants.(out) : out
14+
end
15+
16+
function simplified_expr(O::Operation)
17+
if O isa Constant
18+
return O.value
19+
elseif isa(O.op, Differential)
20+
return :(derivative($(simplified_expr(O.args[1])),$(simplified_expr(O.op.x))))
21+
elseif isa(O.op, Variable)
22+
isempty(O.args) && return O.op.name
23+
return Expr(:call, Symbol(O.op), simplified_expr.(O.args)...)
24+
end
25+
return Expr(:call, Symbol(O.op), simplified_expr.(O.args)...)
26+
end
27+
28+
function simplified_expr(eq::Equation)
29+
Expr(:(=), simplified_expr(eq.lhs), simplified_expr(eq.rhs))
30+
end

src/simplify.jl

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,3 @@ function _simplify_constants(O::Operation, shorten_tree)
7575
end
7676
_simplify_constants(x, shorten_tree) = x
7777
_simplify_constants(x) = _simplify_constants(x, true)
78-
79-
function simplified_expr(O::Operation)
80-
if O isa Constant
81-
return O.value
82-
elseif isa(O.op, Differential)
83-
return :(derivative($(simplified_expr(O.args[1])),$(simplified_expr(O.op.x))))
84-
elseif isa(O.op, Variable)
85-
isempty(O.args) && return O.op.name
86-
return Expr(:call, Symbol(O.op), simplified_expr.(O.args)...)
87-
end
88-
return Expr(:call, Symbol(O.op), simplified_expr.(O.args)...)
89-
end
90-
91-
function simplified_expr(eq::Equation)
92-
Expr(:(=), simplified_expr(eq.lhs), simplified_expr(eq.rhs))
93-
end

src/systems/nonlinear/nonlinear_system.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
export NonlinearSystem
22

3-
43
struct NLEq
54
rhs::Expression
65
end

test/direct.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using ModelingToolkit, StaticArrays, LinearAlgebra
2+
using DiffEqBase
3+
using Test
4+
5+
# Define some variables
6+
@parameters t σ ρ β
7+
@variables x y z
8+
9+
eqs =*(y-x),
10+
x*-z)-y,
11+
x*y - β*z]
12+
13+
= ModelingToolkit.jacobian(eqs,[x,y,z])
14+
for i in 1:3
15+
= ModelingToolkit.gradient(eqs[i],[x,y,z])
16+
@test isequal(∂[i,:],∇)
17+
end
18+
@test all(isequal.(ModelingToolkit.gradient(eqs[1],[x,y,z]),[σ * -1,σ,0]))
19+
@test all(isequal.(ModelingToolkit.hessian(eqs[1],[x,y,z]),0))

0 commit comments

Comments
 (0)