JuliaSymbolics / Symbolics.jl

Symbolic programming for the next generation of numerical software
https://docs.sciml.ai/Symbolics/stable/
Other
1.37k stars 153 forks source link

`derivative` gives wrong answer when differentiating with respect to an expression #1077

Open LilithHafner opened 8 months ago

LilithHafner commented 8 months ago

What is the derivative of x with respect to 2x? 1/2 is a great answer. An error is good too. 0 is wrong.

julia> @variables x;

help?> Symbolics.derivative
  derivative(O, v; simplify)

  A helper function for computing the derivative of an expression with respect to var.

julia> Symbolics.derivative(2x, x) # correct
2

julia> Symbolics.derivative(x, 2x) # weird input, and wrong answer
0

This can be reproduces using only exported names with docstrings

help?> Differential
search: Differential

  struct Differential <: Symbolics.Operator

  Represents a differential operator.

  Fields
  ≡≡≡≡≡≡

    •  x: The variable or expression to differentiate with respect to.

  Examples
  ≡≡≡≡≡≡≡≡

  julia> using Symbolics

  julia> @variables x y;

  julia> D = Differential(x)
  (D'~x)

  julia> D(y) # Differentiate y wrt. x
  (D'~x)(y)

  julia> Dx = Differential(x) * Differential(y) # d^2/dxy operator
  (D'~x(t)) ∘ (D'~y(t))

  julia> D3 = Differential(x)^3 # 3rd order differential operator
  (D'~x(t)) ∘ (D'~x(t)) ∘ (D'~x(t))

help?> expand_derivatives
search: expand_derivatives

  expand_derivatives(O; ...)
  expand_derivatives(O, simplify; occurrences)

  TODO

  Examples
  ≡≡≡≡≡≡≡≡

  julia> @variables x y z k;

  julia> f=k*(abs(x-y)/y-z)^2
  k*((abs(x - y) / y - z)^2)

  julia> Dx=Differential(x) # Differentiate wrt x
  (::Differential) (generic function with 2 methods)

  julia> dfx=expand_derivatives(Dx(f))
  (k*((2abs(x - y)) / y - 2z)*IfElse.ifelse(signbit(x - y), -1, 1)) / y

julia> expand_derivatives(Differential(2x)(x))
0
LilithHafner commented 8 months ago

This could be because I am misusing the expand_derivatives function. I'm happy to add a docstring if someone tells me what it it's supposed to do.

ChrisRackauckas commented 8 months ago

That should error. We should make sure it's a var. Could you add an error check there?