The Hirota $D$-operator (derivative) is mathematically defined as follows:

$$D_x^n f\cdot g=\left.\frac{\partial^n}{\partial s ^n} f(x+s)g(x-s)\right|_{s=0} $$

An example of this operator acting on two functions $a(x)$ and $b(x)$ is the following:

$$D_x a(x)\cdot b(x) = a'(x)b(x)-a(x)b'(x)$$

I'm trying to make a Hirota $D$-operator function in Mathematica. What I've tried is the following

HirotaD[a[x_], b[x_], n_] :=
   sol = D[a[x + y]*b[x - y], {y, n}] /. y -> 0 //

   Print[("\!\(\*SubscriptBox[\(D\), \(x\)]\)")^n, "=", sol]

This appears to work at first when I simply use arbitrary functions a[x] and b[z] as input functions:

HirotaD[a[x], b[x], 1]
(* ==> Subscript[D, x]=b(x)a'(x)-a(x) b'(x)  *)

However, it fails to output anything when I use any predefined functions.


(* ==> HirotaD[Sin[x], Cos[x], 1] *)

How do I make it work on predefined functions?

  • 4
    $\begingroup$ Your definition only accepts the functions a and b, literally, with any argument, called x. Try a_[x_] etc. on the LHS of the definition. $\endgroup$ – Marius Ladegård Meyer Jul 17 '16 at 19:28
  • $\begingroup$ @MariusLadegårdMeyer That was it! $\endgroup$ – Arturo don Juan Jul 17 '16 at 19:29
  • $\begingroup$ @MariusLadegårdMeyer Hold on though, when I change it to a_[x_] it works with some simple predefined functions, but not with any functions which involve multiplication in it (weird...). For example, f[x_]=a[x]*b[x] doesn't work as a valid input function. $\endgroup$ – Arturo don Juan Jul 17 '16 at 19:33
  • $\begingroup$ It's not weird: the pattern a_[x_] cannot possibly match a[x]*b[x], can it? It seems the two arguments should be general expressions, i.e. just a_, b_, see @Lucas's answer. $\endgroup$ – Marius Ladegård Meyer Jul 17 '16 at 21:38
  • 1
    $\begingroup$ If you do SetAttributes[HirotaD, HoldAll], then define your function with a_[x_] and b_[x_] as suggested by @MariusLadegårdMeyer , it should work the way you're expecting. $\endgroup$ – march Jul 18 '16 at 15:47

The following definition takes as arguments two pure functions, a and b, their argument x and the parameter n.

HirotaD[a_, b_, x_, n_] := 
   sol = D[a[x + y]*b[x - y], {y, n}] /. y -> 0 // TraditionalForm;
   Print[("\!\(\*SubscriptBox[\(D\), \(x\)]\)")^n, "=", sol]];

It works on general functions, not yet defined.

HirotaD[a, b, x, 1]
(* Subscript[D, x]=b(x) a'(x)-a(x) b'(x) *)

On built in functions, like Sin and Cos

HirotaD[Sin, Cos, x, 1]
(* Subscript[D, x]=sin^2(x)+cos^2(x) *)

And on products of functions, but for more complicated uses, one has to define a pure function, as follows:

HirotaD[a[#] b[#] &, u, x, 1]
(* Subscript[D, x]=b(x) u(x) a'(x)+a(x) u(x) b'(x)-a(x) b(x) u'(x) *)
| improve this answer | |

I thought I'd offer a definition that works more like Mathematica's D function:

HirotaD[a_, b_, x_, n_] := Module[{fa, fb, d, s}, (
   fa = a /. (x -> (x + s));
   fb = b /. (x -> (x - s));
   d = D[fa fb, {s, n}];
   d /. s -> 0 // Simplify

HirotaD[a_, b_, x_] := HirotaD[a, b, x, 1]

Which you can call like

HirotaD[a[x], b[x], x] (* General Example *)
HirotaD[Sin[x], Cos[x], x] (* Should give 1 *)
HirotaD[Sin[y], Cos[y], x] (* df[y]/dx = 0, should give 0 *)
HirotaD[a[x], b[x], x, 2] (* Second order *)

which gives

$b(x) a'(x) - a(x) b'(x)$



$b(x) a''(x)-2 a'(x) b'(x)+a(x) b''(x)$

| improve this answer | |
  • $\begingroup$ Using the product rule: HirotaD[a_, b_, x_, n_:1] := Sum[(-1)^(n - k) Binomial[n, k] Derivative[k][Function[x, a]][x] Derivative[n - k][Function[x, b]][x], {k, 0, n}] $\endgroup$ – J. M.'s discontentment Jul 18 '16 at 0:23
  • $\begingroup$ @J.M. Yup, kind of obvious when you see the form of the higher order derivatives. $\endgroup$ – Lucas Jul 18 '16 at 15:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.