numerical integration - Solution of a singular integral equation using interpolation and truncated methods
I am trying to code the following integral equation to find the solution numerically using Mathematica.
First we define the following functions:
phi[x_]:=Piecewise[{{1, 0 < x < 1}}, 0]
psi1[x_] := (phi[2 x-1] - phi[2 x]);
psijk[x_, j_, k_] := (Sqrt[2])^j psi1[-2^j x - k]
f[x_] := 1/1155 (112 (-1 + x)^(3/4) + x (144 (-1 + x)^(3/4) + x (1155 + 256 (-1 + x)^(3/4) - 1280 x^(3/4) - (1155 + 512 (-1 + x)^(3/4)) x + 1024 x^(7/4))));
exactsoln[x_] := x^2 (1 - x);
I am trying to solve the following integral equation for u (x) (numerically). where
u[x] + Integrate[(x - t)^(-1/4)*u[t], {t, 0, x}] - 
   Integrate[(x - t)^(-3/4)*u[t], {t, 0, 1}] = f[x];
where f[x] is defined as above. Here is the numerical scheme. The approximated solution \approx[x] which can be written as
approxsoln[x_, n_] := 
 Sum[c[j, k]*psijk[x, j, k], {j, 0, n}, {k, -2^n, 2^n - 1}]
Then, we will end up by
Sum[c[j, k]*(psijk[x, j, k] - 
     Integrate[(x - t)^(-1/4)* psijk[t, j, k], {t, 0, x}] - 
     Integrate[(x - t)^(-1/4)* psijk[t, j, k], {t, 0, 1}]), {j, 0, n}, {k, -2^n, 2^n - 1}];
I think it is worth to try for n=10 first.
Answer
The numerical method I suggested here also works for this case.It uses expression describing the integral Integrate[(x - t)^(-1/4),t]
f[x_] := 1/
    1155 (112 (-1 + x)^(3/4) + 
     x (144 (-1 + x)^(3/4) + 
        x (1155 + 256 (-1 + x)^(3/4) - 
           1280 x^(3/4) - (1155 + 512 (-1 + x)^(3/4)) x + 
           1024 x^(7/4))));
ker[t_, x_] := -(4/3) (-t + x)^(3/4)
np = 101; points = fun = Table[Null, {np}];
Table[points[[i]] = i/np, {i, np}];
sol = Unique[] & /@ points;
Do[fun[[i]] = f[t] /. t -> points[[i]], {i, np}]; sol1 = 
 sol /. First@
   Solve[Table[
     sol[[j]] - 
       Sum[.5*(sol[[i]] + 
           sol[[i + 1]])*(ker[points[[i + 1]], points[[j]]] - 
           ker[points[[i]], points[[j]]]), {i, 1, np - 1}] - 
       Sum[.5*(sol[[i]] + 
           sol[[i + 1]])*(ker[points[[i + 1]], points[[j]]] - 
           ker[points[[i]], points[[j]]])*If[i >= j, 0, 1], {i, 1, 
         np - 1}] == fun[[j]], {j, 1, np}], sol];
u = Transpose[{points, Re[sol1]}];
Show[Plot[x^2*(1 - x), {x, 0, 1}, AxesLabel -> {"x", "u"}, 
  PlotStyle -> Blue], ListPlot[u, PlotStyle -> Orange]]
If we use the algorithm that @Mutaz offers, then a solution for n = 2 (for n = 5, a supercomputer is needed) looks like that
phi[x_] := Piecewise[{{1, 0 <= x < 1}}, 0]
psi1[x_] := (phi[2 x] - phi[2 x - 1]);
psijk[x_, j_, k_] := 
 Piecewise[{{(Sqrt[2])^j psi1[2^j x - k], 
    0 <= j}, {2^j psi1[2^j (x - k)], j < 0}}]
f[x_] := 1/
    1155 (112 (-1 + x)^(3/4) + 
     x (144 (-1 + x)^(3/4) + 
        x (1155 + 256 (-1 + x)^(3/4) - 
           1280 x^(3/4) - (1155 + 512 (-1 + x)^(3/4)) x + 
           1024 x^(7/4))));
