       Re: Re: NDSolve problem with switching

• To: mathgroup at smc.vnet.net
• Subject: [mg106219] Re: [mg106183] Re: [mg106163] NDSolve problem with switching
• From: DrMajorBob <btreat1 at austin.rr.com>
• Date: Tue, 5 Jan 2010 01:47:03 -0500 (EST)
• References: <201001030842.DAA10093@smc.vnet.net>

```Here are simpler choices for the box wave.

box[x_] = Piecewise@{{1, FractionalPart@x < .5}}
Plot[box@t, {t, 0, 2}]

or

box = If[FractionalPart@# < .5, 1, 0] &;

But, strangely enough, they don't speed things up in NDSolve.

Clear[y1, y2]
eqns = {y1'[t] == y2[t],
y2'[t] == 1000 (1 - y1[t]^2) (y2[t] - y1[t] UnitStep@Sin[2 Pi t]),
y1 == 0, y2 == 1};
errors = Take[eqns, 2] /. Equal -> Subtract;
First@Timing[{y1, y2} = {y1, y2} /. First@
NDSolve[eqns, {y1, y2}, {t, 0, 2}]]
Plot[{y1@t, y2@t}, {t, 0, 1}, AxesOrigin -> {0, 2},
PlotStyle -> {Red, Blue}]

0.021479

Clear[y1, y2]
box = If[FractionalPart@# < .5, 1, 0] &;
eqns = {y1'[t] == y2[t],
y2'[t] == 1000 (1 - y1[t]^2) (y2[t] - y1[t] box@t), y1 == 0,
y2 == 1};
errors = Take[eqns, 2] /. Equal -> Subtract;
First@Timing[{y1, y2} = {y1, y2} /. First@
NDSolve[eqns, {y1, y2}, {t, 0, 2}]]
Plot[{y1@t, y2@t}, {t, 0, 1}, AxesOrigin -> {0, 2},
PlotStyle -> {Red, Blue}]

0.020186

Bobby

On Mon, 04 Jan 2010 05:00:04 -0600, Haibo Min <haibo.min at gmail.com> wrote:

> Thank you very much, Bobby. I think it is really a brilliant solution. As
> for the slow plotting in the second case, I think it is due to your
> second
> explanation (Plot is working hard to identify features).
>
> Best regards,
>
> Haibo
>
>
>
>
> On Mon, Jan 4, 2010 at 9:08 AM, DrMajorBob <btreat1 at austin.rr.com> wrote:
>
>> First, we need a square wave of amplitude one, zero up to 0.5, 0 from
>> .05
>> to 1.0, with period 1.
>>
>> The following will do well enough:
>>
>> Plot[UnitStep@Sin[2 Pi t], {t, 0, 2}]
>>
>> So here's a solution with NDSolve:
>>
>> Clear[y1, y2]
>> eqns = {y1'[t] == y2[t],
>>   y2'[t] == 1000 (1 - y1[t]^2) (y2[t] - y1[t] UnitStep@Sin[2 Pi t]),
>>
>>   y1 == 0, y2 == 1};
>> errors = Take[eqns, 2] /. Equal -> Subtract;
>> {y1, y2} = {y1, y2} /. First@
>>    NDSolve[eqns, {y1, y2}, {t, 0, 2}];
>> Plot[{y1@t, y2@t}, {t, 0, 1}, AxesOrigin -> {0, 2},
>>  PlotStyle -> {Red, Blue}]
>>
>> Accuracy is good for most of the graph:
>>
>> Plot[Norm@errors, {t, .015, 2}, PlotRange -> All]
>>
>> But not all:
>>
>> Plot[Norm@errors, {t, 0, .015}, PlotRange -> All]
>>
>> (Very interesting plots!)
>>
>> Increasing WorkingPrecision works well:
>>
>> Clear[y1, y2]
>> eqns = {y1'[t] == y2[t],
>>   y2'[t] == 1000 (1 - y1[t]^2) (y2[t] - y1[t] UnitStep@Sin[2 Pi t]),
>>
>>   y1 == 0, y2 == 1};
>> errors = Take[eqns, 2] /. Equal -> Subtract;
>> {y1, y2} = {y1, y2} /. First@
>>    NDSolve[eqns, {y1, y2}, {t, 0, 1}, WorkingPrecision -> 40];
>> Plot[{y1@t, y2@t}, {t, 0, 1}, AxesOrigin -> {0, 1},
>>  PlotStyle -> {Red, Blue}]
>>
>> Do the error plots again, and you'll find they're very slow.
>>
>> ecause the interpolations involve a lot of points? Because Plot is
>> working
>> hard to identify features?
>>
>> I'm not sure.
>>
>> Bobby
>>
>>
>> On Sun, 03 Jan 2010 02:42:43 -0600, Haibo Min <haibo.min at gmail.com>
>> wrote:
>>
>> Hello, everyone.
>>>
>>> I am trying to solve a switching ND problem using NDSolve.
>>> Specifically,
>>> suppose the system equation is
>>>
>>> y1'[t]==y2;
>>> y2'[t]==1000(1-y1^2)y2-y1;
>>>
>>> y1(0)==0;y2(0)==1;
>>>
>>> Then every half a second (0.5s), the system equation transforms to
>>>
>>>  y1'[t]==y2;
>>> y2'[t]==1000(1+y1^2)y2;
>>>
>>> and then, after 0.5s, it transforms back again.
>>>
>>> How to address this problem?
>>>
>>> Thank you!
>>>
>>> haibo
>>>
>>>
>>
>> --
>> DrMajorBob at yahoo.com
>>
>
>

--
DrMajorBob at yahoo.com

```

• Prev by Date: Re: More /.{I->-1} craziness
• Next by Date: Re: Re: Re: More /.{I->-1} craziness
• Previous by thread: Re: NDSolve problem with switching equations
• Next by thread: Re: NDSolve problem with switching