RE: Re: Ball Rolling down on Cosh[t] Path
- To: mathgroup at smc.vnet.net
- Subject: [mg36751] RE: [mg36738] Re: Ball Rolling down on Cosh[t] Path
- From: "DrBob" <drbob at bigfoot.com>
- Date: Sun, 22 Sep 2002 04:32:37 -0400 (EDT)
- Reply-to: <drbob at bigfoot.com>
- Sender: owner-wri-mathgroup at wolfram.com
I've modified Selwyn's solution to make it more general. In particular, the height can be specified (up to about 35 meters). The differential equation is solved for t=0 to 5 first. The quarter-period is computed by finding a zero; then the differential equation is solved again for t=0 to the quarter-period, and the solution is extended using reflection and periodicity. This yields a higher-precision solution. Then I graph the solution, with a stepsize equal to period/40, from t=0 to 'period', labeling each frame with the values of t, x[t], and y[t]. Using a step size that divides period/4 guarantees the lowest point is reached ON a frame when appropriate. Here's the solution as a notebook expression: Notebook[{ Cell[CellGroupData[{ Cell["Borut L's solution:", "Subsubtitle"], Cell[TextData[StyleBox["Having noticed your statement \" ... BEYOND \ MY MEANS \" I thing you aren't yet\nfamiliar with Lagrangian \ formalism. It's quite easy to derive a general\nequation of motion \ for a point mass, subjected to gravity and to moving on a\ncurve f = \ y(x) (i.e. f = Cosh[#]&).\n\n1) I'll leave re-deriving equation to \ you, here is what I've got (just copy\npaste it).:", FontFamily->"Courier New", FontSize->10, CharacterEncoding->"WindowsANSI"]], "Text"], Cell[BoxData[ RowBox[{"selwyn", "=", RowBox[{"First", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"x", "''"}], "[", "t", "]"}], "/.", RowBox[{"Solve", "[", RowBox[{"diffeq", ",", RowBox[{ RowBox[{"x", "''"}], "[", "t", "]"}]}], "]"}]}], "//", "Simplify"}], "]"}]}]], "Input"], Cell[BoxData[ RowBox[{"borut", "=", RowBox[{"First", "[", RowBox[{ RowBox[{ RowBox[{"x", "''"}], "[", "t", "]"}], "/.", RowBox[{"Solve", "[", RowBox[{ RowBox[{"getEq", "[", "Cosh", "]"}], ",", RowBox[{ RowBox[{"x", "''"}], "[", "t", "]"}]}], "]"}]}], "]"}]}]], "Input"], Cell[BoxData[ RowBox[{ RowBox[{"getEq", "[", "f_", "]"}], ":=", "\[IndentingNewLine]", RowBox[{"Simplify", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"x", "''"}], "[", "t", "]"}], "+", RowBox[{ SuperscriptBox[ RowBox[{ RowBox[{"x", "'"}], "[", "t", "]"}], "2"], " ", FractionBox[ RowBox[{"2", " ", RowBox[{ RowBox[{"f", "'"}], "[", RowBox[{"x", "[", "t", "]"}], "]"}], " ", RowBox[{ RowBox[{"f", "''"}], "[", RowBox[{"x", "[", "t", "]"}], "]"}]}], RowBox[{"1", "+", SuperscriptBox[ RowBox[{ RowBox[{"f", "'"}], "[", RowBox[{"x", "[", "t", "]"}], "]"}], "2"]}]]}], "+", FractionBox[ RowBox[{"g", " ", RowBox[{ RowBox[{"f", "'"}], "[", RowBox[{"x", "[", "t", "]"}], "]"}]}], RowBox[{"1", "+", SuperscriptBox[ RowBox[{ RowBox[{"f", "'"}], "[", RowBox[{"x", "[", "t", "]"}], "]"}], "2"]}]]}], "==", "0"}], "]"}]}]], "Input"], Cell[TextData[{ StyleBox["2) Next, you integrate it .:", FontFamily->"Courier New", FontSize->10, CharacterEncoding->"WindowsANSI"], "" }], "Text"], Cell[BoxData[ RowBox[{ RowBox[{"getSol", "[", RowBox[{"f_", ",", RowBox[{"h0_", "?", "Positive"}], ",", RowBox[{"x0_", "?", "Positive"}]}], "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "tStop", "}"}], ",", "\[IndentingNewLine]", RowBox[{"First", "@", RowBox[{"NDSolve", "[", "\[IndentingNewLine]", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"getEq", "[", "f", "]"}], ",", RowBox[{ RowBox[{"x", "[", "0", "]"}], "\[Equal]", "h0"}], ",", RowBox[{ RowBox[{ RowBox[{"x", "'"}], "[", "0", "]"}], "\[Equal]", "0"}]}], "}"}], ",", "\[IndentingNewLine]", "x", ",", "\[IndentingNewLine]", RowBox[{"{", RowBox[{"t", ",", "0", ",", "10"}], "}"}], ",", "\[IndentingNewLine]", RowBox[{"MaxStepSize", "\[Rule]", RowBox[{"1", "/", "100"}]}], ",", RowBox[{"StoppingTest", "\[RuleDelayed]", RowBox[{"If", "[", RowBox[{ RowBox[{"h0", "<", "0"}], ",", RowBox[{"x", ">", "0"}], ",", RowBox[{"x", "<", "0"}]}], "]"}]}]}], "\[IndentingNewLine]", "]"}]}]}], "\[IndentingNewLine]", "]"}]}]], "Input"], Cell["\<\ 3) Here follows animation code, specially for linear versus cosh \ case, apply my initial conditions (below)\ \>", "Text"], Cell[BoxData[ RowBox[{ RowBox[{"makeDuo", "[", RowBox[{"f_", ",", "g_", ",", "h0_"}], "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"solf", "=", RowBox[{"getSol", "[", RowBox[{"f", ",", "h0"}], "]"}]}], ",", RowBox[{"solg", "=", RowBox[{"getSol", "[", RowBox[{"g", ",", "h0"}], "]"}]}], ",", "tf", ",", "tg", ",", "maxT", ",", "minT"}], "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"tf", "=", RowBox[{"solf", "[", RowBox[{"[", RowBox[{ "1", ",", "2", ",", "1", ",", "1", ",", "2"}], "]"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"tg", "=", RowBox[{"solg", "[", RowBox[{"[", RowBox[{ "1", ",", "2", ",", "1", ",", "1", ",", "2"}], "]"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"maxT", "=", RowBox[{"Max", "[", RowBox[{"{", RowBox[{"tf", ",", "tg"}], "}"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"minT", "=", RowBox[{"Min", "[", RowBox[{"{", RowBox[{"tf", ",", "tg"}], "}"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"Do", "[", RowBox[{ RowBox[{"Plot", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"f", "@", "x"}], ",", RowBox[{"g", "@", "x"}]}], "}"}], ",", RowBox[{"{", RowBox[{"x", ",", "0", ",", RowBox[{"ArcCosh", "@", "h0"}]}], "}"}], ",", RowBox[{"AspectRatio", "\[Rule]", "Automatic"}], ",", RowBox[{"Frame", "\[Rule]", "True"}], ",", RowBox[{"Axes", "\[Rule]", "False"}], ",", RowBox[{"Epilog", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{ "AbsolutePointSize", "[", "10", "]"}], ",", RowBox[{"Hue", "[", "0", "]"}], ",", RowBox[{"Point", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"x", "[", "t", "]"}], ",", RowBox[{"f", "@", RowBox[{"x", "[", "t", "]"}]}]}], "}"}], "/.", "solf"}], "]"}], ",", RowBox[{"Hue", "[", ".6", "]"}], ",", RowBox[{"Point", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"x", "[", "t", "]"}], ",", RowBox[{"g", "@", RowBox[{"x", "[", "t", "]"}]}]}], "}"}], "/.", "solg"}], "]"}]}], "}"}]}]}], "]"}], ",", RowBox[{"{", RowBox[{"t", ",", "0", ",", "minT", ",", "minT"}], "}"}]}], "]"}]}]}], "]"}]}]], "Input"], Cell[TextData[{ StyleBox["4) My initial conditions. In my opinion, you weren't true \ on this. Saying \"\nSTARTING FROM THE SAME HEIGHT \" is not enough - \ you should specify x as\nwell, thus specifing starting POINT and not \ just height y.", FontFamily->"Courier New", FontSize->10, CharacterEncoding->"WindowsANSI"], "" }], "Text"], Cell[BoxData[{ RowBox[{"makeDuo", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"Cosh", "[", "1.", "]"}], " ", "#"}], "&"}], ",", RowBox[{ RowBox[{"Cosh", "[", "#", "]"}], "&"}], ",", "23"}], "]"}], "\[IndentingNewLine]", RowBox[{"SelectionMove", "[", RowBox[{ RowBox[{"EvaluationNotebook", "[", "]"}], ",", "All", ",", "GeneratedCell"}], "]"}], "\n", RowBox[{ "FrontEndTokenExecute", "[", "\"\<OpenCloseGroup\>\"", "]"}], "\n", RowBox[{ "FrontEndTokenExecute", "[", "\"\<SelectionAnimate\>\"", "]"}]}], "Input"] }, Open ]] }, FrontEndVersion->"4.2 for Microsoft Windows", ScreenRectangle->{{0, 1024}, {0, 711}}, WindowSize->{815, 569}, WindowMargins->{{0, Automatic}, {Automatic, -1}}, ShowSelection->True ] Bobby Treat -----Original Message----- From: Selwyn Hollis [mailto:slhollis at earthlink.net] To: mathgroup at smc.vnet.net Subject: [mg36751] [mg36738] Re: Ball Rolling down on Cosh[t] Path Matthias, The simplest way to get the equation of motion is to set up the Lagrangian. Let's assume a 1 kg mass. Then the kinetic energy is KE = Simplify[(1/2)*(x'[t]^2 + D[Cosh[x[t]],t]^2)] and the potential energy is PE = 9.8*Cosh[x[t]] The Lagrangian is L = KE - PE and the equation of motion is diffeq = Simplify[ D[D[L, x'[t]], t] ] == Simplify[ D[L, x[t]] ] Now solve and animate ... xx[t_] = x[t]/. First[ NDSolve[{diffeq, x[0] == -1, x'[0] == 0}, x[t], {t, 0, 5}]] curve = Plot[Cosh[x], {x, -1, 1}] Do[ Show[curve, Graphics[Disk[{xx[t], Cosh[xx[t]]}, 0.025]], PlotRange -> {{-1.2, 1.2}, {0.9, 1.65}}, AspectRatio -> Automatic, Axes->None], {t, 0, 5, 0.1}] ---- Selwyn Hollis Matthias.Bode at oppenheim.de wrote: > Dear Colleagues, > > I intend to make an animation in which > > ball A rolls down on an inclined plane from the left whilst > > ball B - starting from the same height - rolls down Cosh[t]'s path from the > right. > > x-axis is time t, y-axis is height h. > > Ball A is fine; ball B - which should arrive at h=0 before A - is beyond my > means. > > Thank you for your consideration, > > Matthias Bode > Sal. Oppenheim jr. & Cie. KGaA > Koenigsberger Strasse 29 > D-60487 Frankfurt am Main > GERMANY > Tel.: +49(0)69 71 34 53 80 > Mobile: +49(0)172 6 74 95 77 > Fax: +49(0)69 71 34 95 380 > E-mail: matthias.bode at oppenheim.de > Internet: http://www.oppenheim.de > >