Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I am able to plot a graph of all the differential equations, but I'd like a parametric plot of each individual one. Here is what I have so far.

new = Join[
Table[x[i]''[t] == - x[i][t] + 
  0.1*(x[i + 1][t] - 2*x[i][t] + x[i - 1][t]), {i, 1, 
 9}], {x[0]'[t] == -x[0][t], x[10]'[t] == x[9][t], x[0][0] == 0, 
x[1][0] == 1}, Table[x[i][0] == 0, {i, 2, 10}], 
Table[x[i]'[0] == 1, {i, 1, 9}]];

Solt[i_] = NDSolve[new, Table[x[i][t], {i, 0, 10}], {t, 10}]

Plot[Evaluate[Table[x[i][t], {i, 10}] /. Solt[i_]], {t, 0, 10}]

Table[ParametricPlot[
Evaluate[{x[i][t], x[i]'[t]} /. Solt[i_]], {t, 0, 10}], {i, 1, 10}]

What is wrong with the parametric plot. I've done this one before (without the added forcing term). It won't show up.

share|improve this question
    
That's easy to fix: (a) leave out the underscore in Solt[i_] except in the first instance where you need a pattern in the definition. (b) Leave out the [t] in NDSolve[new, Table[x[i][t]... (I think I added that in my previous answer to your question, but it's not what you were expecting in the post-processing). With the additional [t] argument the replacement rule Solt doesn't get applied to derivatives of the functions.. –  Jens Jun 13 '13 at 2:43
add comment

1 Answer

The problem lies only in the way you define the solution Solt. The index i in Solt[i_] isn't appropriate because Solt is supposed to be a single List.

Apart from this, you have two options to specify what NDSolve returns: either the functions x[i] (which yield numerical values when applied to a numerical argument) or the expressions x[i][t] which yield numerical values when t is simply replaced by a number. From the Plot functions in your example, it is clear that you expect the former, i.e., x[i], because in the second set of plots we need to form the Derivative: x[i]'[t]. This is not matched by a the patterns in Solt if it contains replacement rules of the form x[i][t] -> InterpolatingFunction[{{0.,10.}},<>][t]. So we have to instruct NDSolve to return the solutions as functions:

new = Join[
   Table[x[i]''[t] == -x[i][t] + 
      0.1*(x[i + 1][t] - 2*x[i][t] + x[i - 1][t]), {i, 1, 
     9}], {x[0]'[t] == -x[0][t], x[10]'[t] == x[9][t], x[0][0] == 0, 
    x[1][0] == 1}, Table[x[i][0] == 0, {i, 2, 10}], 
   Table[x[i]'[0] == 1, {i, 1, 9}]];


Solt = NDSolve[new, Table[x[i], {i, 0, 10}], {t, 10}];

Plot[Evaluate[Table[x[i][t], {i, 10}] /. Solt], {t, 0, 10}]

solutions

Table[ParametricPlot[
  Evaluate[{x[i][t], x[i]'[t]} /. Solt], {t, 0, 10}], {i, 1, 10}]

derivatives

This is not the only way to do things, though. If you have instead defined

Solt = NDSolve[new, Table[x[i][t], {i, 0, 10}], {t, 10}];

then it's still possible to do the plots you wanted. We just have to form the desired derivatives of the returned expressions. This can be done using D instead of Derivative (the latter is what the ' operation corresponds to):

Map[
 ParametricPlot[
   Evaluate[{#1, D[#1, t]}],
   {t, 0, 10}] &,
 Table[x[i][t], {i, 10}] /. Solt[[1]]
 ]

which produces the same plot as above. Here I moved the formation of the Table to the end so that the ParametricPlot can use it to pait each x[i][t] with the corresponding derivative.

In the last code snippet, there is another change compared to your code: I replaced Solt by Solt[[1]]. This is because the solution Solt as defined above is a list of lists, and we only want a single list so that the shape of the Table is flat and leads to a list of different ParametricPlots when Map runs over its first level.

share|improve this answer
    
Thanks a lot. I appreciate your help! –  Slightly Jun 13 '13 at 13:49
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.