3
$\begingroup$

So I have a function myfun with positive domain that I got from NDSolve and a bunch of transformations afterwards. I can plot it on its own like

Plot[myfun[t], {t, 0, 6}]

but when I try to insert it into a Piecewise function like

Plot[Piecewise[{{myfun[t], t > 0 && t < 6}}], {t, -6, 6}]

or

Plot[Piecewise[{{myfun[t], t > 0 && t < 6}, {1, t<=0}}], {t, -6, 6}]

it gives me warnings

InterpolatingFunction::dmval: Input value {-5.99975} lies outside the range of data in the interpolating function. Extrapolation will be used. >>

and doesn't plot the function myfun.

What is even more weird, I was unable to create a minimal working example, because something like

Plot[Piecewise[{{Interpolation[{1, 2, 3, 5, 8, 5}][t], 
t > 0 && t < 6}}], {t, -6, 6}]

works just fine!

What could be the problem here?

EDIT:

Plot[Piecewise[{{Sqrt[Interpolation[{1, 2, 3, 5, 8, 5}][t]], t > 1 && t < 6}}], {t, -6, 6}]

generates the same warnings, but does draw the plot. (Note that domain and range of the function under square root are positive.)

EDIT 2: Here's reduced code that has the problem

soln = NDSolve[{y'[t] == 1/(1/(1 + Cos[y[t]]))^2, y[0] == 0}, y, {t, 0, 10}]

pw = Piecewise[{{1, t < 0}, {y[t] /. soln, t > 0}}]

Now

Plot[pw /. x -> t, {t, 0, 10}, PlotRange -> All]

works but

Plot[pw /. x -> t, {t, -1, 10}, PlotRange -> All]

doesn't.

$\endgroup$
2
  • $\begingroup$ Can you find a (hopefully simpler) NDSolve[]-generated InterpolatingFunction[] that generates that error? $\endgroup$
    – J. M.'s torpor
    Dec 15 '16 at 1:46
  • 1
    $\begingroup$ No warning in v8.0.4 and v9.0.1 with the code in EDIT. $\endgroup$
    – xzczd
    Dec 15 '16 at 8:38
3
$\begingroup$

Edit to add fix for plot not appearing

I think the issue here is the way you are evaluating the Piecewise function. If you look at the Scope part of the Piecewise documentation it says that to evaluate a piecewise funtion you should use a ReplaceAll, like this:

pw = Piecewise[{{Sin[x]/x, x < 0}, {1, x == 0}}, -x^2/100 + 1];
pw /. {{x -> -5}, {x -> 0}, {x -> 5}}
(*{Sin[5]/5, 1, 3/4}*)

This way the piecewise is constructed, then the variable (in this case x) is input. The way you have written it substitutes the variable and then constructs the piecewise. So to make your plot work correctly, you could write this:

p = Piecewise[{{Sqrt[Interpolation[{1, 2, 3, 5, 8, 5}][t]], t > 1 && t < 6}}];
Plot[p /. {t -> x}, {x, -6, 6}]

Piecewise plot

To fix the issue with incorrect evaluation, again I think you need to define the piecewise function in the correct order. In the original code (apologies for screenshot, formatting the symbol is hard):

Piecewise1

Notice the curly brackets (List) around the interpolating function? If you use First to get rid of this the plot works. Also note that in the ReplaceAll you should replace the variable in the piecewise function (i.e. t) with the variable you are plotting over (i.e. x) rather than the other way round. So the result:

soln = NDSolve[{y'[t] == 1/(1/(1 + Cos[y[t]]))^2, y[0] == 0}, y, {t, 0, 10}];
pw = Piecewise[{{1, t < 0}, {First[y[t] /. soln], t > 0}}];
Plot[pw /. t -> x, {x, -1, 10}, PlotRange -> {{-1, 10}, All}]

Plot

$\endgroup$
2
  • $\begingroup$ Thanks, this does make the warnings go away, but my original problem persists (see EDIT 2). $\endgroup$
    – Minethlos
    Dec 15 '16 at 15:37
  • $\begingroup$ Edited to add detail $\endgroup$
    – lowriniak
    Dec 15 '16 at 16:00
3
$\begingroup$

Only simple fixes are needed.

Regarding the first edit - add Evaluate:

Plot[Evaluate@
  Piecewise[{{Sqrt[Interpolation[{1, 2, 3, 5, 8, 5}][t]], 
     t > 1 && t < 6}}], {t, -6, 6}]

enter image description here

Regarding the second edit - add First; no need for replacements in either case:

soln = First@
   NDSolve[{y'[t] == 1/(1/(1 + Cos[y[t]]))^2, y[0] == 0}, 
    y, {t, 0, 10}];
pw = Piecewise[{{1, t < 0}, {y[t] /. soln, t > 0}}];
plot2 = Plot[pw, {t, -1, 10}, PlotRange -> All]

enter image description here

Either one of the fixes, or both combined should work for your original problem as well.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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