⍝ Function power limit (fixpoint):

    ⎕pp←5 ⋄ ⎕io←1 ⋄ 1
1
    enlist← {1↓↑,/'·',,,¨⍵}limit    ⍝ Expensive alternative to primitive: ∊.
    enlist ,∘⊂/⍳5
1 2 3 4 5

    0.5∘× limit 2                   ⍝ Fixpoint of halving function.
0

⍝   Fix this test so that it works for both complex and vanilla interpreters:
⍝
⍝      ⍝ Note that a function can have more than one fixpoint:
⍝
⍝      *∘(÷3) limit¨¯2 2            ⍝ Two fixpoints of cube root function.
⍝¯1 1
    ⍝ Operator: <nr> returns the next term in a Newton-Raphson approximation:

    nr←{⍺←⎕CT           ⍝ Newton-Raphson.
        y ∆y←⍺⍺¨0 ⍺+⊂⍵  ⍝ f(x), f(x+∆)
        ⍵+(⍺×y)÷y-∆y    ⍝ next estimate.
    }

    1∘○ nr limit 3 6 9              ⍝ Roots of Sin(x) near x=3, x=6, x=9.
3.1416 6.2832 9.4248

⍝ Gianluigi Quario suggests the following example for finding the Arithmetic-
⍝ Geometric Mean (AGM).
⍝
⍝ The arithmetic-geometric mean of two numbers M and N is defined by starting
⍝ with a(0)←M  and  g(0)←N, then iterating:
⍝
⍝   a(n+1) ← arithmetic mean of a(n) and g(n)
⍝   g(n+1) ← geometric  mean of a(n) and g(n)
⍝       until
⍝   a(n)=g(n)

    AM←{(+/⍵)×÷⍴,⍵}                 ⍝ Arithmetic mean.
    GM←{(×/⍵)*÷⍴,⍵}                 ⍝ Geometric  mean.
    AGM←{⍬⍴{(AM ⍵),GM ⍵}limit ⍵}    ⍝ Arithmetic-geometric mean.

    AM 1 2 3 4 5
3
    GM 1 2 3 4 5
2.6052
    AGM 1 2 3 4 5
2.7991
    ÷AGM 1 2*÷2                     ⍝ Gauss's constant.
0.83463

⍝ Gianluigi's second example calculates ArcTan by similar means. (Acton, F.S.
⍝ "The Arctangent." In Numerical Methods that Work, upd. and rev. Washington,DC:
⍝ Math. Assoc. Amer., pp. 6-10, 1990.)

    ArcTan←{
        ⍝ Inverse trigonometric tangent - gqr 19-11-2002.
        ⍝ For scalar ⍵: (ArcTan ⍵)≡¯3○⍵
        ⍝
        ⍝ Limit's operand function returns a 2-vector. Repeated application
        ⍝ of the function produces two sequences, both of which converge and
        ⍝ have the same limit:
        ⍝
        ⍝    A≡ {a(0),a(1), ... , a(n), ...   }
        ⍝    G≡ {g(0),g(1), ... , g(n), ...   }
        ⍝
        ⍝  Starting with arguments:
        ⍝       a(0)←(1+⍵*2)*-÷2  and  g(0)←1
        ⍝  the iteration produces:
        ⍝       a(n+1)← arithmetic mean of a(n)   and g(n)
        ⍝       g(n+1)← geometric  mean of a(n+1) and g(n)
        ⍝  until:
        ⍝   a(n+1)=a(n) and g(n+1)=g(n) and a(n+1)=g(n+1)

        next←{                          ⍝ next term in sequence.
            AM←{(+/⍵)×÷⍴⍵}              ⍝ arithmetic mean.
            GM←{(×/⍵)*÷⍴⍵}              ⍝ geometric  mean.
            (AM ⍵),GM(AM ⍵),1↓⍵
        }
        start←⍬⍴(1+⍵*2)*-÷2
        finish←⍬⍴next limit start,1     ⍝ calculated limit
        ⍬⍴⍵×start÷finish
    }

    ArcTan 0.5                      ⍝ method using limit ...
0.46365

    ¯3○0.5                          ⍝ ... agrees with primitive function.
0.46365

    ⍬⍴{⍵×2-¯1↑⍵} limit 20 0.3       ⍝ Univac division algorithm.
66.667

Back to: code

Back to: Workspaces