Skip to main content

plotting - Piecewise Integration


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?



Answer



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]

Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...