MathGroup Archive 2003

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

Search the Archive

Re: Immediate or Delayed Definitions in NDSolve?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg45078] Re: Immediate or Delayed Definitions in NDSolve?
  • From: "Peltio" <peltio at twilight.zone>
  • Date: Tue, 16 Dec 2003 06:21:03 -0500 (EST)
  • References: <brchoh$2nt$1@smc.vnet.net>
  • Reply-to: "Peltio" <peltioNOSP at Miname.com.invalid>
  • Sender: owner-wri-mathgroup at wolfram.com

"extrabyte" wrote

>Method 1 (Delayed Definition)
>eq[a_] := y''[x] + a^2*y[x] == 0;
>sol[a_] := NDSolve[{eq[a], y[0] == 1, y'[0] == -1}, y, {x, 0, 10}]

>sol[a]
>    NDSolve::"ndnum": "Encountered non-numerical value

As we have already seen, you can use either an immediate or a delayed
assignment as long as you provide a numerical value to all of the parameters
included in your ODE.
The immediate assignment is fast, but requires that you input the numerical
values directly

    ode[a_] := y''[x] + a^2*y[x] == 0;
    f[x_] = y[x] /.  NDSolve[
        {ode[1], y[0] == 1,y'[0] == -1}, y[x], {x, 0, 10}][[1]]

    data = Table[{x, f[x]} , {x, 0, 1, 10^-3}]
        -table here -

Since you want a procedure that accepts the parameter a and the initial
values as arguments you can use a (rather inefficient) delayed assignment

    ode[a_] := y''[x] + a^2*y[x] == 0;
    f[a_, {y0_,yp0_}, x_] := y[x] /. NDSolve[
        {ode[1], y[0] == y0,y'[0] == yp0}, y[x], {x, 0, 10}][[1]]
    data[a_, {y0_,yp0_}] := Table[{x, f[a, {y0,yp0}, x]} /. x -> t, {t, 0,
1, 10^-3}]

    data[1,{1,-1}]
        -table here -

To overcame the efficiency problems we can use a mixed assignment, by
decoupling the parameters a, y0 e yp0 from the variable x. A pure function
and the notation f[params][vars] come in handy:

    ode[a_] := y''[x] + a^2*y[x] == 0;
    f[a_, {y0_,yp0_}] := y /. NDSolve[
        {ode[1], y[0] == y0,y'[0] == yp0}, y, {x, 0, 10}][[1]]
    data[a_, {y0_,yp0_}] :=
        (
            g = f[a, {y0,yp0}];
            Table[{x, g} , {x, 0, 1, 10^-3}]
        )

    data[1,{1,-1}]
        -table here -

So, my question to the group is: is there a neater way to do this?

cheers,
Peltio
--
invalid address in reply-to. Crafty deminging required to mail me.






  • Prev by Date: Re: Mathematica 5 hangs when rendering plots with large numbers
  • Next by Date: Re: boundary condition for NDSolve
  • Previous by thread: RE: Immediate or Delayed Definitions in NDSolve?
  • Next by thread: Re: Immediate or Delayed Definitions in NDSolve?