In general function integration is termed quadrature
Question, how use adaptive grids to most efficiently and accuratly represent and integral.
This can be done with a recursive algorithm as follows.
$$I_1 = (a-b)\frac{f(a)+f(b)}{2}$$.
\begin{align} I_2 &= \frac{a-b}{2}\frac{f(a)+f(m)}{2} + \frac{a-b}{2}\frac{f(m)+f(b)}{2}, \\ &= \frac{a-b}{4}(f(a)+2f(m)+f(b)). \end{align}
$$\epsilon_r = \left|\frac{I_1-I_2}{I_2}\right|.$$
Compute the following function using a Recursive Trapazoid method:
$$I = \int_0^1 x\tanh\left(50\left(x-\frac{1}{2}\right)\right) + 1\,dx.$$The function being integrated is shown in the plot below.
using Plots
using PyFormattedStrings
using QuadGK
f(x) = x*tanh(50*(x-0.5)) + 1.0
x = LinRange(0,1,100)
plot(x,f.(x), legend=nothing, lw=4)
xmstore = Float64[]
function adaptTrap(f, xa, xb, tol=1E-4)
Δx = xb - xa
Δx2 = Δx/2
xm = 0.5*(xa+xb)
append!(xmstore, xm)
I1 = Δx*(f(xa) + f(xb))/2
I2 = Δx2*(f(xa) + f(xm))/2 + Δx2*(f(xm) + f(xb))/2
err = abs((I1-I2)/I2)
if err <= tol
return I2
else
return adaptTrap(f, xa, xm, tol) + adaptTrap(f, xm, xb, tol)
end
end
I = adaptTrap(f, 0, 1, 1E-2)
1.2495345133990483
println(f"\nI_adapt = {I:.8f}")
println(f"I_quad = {quadgk(f,0,1)[1]:.8f}")
x = LinRange(0,1,100)
y = f.(x)
plot(x,y, legend=nothing, lw=4)
ymstore = f.(xmstore)
plot!(xmstore,ymstore, line=:stem, marker=:circle, color="black", lw=0.5 )
I_adapt = 1.24953451 I_quad = 1.24967101