exactsoln[x_] := x^2 (1 - x);
(*u[x]-Integrate[(x-t)^(-1/4)*u[t],{t,0,x}]-Integrate[(x-t)^(-1/4)*u[\
t],{t,0,1}]=f[x];*)
sol[x_, n_] := 
Sum[c[j, k]*psijk[x, j, k], {j, -n, n}, {k, -2^n, 2^n - 1}]
     n = 2;  var = 
     Flatten[Table[c[j, k], {j, -n, n, 1}, {k, -2^n, 2^n - 1, 1}]];np = 
     Length[var]; points = 
     Table[Null, {np}];
    Table[points[[i]] = i/np, {i, np}];
eq = ParallelTable[
    sol[points[[i]], n] - 
      Integrate[(points[[i]] - t)^(-1/4)*sol[t, n], {t, 0, 
        points[[i]]}] - 
      Integrate[(points[[i]] - t)^(-1/4)*sol[t, n], {t, 0, 1}] == 
     f[points[[i]]], {i, 1, np}]; 
{b, m} = N[CoefficientArrays[eq, var]];
sol1 = LinearSolve[m, -b];
u = Sum[c[j, k]*psijk[x, j, k], {j, -n, n}, {k, -2^n, 2^n - 1}] /. 
   Table[var[[i]] -> sol1[[i]], {i, Length[var]}];
Show[Plot[x^2*(1 - x), {x, 0, 1}, AxesLabel -> {"x", "u"}, 
  PlotStyle -> Blue, PlotLabel -> Row[{"n = ", n}]], 
 Plot[Re[u], {x, 0, 1}, PlotStyle -> Orange]]
I will show another method that is in the middle position between what Roman suggested and what the author wants. This method is very accurate.Figure 3 on the right shows the difference between the exact solution and the numerical one with 'n = 3'. This difference is of the order of $10^{-16}$.
psijk[x_, j_] := x^j
f[x_] := 1/
    1155 (112 (-1 + x)^(3/4) + 
     x (144 (-1 + x)^(3/4) + 
        x (1155 + 256 (-1 + x)^(3/4) - 
           1280 x^(3/4) - (1155 + 512 (-1 + x)^(3/4)) x + 
           1024 x^(7/4))));
exactsoln[x_] := x^2 (1 - x);
(*u[x]-Integrate[(x-t)^(-1/4)*u[t],{t,0,x}]-Integrate[(x-t)^(-1/4)*u[\
t],{t,0,1}]=f[x];*)
sol[x_, n_] := Sum[c[j]*psijk[x, j], {j, 0, n}]
n = 3; var = Flatten[Table[c[j], {j, 0, n, 1}]]; np = 
 Length[var]; points = Table[Null, {np}];
Table[points[[i]] = i/np, {i, np}];
eq = ParallelTable[
    sol[points[[i]], n] - 
      Integrate[(points[[i]] - t)^(-1/4)*sol[t, n], {t, 0, 
        points[[i]]}] - 
      Integrate[(points[[i]] - t)^(-1/4)*sol[t, n], {t, 0, 1}] == 
     f[points[[i]]], {i, 1, np}]; // AbsoluteTiming
{b, m} = N[CoefficientArrays[eq, var]];
sol1 = LinearSolve[m, -b];
u = Sum[c[j]*psijk[x, j], {j, 0, n}] /. 
   Table[var[[i]] -> sol1[[i]], {i, Length[var]}];
Show[Plot[x^2*(1 - x), {x, 0, 1}, AxesLabel -> {"x", "u"}, 
  PlotStyle -> Blue, PlotLabel -> Row[{"n = ", n}]], 
 Plot[Re[u], {x, 0, 1}, PlotStyle -> Orange]]
Plot[x^2*(1 - x) - Re[u], {x, 0, 1}, AxesLabel -> {"x", "\[Delta]u"}, 
 PlotStyle -> Blue, PlotLabel -> Row[{"n = ", n}]]



Comments
Post a Comment