I am working with functions calculated from a set of general basis functions.

f = a[x] + c1*b[x] + c2*c[x];
g = Expand[f*f];
h = Integrate[g, {x, -Infinity, Infinity}];

This much works fine, and I get a nice expression with products of combinations of a[x], b[x], and c[x] in the integrand. But now I need to calculate the values of c1 and c2 that optimize h and the optimal value of h. This fails:

cs = {c1, c2};
s = Solve[{D[h, #] & /@ cs == 0}, cs]
(* Solve::nsmet: This system cannot be solved with the methods available to Solve. >> *)

Is there any hack to make this work?

EVEN better would be if I could get the answer in tidy bracket notation, where for example denotes the definite integral of a[x]*b[x].


3 Answers 3


Similar idea to belisarius, except in V10 we can inactivate Integrate to keep it from evaluating or even trying to evaluate:

h = Inactive[Integrate][g, {x, -Infinity, Infinity}]

It is not necessary in this example, as belisarius' answer shows, but one of its intended uses is to do algebra/calculus on integrals and derivatives. Inactive can be removed easily with


The function linearExpand expands its argument according to linearity properties. Factors/terms that do not depend on x are treated as constants (see update below for a more general approach).

linearExpand[e_] := e //. {int : Inactive[Integrate][_Plus, _] :> Distribute[int], 
    Inactive[Integrate][integrand_Times, dom : {x_, _, _} | x_] :> 
     With[{dependencies = Internal`DependsOnQ[#, x] & /@ List @@ integrand},
      Pick[integrand, dependencies, False] *
       Inactive[Integrate][Pick[integrand, dependencies, True], dom]

OP's sample problem:

Solve[D[h, #] == 0 & /@ cs // linearExpand, cs]

Mathematica graphics

D[h, #] == 0 & /@ cs // linearExpand

Mathematica graphics

For what it's worth...

...here's a general linearity expander. Considers factors that do not depend on x, which may be a list of symbols, as constants.

linearExpand[e_, x_, head_] := 
  e //. {op : head[arg_Plus, __] :> Distribute[op], 
    head[arg1_Times, rest__] :> 
     With[{dependencies = Internal`DependsOnQ[#, x] & /@ List @@ arg1},
      Pick[arg1, dependencies, False] head[
        Pick[arg1, dependencies, True], rest]


linearExpand[D[h, #] == 0 & /@ cs, x, Inactive[Integrate]]
(* same as above *)

linearExpand[foo[(a[x] + c b[y]) (2 a[x] - c b[y]) // Expand, randomarg], x, foo]
(*  -c^2 b[y]^2 foo[1, randomarg] +
     c b[y] foo[a[x], randomarg] + 
     2 foo[a[x]^2, randomarg]        *)

linearExpand[foo[(a[x] + c b[y]) (2 a[x] - c b[y]) // Expand, randomarg], {x, y}, foo]
(*  2 foo[a[x]^2, randomarg] +
    c foo[a[x] b[y], randomarg] - 
    c^2 foo[b[y]^2, randomarg]     *)
f = a[x] + c1*b[x] + c2*c[x];
g = Expand[f*f];

(* we need to get the constants out of the integrals first*)

h = Distribute@Integrate[g, {x, -∞, ∞}] //. Integrate[q1___  r__  q2___, {v_, s__}] /; 
                                        FreeQ[{r}, v] :> r Integrate[q1 q2, {v, s}];

s= Solve[And @@ Thread[D[h, #] & /@ {c1, c2} == 0], {c1, c2}]

(* now we go to bra-ket notation *)

bkRulez = {Integrate[a_ [x] b_[x], {x, -∞, ∞}]     ->   AngleBracket[a, b], 
           Integrate[Power[a_ [x], 2], {x, -∞, ∞}] ->   AngleBracket[a, a]}
Column @@ (s /. bkRulez) // TeXForm

$$\begin{array}{l} \text{c1}\to -\frac{\langle a,c\rangle \langle b,c\rangle -\langle c,c\rangle \langle a,b\rangle }{\langle b,c\rangle ^2-\langle b,b\rangle \langle c,c\rangle } \\ \text{c2}\to -\frac{\langle b,b\rangle \langle a,c\rangle -\langle a,b\rangle \langle b,c\rangle }{\langle b,b\rangle \langle c,c\rangle -\langle b,c\rangle ^2} \\ \end{array}$$

  • $\begingroup$ Cool, thanks! Can you tell me how you got the ouput to format that way on mathematica.SE? When I try to cut-paste output, it comes out as hard-to-read flat text, not formatted like in my mathematica window. The editing-help page strangely does not cover this topic. $\endgroup$ Oct 30, 2014 at 17:52
  • $\begingroup$ @JerryGuern Try enclosing the TeXForm in \$ ... \$ or in \$\$ ... \$\$ $\endgroup$ Oct 30, 2014 at 18:03
  • $\begingroup$ @JerryGuern Check this meta.math.stackexchange.com/questions/5020/… $\endgroup$ Oct 30, 2014 at 18:07
  • $\begingroup$ All that did was put the text in a different font. But it's still writing out "Integral" etc instead of putting a nice integral symbol like in the text I copied. $\endgroup$ Oct 30, 2014 at 18:34
  • $\begingroup$ @JerryGuern But you need to put the TeXForm[ expr ] inside the $ ... $ ! $\endgroup$ Oct 30, 2014 at 18:43

I played with the commands suggested above and found that Distributed[] solved the first half of the problem but only for indefinite integrals:

f = a[x] + c1*b[x] + c2*c[x];
g = Expand[f*f];
h = Distribute[Integrate[g, x]];
cs = {c1, c2};
Solve[{D[h, #] & /@ cs == 0}, cs]

I worry when my solution looks too simple... Are the more complicated answers above handling some problem I'm not aware of?

  • $\begingroup$ Your solution doesn't seem to work with your original equation Solve[{D[h, #] & /@ {c1, c2} == 0}, {c1, c2}], which is necessary if you plan to have more cis... $\endgroup$ Oct 30, 2014 at 18:27
  • $\begingroup$ @belisarius Why did you say it doesn't work? It worked fine for me. But I edited the code above so the Solve line can handle a long cs list. $\endgroup$ Oct 30, 2014 at 18:45
  • 1
    $\begingroup$ Well ... it didn't work for me yesterday :( Or so I believe $\endgroup$ Oct 30, 2014 at 18:47
  • $\begingroup$ @JerryGuern Neat. I'm sure I tried that and the constants did not come out of the integrals (for h). Then Solve wouldn't work. $\endgroup$
    – Michael E2
    Oct 30, 2014 at 18:47
  • 1
    $\begingroup$ @MichaelE2 No, I got it. Now Jerry is working with indefinite integrals and it works. Not for definite integrals, though $\endgroup$ Oct 30, 2014 at 18:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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