MathGroup Archive 2002

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: NDSolve with integral equation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg36310] Re: [mg36144] NDSolve with integral equation
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Sat, 31 Aug 2002 01:25:52 -0400 (EDT)
  • References: <200208230425.AAA00142@smc.vnet.net> <3D6BA42E.EBFC1274@wolfram.com>
  • Sender: owner-wri-mathgroup at wolfram.com

Steve,

Below is the note that had a line clipped (the one beginning ">From
here..."). I am sending it pretty much in the same way as last time,
with cc to mathgroup at smc.vnet.net (only this time with the intent that
it not appear there).

Daniel

-------------------------------------------

"Toshiyuki (Toshi) Meshii" wrote:
> 
> Hello,
> 
> NDSolve seems to have difficulties with solving integral equation.
> 
> n = 5; NDSolve[{D[\[Sigma]norm[z, t], t] == 3*z*Integrate[\[Sigma]norm[z,
> t]^n*z, {z, 0, 1}] - \[Sigma]norm[z, t]^n,
>      \[Sigma]norm[z, 0] == 1.5*z, \[Sigma]norm[0, t] == 0}*\[Sigma]norm[z,
> t], {z, 0.01, 1}, {t, 0.01, 2}]
> 
> Mathematica returns a message
> 
> NDSolve::"deql": "The first argument must have both an equation and an \
> initial condition."
> 
> which I cannot understand.
> Can anybody tell what's wrong with my attempt?
> 
> -Toshi

I'll show a couple of approaches to this sort of problem. The first is
to iteratively solve for sn[k][z,t] in terms of sn[k-1][z,t], with
sn[0][z,t] initialized to something appropriate (I used 3/2*z). The sn's
are computed as interpolating functions based on results from solving
ODEs in t for many fixed values of z. The code below does this for n=2.
The plots at first appear to flip between two states but eventually
stabilize. Note that this takes many minutes to run to completion.

n = 2;
sn[0][z_,t_] := 3/2*z;
Do [
        Do [
                sn[k][z,t_] = sn[k][z,t] /.
                        First[NDSolve[{D[sn[k][z,t], t] ==
                          3*z*NIntegrate[sn[k-1][w,t]^n*w, {w,0,1}] -
sn[k-1][z,t]^n,
                          sn[k][z,0] == 3/2*z}, sn[k][z,t], {t,0,2}]],
                {z,0,1,1/100}
                ];
        snew = Interpolation[Flatten[Table[{z,t,sn[k][z,t]},
                {z,0,1,1/100}, {t,0,2,1/100}], 1],
InterpolationOrder->7];
        sn[k] = snew;
        Print["iteration ", k];
        Plot3D[sn[k][z,t], {z,0,1}, {t,0,2}],
        {k, 1, 15}
        ]

One can test for convergence as below; it is apparently quite good.

NIntegrate[Abs[sn[15][z,t]-sn[14][z,t]], {z,0,1}, {t,0,2}]

A drawback to this method is that it appears to break down beyond n = 2.
Possibly one simply needs a much better starting function for sn[0], I'm
not sure.

Below is another method that Michael Trott showed me. We expand in a set
of basis functions in z, set up a system of ODEs in t, and solve them. I
tried this using monomials in z for basis functions and ran into some
trouble with the ODE solving, so I will show Michael's attempt using
trig functions for the basis. Note that we now handle the desired case
n=5; another advantage is that this is alot faster than the method
above, though still not exactly blinding in speed. Michael used the
interval {0,2} for z so as to achieve pointwise (not just L^2)
convergence; otherwise there would be a sharp drop-off just before z=1
as all the trigs vanish there. In other words, the basis functions are
of the form Sin[k/2*Pi] rather than Sin[k*Pi] for 1<=k<=deg. Cosines are
excluded due to the vanishing condition at z=0.

integrate[p_Plus, {z_, 0, 1}] := Integrate[#, {z, 0, 1}]& /@ p;
integrate[p_, {z_, 0, 1}] := Integrate[p, {z, 0, 1}];
n = 5;
deg = 6;
vars[t_] = Map[#[t]&,Array[a,deg]];
zFuns = Sin[Range[deg] Pi/2 z];
sn[z_,t_] = vars[t].zFuns;
eqs1 = 3*z*integrate[Expand[sn[w,t]^n*w],{w,0,1}] -
        sn[z,t]^n - D[sn[z,t],t];
eqs2 = integrate[Expand[eqs1 #], {z, 0, 1}]& /@ zFuns;
iCs = integrate[Expand[(sn[z,0] - 3/2*z) #], {z, 0, 1}]& /@ zFuns;  
fulleqns = # == 0& /@ Join[eqs2, iCs];
nsd = NDSolve[fulleqns, vars[t], {t,0,2}, SolveDelayed->True];
Plot3D[Evaluate[sn[z,t] /. nsd[[1]]],{z,0,1},{t,0,2}];

>From here one might try increasing 'deg' or perhaps using the result as
an initializer for the iteration/interpolation method above in an
attempt to refine the solution.


Daniel Lichtblau
Wolfram Research


  • Prev by Date: Re: DSolve for a system of 3 equations
  • Next by Date: Re: CirclePlus precedence and bigoplus
  • Previous by thread: Re: NDSolve with integral equation
  • Next by thread: Re: NDSolve with integral equation