Re: NDSolve and vector functions
- To: mathgroup at smc.vnet.net
- Subject: [mg87881] Re: NDSolve and vector functions
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Sat, 19 Apr 2008 03:35:02 -0400 (EDT)
- Organization: University of Bergen
- References: <fu9vl0$ie2$1@smc.vnet.net>
dh wrote: > Hello all, > > does anybody know a way to compute a vector valued function using > > NDSolve without explicitely specifying all vector components. Here is a > > simple example: Although NDSolve[{p'[t]==p[t],p[0]=={1,0}},p,{t,0,1}] works, > > NDSolve[{p'[t]==p[t]+{1,1},p[0]=={1,0}},p,{t,0,1}] > > does not work because p[t] in "p[t]+{1,1}" is treated as a scalar and > > the expression is evaluated to {1+p[t],1+p[t]} what is clearly not > > intended. Even in "IdentityMatrix[2].p[t]+{1,1}" > > "IdentityMatrix[2].p[t]" is treated like a scalar and added to the > > components of {1,1}. > > do I miss something??? Hi Daniel, Obviously, there are workarounds, but they might not be pretty ... I think that this is a fundamental limitation of Mathematica ... Most functions (incuding Plus) assume that symbols represent scalars ... A workaround is to define a new `plus' function that is only evaluated when its arguments are vectors: vecPlus[arg__?VectorQ] := Plus[arg] Now this works: f = p /. First@ NDSolve[{p'[t] == vecPlus[p[t], {1, 1}], p[0] == {1, 0}}, p, {t, 0, 1}] Plot[f[x], {x, 0, 1}] One disadvantage of this approach is that it prevents NDSolve from transforming the ODE symbolically. But this is really a limitation stemming from using vector functions, and not a problem introduced by vecPlus. A more serious problem is that most probably vecPlus cannot be compiled, so this might slow NDSolve down. Szabolcs