Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Consider the following code:

def simplify_dirac_delta(linear_combination, t):
    Simplify a ``linear combination`` of the form

    a_0(t) + a_1(t)*d_1(t) + a_2(t)*d_2(t) + ... + a_n(t)*d_n(t)

    where each a_i(t) is a symbolic expression depending
    on the symbolic variable ``t`` and each d_i(t) is
    either dirac_delta(t) or diff(dirac_delta(t), t).

    Simplification is done by applying the following 
    substitution rules:

    (Rule 1)   f(t) * diff(dirac_delta(t), t) 
                    --> diff(f(t), t) * dirac_delta(t)
    (Rule 2)   f(t) * dirac_delta(t)
                    --> f(0) * dirac_delta(t)
    # Write the linear combination in the form
    #         c_0(t) + c_1(t) * diff(dirac_delta(t),t)
    # and apply Rule 1 
    expression = linear_combination.collect(diff(dirac_delta(t),t))
    expr = expression.subs({diff(dirac_delta(t),t): dd})
    c_0 = expr.coefficient(dd,0)
    c_1 = expr.coefficient(dd,1)
    dc_1 = diff(c_1,t)
    expression = c_0 + dc_1*dirac_delta(t)
    # Write now the resulting linear combination in the form
    #         c_0(t) + c_1(t) * dirac_delta(t),t)
    # and apply Rule 2 
    expression = expression.collect(dirac_delta(t))
    expr = expression.subs({dirac_delta(t): dd})
    c_0 = expr.coefficient(dd,0)
    c_1 = expr.coefficient(dd,1)
    return c_0 + c_1.subs({t:0})*dirac_delta(t)

The docstring and comments explain quite explicitly what simplify_dirac_delta does. Let us test this function. To this end, let us consider $$ \cos(x)\, \delta(x)+e^{2x}\,\delta'(x)+3\sin(4x)\,\delta'(x)+9e^{3x}. $$ The simplification rules transform this expression into $$ \begin{aligned} &\cos(x)\,\delta(x)+2e^{2x}\delta(x)+12\cos(4x)\,\delta(x)+9e^{3x} \\ &\qquad=(1+2+12)\delta(x)+9e^{3x}=15\delta(x)+9e^{3x}. \end{aligned} $$ Now we apply simplify_dirac_delta:

sage: DD = dirac_delta(x)
sage: dDD = diff(dirac_delta(x),x)
sage: expr = cos(x)*DD + exp(2*x)*dDD + 3*sin(4*x)*dDD + 9*exp(3*x)
sage: simplify_dirac_delta(expr,x)
15*dirac_delta(x) + 9*e^(3*x)

We get the expected result. Now, let us consider your example:

sage: var('x,k')
(x, k)
sage: G = heaviside(x)*sin(k*x)/k
sage: expr = simplify(k**2*G + diff(G, x, x)); expr
2*cos(k*x)*dirac_delta(x) + sin(k*x)*diff(dirac_delta(x), x)/k
sage: simplify_dirac_delta(expr,x)

Once again we obtain the expected result.

The above code and the examples can be run in this SageMath Cell