  lua-l archive

• Subject: Re: Fun math puzzle: cin(X)
• From: Dirk Laurie <dirk.laurie@...>
• Date: Tue, 9 Apr 2019 06:08:48 +0200

```Op Di. 9 Apr. 2019 om 00:09 het Albert Chan <albertmcchan@yahoo.com> geskryf:
>
>
> > On Apr 4, 2019, at 5:25 PM, Egor Skriptunoff <egor.skriptunoff@gmail.com> wrote:
> >
> > The most straightforward approach is
> > to build Taylor series of cin(x) one term at a time.
> >
> >    function maclaurin_of_cin(k)
> >       for n = #c + 1, k do
> >          a = {}
> >          local e, h = f(c), f(d)
> >          s, a = -s/(2*n)/(2*n+1)
> >          local t = (s-h-e)/3
> >          assert(math.abs(t) < 0.056)
> >          c[n], d[n] = t, e + 2*t
> >       end
> >       return c[k]
> >    end
>
> Say, I wanted a function, din(x), such that din(din(din(din(x)))) = sin(x)
>
> What is required to modify above to do maclaurin_of_din(k) ?

I can't speak for the code, but the usual method is equivalent to
Newton's method for roots, applied to functions. It will work for any
function s whose Maclaurin series starts at x.

The well-known algorithm for square roots of real numbers is
x ← x + (a/x-x)/2.
For n-th roots, it becomes
x ← x + (a/x^(n-1)-x)/n
For n-th root of a function, it becomes:
f ← f + (g(g(...(s)))-f)/n    -- n-1 applications of g
where g is the inverse function of f.

You can do this analytically, but usually for one step only; the
inverse function soon starts to become intractable.

Examples for din:
f(x)=x, g(x)=x, next approximation is x + (sin(x)-x)/3
f(x) = 2*sin(x/2), g(x)=2*asin(x/2), next approximation is
2*sin(x/2) + (2*asin(2*asin(2*asin(sin(x)/2)/2)/2)-2*sin(x/2))/4

This second approximation is not bad at all, applied four times
starting at 1 gives 0.84465, should be 0.84147. You can draw a
reasonable graph with that. Applied four times at pi/2, gives 1.058,