# Function which returns a symbolic jump between two ordinates, e.g. $[f(a,b,c)]^+_- = f(a^+,b^+,c^+)-f(a^-,b^-,c^-)$

I want to create a function in Mathematica which accomplishes the following:

$$[f(a,b,c)]^+_- = f(a^+,b^+,c^+)-f(a^-,b^-,c^-)$$

where $$f$$ is any function (has 3 arguments above but this need not be the case) and $$a,b,c$$ are arguments (though there may be more). I am dealing with some boundary conditions across interfaces which require me to evaluate "jumps" in discontinuous quantities.

What I would like to do is something that accomplishes the following, returning symbolic variables which can be used later:

• $$[\mu]^+_-=\mu^+-\mu^-$$
• $$\left[\frac{1}{\mu}\right]^+_-=\frac{1}{\mu^+}-\frac{1}{\mu_-}$$
• $$\left[\frac{ab^2}{\sqrt{c}}\right]^+_-=\frac{a^+{b^+}^2}{\sqrt{c^+}}-\frac{a^-{b^-}^2}{\sqrt{c^-}}$$

I want to be able to input any expression inside the brackets (although in this case the expression will be called as an argument to a function) and this expression needs to have an arbitrary number of variables. It would also be highly desirable this could be done entry-wise to a vector whose entries are expressions (themselves each of an arbitrary number of variables).

A bit of research tells me that the Map function might do what I want, but I'm not yet skilled enough in Mathematica to implement it properly. Could somebody point me into the right direction?

I have found something which does what I want but I am having trouble converting it into a function. Think of the subscript $$v^+$$ and $$l$$ as taking place of the $$+$$ and $$-$$ as above.

Two more things I want to accomplish:

• How can I write this as a function which takes any algebraic expression and returns an analogous result?
• How can I make sure that it is the variable that is subscripted rather than the expression in each case (e.g. I want $$\frac{1}{\sqrt{c_{v^+}}}$$ not $$\frac{1}{\sqrt{c}}_{v^+}$$).
• What do e.g. $a^+$ and $a^-$ mean? – MarcoB Dec 4 '19 at 1:20
• They mean the value of $a$ above and below some interface respectively. It's not actually a calculation I am after, just a generation of two symbolic variables. – user68730 Dec 4 '19 at 16:04

Interpreting your $$a^+$$ and $$a^-$$ as limits from above and below, (and in one dimension), this function takes the limit from above and from below and then takes the difference:

jump[q_, x_, val_] := Limit[q[x], x -> val, Direction -> "FromAbove"] -
Limit[q[x], x -> val, Direction -> "FromBelow"]


So for example, say we have a discontinuous function:

q[x_] := Piecewise[{{x^2, x < 0}, {x + 1, x > 0}}];
Plot[q[x], {x, -2, 2}]


Then we can evaluate at points of continuity and get zero, or evaluate at points of discontinuity, and get the size of the jump:

{jump[q, x, -1], jump[q, x, 0], jump[q, x, 1]}
{0, 1, 0}


Does this do what you want? Are you looking for additional formatting of input or output?

Attributes[jump] = HoldFirst;
jump[fn_[args__]] := fn[args] - fn @@ -{args}

jump[f[a, b, c]]

-f[-a, -b, -c] + f[a, b, c]


Following your update please try this and report its utility. Parameters f and g can be changed to whatever symbol modifier you please.

ClearAll[jump]
jump[f_, g_][expr_] :=
Subtract @@ (expr /. {{v : # :> f@v}, {v : # :> g@v}}) &[
Alternatives @@ Variables[expr]]

jump[Subscript[#, v] &, Subscript[#, l] &][a b^2/Sqrt[c]]


Output as $$LaTeX$$:

$$\frac{a_v b_v^2}{\sqrt{c_v}}-\frac{a_l b_l^2}{\sqrt{c_l}}$$

• Not quite. As strange as it seems, what I am after is more of a symbolic generation than a calculation, so a, b and c don't strictly need to be taken to be positive as above. – user68730 Dec 4 '19 at 16:12

I've found a solution which does what I want.

VLJump [expr_] :=
ReplaceAll[expr,
Map[# -> Subscript[#, SuperPlus[v]] &, Variables[expr]]] -
ReplaceAll[expr, Map[# -> Subscript[#, l] &, Variables[expr]]]