7

There have been numerous times when I've needed to invert an integral equation, i.e. I have something like $$f(x) = g_1(x)\int_{0}^x g_2(x') dx'$$ for arbitrary functions $g_1$ and $g_2$, and I would like to find $x$ for a given $f$. The way I've gotten around this is just making some sort of table of f(x) and x with spacing up to some required precision. Is there a more efficient method of doing it (numerically or analytically)?

When I try to use NSolve[ f(x) == a, x ] mathematica complains NIntegrate::nlim: x = x is not a valid limit of integration.

DilithiumMatrix
  • 582
  • 4
  • 12

2 Answers2

9

My interpretation of the question is that you want to find $x$ for given $f$, $g_2$ and $g_1$. Then just define $F=f/g_1$ and differentiate with respect to $x$ on both sides:

$\frac{d}{dx}F(x)=g_2(x)$

Now solve this equation for $x$. There's no integration involved.

Jens
  • 97,245
  • 7
  • 213
  • 499
  • 2
    Just implemented this and it works well. Using a simple finite-difference routine to calculate the derivative of 'F' is computationally trivial compared to the iterative numerical integrations. – DilithiumMatrix Apr 22 '12 at 04:59
  • I tried to implement this using ND and FindRoot, but I am getting strange problems. Maybe I need to ask a separate question. – Santiago Aug 15 '14 at 11:59
  • Here is the separate question: http://mathematica.stackexchange.com/questions/57435/bug-in-paralleltable-after-evaluating-another-function-using-ndsolve-and-findroo – Santiago Aug 19 '14 at 09:53
5

Answering your comment:

f[x_?NumericQ] := f[x] = g1[x] NIntegrate[g2[t], {t, 0, x}];
g1[x_] := Sin[x]; g2[x_] := Cos[x];
k = FindRoot[f[x] == Pi/9, {x, 1}]
Pi/9 - f[x] /. k[[1]]
(*
->
{x -> 0.632072}
-5.55112*10^-17
*)
Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453
  • Thanks @belisarius, but my g2 can't be integrated numerically. I.E. I have something like `f[x_]:=g1[x]*NIntegrate[g2[t],{t,0,x}]' and I get the above error – DilithiumMatrix Apr 21 '12 at 22:45