# Using Multiple Initial Conditions

Basically, I have a set of differential equations that I need to solve for exactly 100 different initial conditions (given as lists for each initial condition), and then plot each solution.

Here is some sample code where I have set vrad, vtan, and deltaR (arrays of initial conditions) to an array of length two. So, given the arrays vrad, vtan, deltaR (our initial conditions) I want to be able to essentially do what this code does but for the array of solutions. Cheers!

Edit: I think I've nearly done it, I just need Table to not iterate through every tuple, but instead by index, anyone know how to do this?

(* Scaling Quantities *)
V = 200;
R = 10^4;
(* Random Quantities *)
vtan = {0, 5};
deltaR = {0, 5};
(* Converting to dimensionless quantities *)
vTangential = (V + vtan)/V;
r0 = (10^4 + deltaR)/R;
L = r0*vTangential;
(* numerical solution *)
s = Partition[
Flatten@Table[
NDSolve[{r''[t] == r[t]*ϕ'[t]^2 - 1/r[t], ϕ'[t] == d/
r[t]^2, ϕ[0] == a, r[0] == b,
r'[0] == c}, {r, ϕ}, {t, 0, 200}], {a, vTangential/r0}, {b,
r0}, {c, vRadial}, {d, L}], 2]
(* Plotting the solution *)
ParametricPlot[
Evaluate[{r[t]*Cos[ϕ[t]], r[t]*Sin[ϕ[t]]} /. s], {t, 0,
2*Pi}, GridLines -> Automatic, Frame -> True]

• Also, what iteration would you like to perform? With even two examples, someone on this list might be able to help. Are you trying to loop through vrad, vtan, and deltaR from 0 to 5 by some amount (.05, for example)? And then, do you want to get a solution for when they are all zero, then .05, then .1, etc? – Mark R Mar 13 '20 at 2:05
• So I want to go by index i.e. take the first element of each array, then the second element of each array, and so on (producing a solution for each index). In this case, initial conditions I want are (0,0,0,0) and (5,5,5,5) – charl1e Mar 13 '20 at 2:09
• Table goes through all possible combinations of the independent variables (as you are seeing). – Mark R Mar 13 '20 at 2:10
• Yep, so is there a simple/alternative way to go by index? – charl1e Mar 13 '20 at 2:10
• Something like this might give you what you want:Transpose@ConstantArray[Range[0, 10], {3}] – Mark R Mar 13 '20 at 2:11

I think this will do what you want:

s = NDSolve[{r''[t] ==
r[t]*\[Phi]'[t]^2 - 1/r[t], \[Phi]'[t] == #[[4]]/r[t]^2, \[Phi][
0] == #[[1]], r[0] == #[[2]],
r'[0] == #[[3]]}, {r, \[Phi]}, {t, 0, 200}] & /@


Your current solution has only 2 values for each of these but it extends to as many as you'd like.

And here is the picture:

• Amazing. Thank you for your patience :) – charl1e Mar 13 '20 at 2:25

An alternative approach:

1. If you use ParametricNDSolveValue you don't have run NDSolve for each 4-tuple of input parameters.
2. Using the function you want to plot as the second argument of ParametricNDSolveValue you can use the output directly in plot functions without additional processing.
ClearAll[pndsv]
pndsv = ParametricNDSolveValue[{r''[t] == r[t]*ϕ'[t]^2 - 1/r[t], ϕ'[t] == d/r[t]^2,
ϕ[0] == a, r[0] == b, r'[0] == c},
{r[#] Cos[ϕ[#]], r[#] Sin[ϕ[#]]} &,
{t, 0, 200},
{a, b, c, d}];

params = Transpose[{vTangential/r0, r0, vRadial, L}];

ParametricPlot[Evaluate[pndsv[##][t] & @@@ params], {t, 0, 2  Pi},
GridLines -> Automatic, Frame -> True]


Interactively set up to 10 sets of parameters using control label styles as legend for the curves shown:

k = 10;
Manipulate[ParametricPlot[Evaluate[pndsv[##][t] & @@@ Take[psets, n, 4]], {t, 0, 2  Pi},
GridLines -> Automatic, Frame -> True, ImageSize -> 400, AspectRatio -> 1],
{{psets, ConstantArray[1., {k, 4}]}, None},
{{n, 3}, 1, 10, 1},
Dynamic[Panel[Grid[Prepend[#, {"params", "a", "b", "c", "d"}] &@
MapIndexed[Prepend[#, #2[[1]]] &, Outer[Manipulator[Dynamic[psets[[#1, #2]]], {0, 3},
Appearance -> "Labeled", ImageSize -> Tiny] &, Range[n], Range[4]]],
FrameStyle -> LightGray,
Background -> {None, None, {# + 1, 1} -> ColorData[97]@# & /@ Range[n]},
Dividers -> {{False, True}, {False, True}}]]],
Alignment -> Center]