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>
- Reply-to: drmajorbob at yahoo.com
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] == 0, y2[0] == 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] == 0, y2[0] == 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] == 0, y2[0] == 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] == 0, y2[0] == 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
- References:
- NDSolve problem with switching equations
- From: Haibo Min <haibo.min@gmail.com>
- NDSolve problem with switching equations