3

I would like to use StopIntegration in WhenEvent, when more than one condition should be checked. For example, in the code below I would like to integrate until either q1[t] == 0 or q2[t] == 0

sol[s_] := 
 NDSolve[{q1'[t] == -q2[t], q2'[t] == q1[t], q1[0] == Cos[s], 
   q2[0] == Sin[s], 
   WhenEvent[
    q1[t] == 0 || q2[t] == 0, {tmax = t, "StopIntegration"}]}, {q1, 
   q2}, {t, 0, 10}]

But it does not work, when I try to check it

Manipulate[
 ParametricPlot[
  Evaluate[{q1[t], q2[t]} /. sol[s], {t, 0, tmax}, 
  PlotRange -> 1], {{s, Pi/4}, 0, 2 Pi}]

although it works perfectly if I leave only one of the conditions. Of course in this simple example I can just write q1[t]q2[t]==0, but I would like to understand how to proceed in general with more complex conditions.

Thank you in advance.

MarcoB
  • 67,153
  • 18
  • 91
  • 189
Ivan
  • 235
  • 1
  • 4
  • 5
    I think you should specify a list of events: WhenEvent[{q1[t] == 0, q2[t] == 0}, {youractions}] . Take a look at the "Scope" section of the WhenEvent docs, under "Events", for a similar example. – MarcoB Jun 10 '15 at 13:05
  • Thanks, it works. But it still a little bit strange for me. For example, q2[t] == 0 && q1[t] > 0 works, but q1[t] > 0 && q2[t] == 0 does not. – Ivan Jun 10 '15 at 13:20
  • I agree! So far I only managed to make one condition per WhenEvent expression work at a time. It would stand to reason that it should accept compound conditions, but either it just doesn't, or I have not found a way to coax it to do it yet... – MarcoB Jun 10 '15 at 22:08
  • 2
    Note that things like f == 0 and f == 0 && pred, also with <, >, and Mod, are special cases in WhenEvent (see http://mathematica.stackexchange.com/questions/39374/inconsistent-behavior-of-whenevent/39393#39393), compared to the general pred, where the "event" is pred changing from False to True. – Michael E2 Jun 10 '15 at 22:21

0 Answers0