2
$\begingroup$

I am trying to integrate a piecewise defined function twice. It represents the acceleration of a projectile. I am obtaining it's position as a function of time if it starts from rest at the ground, accelerates upward with a constant acceleration of 2.25 and then falls freely after 21.6 seconds. The code I am using to represent the scenario,

a[t_] := Piecewise[{{2.25, t < 21.6}, {-9.8, t > 21.60}}]
v[t_] := Integrate[a[s], {s, 0, t}]
x[t_] := Integrate[v[x], {x, 0, t}]
Plot[a[t], {t, 0, 30}]
Plot[v[t], {t, 0, 30}]
Plot[x[t], {t, 0, 30}]

Sometimes it will give me all three graphs, but usually it will just give me the first two, without the third. It then tells me,

Integrate::pwrl: Unable to prove that integration limits {0,x} are real. Adding assumptions may help. >>

I noticed that if I usually let Mathematica run long enough it will eventually spit out the last graph. I am just curious what is going on. I imagine it has something to do with an integration constant and Mathematica not able to tell what interval the piecewise function is on, but I am not quite sure if I can pint it down.

Any ideas? Or is there a better way to do what I am trying to do?

$\endgroup$
1
  • $\begingroup$ Integrate[v[x], {x,0,t}, Assumptions->{t \[Element] Reals}] to make it assume the variable argument is a real number. $\endgroup$
    – IPoiler
    Commented Sep 22, 2015 at 1:05

2 Answers 2

2
$\begingroup$

In this case using Set, so that the integrals are evaluated at the time that v and x are defined, instead of SetDelayed helps with the speed, assumming t has no value. If t has a value, one can use Block as shown below to temporarily block the value while a, v, and x are defined. The increase in speed is due to the ability of Mathematica to evaluate the integrals symbolically in the OP's case. The two integrals are evaluated only once, at the time the functions are defined. Using SetDelayed means the integrals will be recalculated at each value of t, so that the integral is done many times.

One still needs to add an assumption that t is real in the integral to prevent the error Integrate::pwrl.

Clear[a, v, x];
Block[{t},
  a[t_] = Piecewise[{{2.25, t < 21.6}, {-9.8, t > 21.60}}];
  v[t_] = Integrate[a[s], {s, 0, t}, Assumptions -> t \[Element] Reals];
  x[t_] = Integrate[v[x], {x, 0, t}, Assumptions -> t \[Element] Reals];
 ];
Plot[a[t], {t, 0, 30}]
Plot[v[t], {t, 0, 30}]
Plot[x[t], {t, 0, 30}, Exclusions -> None]
$\endgroup$
2
  • $\begingroup$ This is exactly what I was looking for. Thank you. Does that mean by default the Integrate function tries to integrate over the complex plane? $\endgroup$ Commented Sep 22, 2015 at 1:40
  • 2
    $\begingroup$ @GrantMoore Yes. In fact, in most instances the default for Mathematica symbolic functions is to assume the variables and parameters are complex variables. $\endgroup$
    – Michael E2
    Commented Sep 22, 2015 at 1:44
1
$\begingroup$

Personally, whenever I do piecewise functions I like for them to be just one function. What I mean by that is that I use HeavisideTheta[] functions to multiply the piecewise portions by either one or zero depending on the t value.

If you aren't familiar with Heaviside functions, HeavisideTheta[t] would be zero before 0 and 1 for all values after it. HeavisideTheta[t]-HeavisideTheta[t-5] would be 1 from 0 to 5 but 0 everywhere else.

For your function, I would write it as:

a[t_] := 2.25*(HeavisideTheta[t] - HeavisideTheta[t - 21.6]) + 
  HeavisideTheta[t - 21.6]*-9.8
v[t_] := Integrate[a[s], {s, 0, t}]
x[t_] := Integrate[v[x], {x, 0, t}]
Plot[a[t], {t, 0, 30}]
Plot[v[t], {t, 0, 30}]
Plot[x[t], {t, 0, 30}]

The resulting plots worked fine for me, but for some reason the last one took a while to generate. Doing the integration separately was fast though, so I'm not sure what caused this.

This method can sometimes lead to issues in certain circumstances because there technically is a discontinuity when the Heaviside function is exactly the value at which is switches--in the past I've had to find local min and max with numeric methods because the built in functions didn't like the discontinuity.

enter image description here

$\endgroup$
3
  • $\begingroup$ Please, Post your Code als copyable, not as picture! $\endgroup$
    – user9660
    Commented Sep 22, 2015 at 4:42
  • $\begingroup$ It was op's code I just changed the first line. I'll add the rest of his code for others. Thanks for the feedback. $\endgroup$
    – Brian G
    Commented Sep 22, 2015 at 4:46
  • $\begingroup$ Well done, thank you! +1 $\endgroup$
    – user9660
    Commented Sep 22, 2015 at 8:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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