# TaylorSeries.frink

``` /** This program tries to help you find a Taylor series for a  particular     function around x0. */ use functionUtils.frink use allTransforms.frink symbolicMode[true] showApproximations[false] /** This function finds a Taylor series for a particular function around x0.     x0 can be a symbol, in which case you probably want to wrap it in a     noEval[] block.  */  TaylorSeries[f, x0=0, terms=6, debug=false] := {    body = functionBody[f]    vars = functionArgumentsAsSymbols[f]    var1 = vars@0    if debug       println["var1 is \$var1"]        sum = substituteExpression[body, var1, x0]        if debug       println["sum = " + inputForm[sum]]        d0 = body    for i = 1 to terms-1    {       d0 = transformExpression[constructExpression["FunctionCall", ["D", d0, var1]]]       if debug           println["d0 = " + inputForm[d0]]       d1 = transformExpression[substituteExpression[d0, var1, x0]]       if debug           println["d1 = " + inputForm[d1]]       df = transformExpression[d1 (var1-x0)^i / i!]       sum = sum + df       if debug          println["df = " + inputForm[df] + "\n"]    }    return transformExpression[sum] } // This is the equation for total relativistic energy.  If you expand it with // a Taylor series, you will get the Einsteinian mass-energy relation // //   E = m0 c^2 // // where m0 is the rest mass and c is the speed of light // // plus the Newtonian kinetic energy // //   KE = 1/2 m v^2 // // plus it also contains relativistic expansion terms which you'll see if you // run this program through a Taylor series.  Relativity gives an infinite // expansion of corrective terms! // // If you run this, you'll see that the Taylor series of this is: // c^2 m0 + 1/2 m0 v^2 + 3/8 c^-2 m0 v^4 + 5/16 c^-4 m0 v^6 + 35/128 c^-6 m0 v^8 // // All of this is derived through the Lorentz equation (1/sqrt[1 - v^2/c^2]) f = {|v| (m0 c^2) (1/sqrt[1 - v^2/c^2]) } // This is the equation for relativistic kinetic energy.  It is the // relativistic total energy (above) minus the rest-mass energy "m c^2". // The Taylor series expansion is actually important.  The original equation // is valid for all velocities but has numerical issues if evaluated naively // for low velocities in the given form below.  That's why, for low velocities, // we expand it to a Taylor series which is closer to the classical 1/2 m v^2 // (which you can actually see in the Taylor series expansion) but with // interesting correction terms. // // The Taylor series expansion is: // // 1/2 m v^2 + 3/8 c^-2 m v^4 + 5/16 c^-4 m v^6 + 35/128 c^-6 m v^8 ... // // which converges quickly for low values of v, (so we choose the Taylor series // for low values of v) but converges slowly for high values of v (so we choose // the sqrt[...] formulation for high values of v, which has large errors for // small values of v) which are accurate for high // values of v which don't lose numerical precision from taking a huge // total energy minus a huge restmass-energy. // // An empirical threshold is found around v = 0.13 c, depending on how many // terms of the Taylor series are taken. f = {|v| (m c^2) (1/sqrt[1 - v^2/c^2] - 1) } // This is the equation for the Lorentz transformation. //f = {|v| 1 / sqrt[1 - v^2/c^2] } // This has an elegant Taylor series expansion. //f = {|x| 1/(1-x) } // This is the classic example //f = {|x| e^x } println["The Taylor series for " + inputForm[functionBody[f]] + " is:"] println[inputForm[TaylorSeries[f, 0, 10, false]]] ```

This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 19032 days, 7 hours, 57 minutes ago.