rslt ← {guess←1+⎕ct} (fn ##.invr) argt ⍝ Inverse of real-valued function.
Suggested by Mike Day, operator [invr] uses the Newton-Raphson method to find a
[rslt], such that:
argt ≡ fn rslt
where operand [fn] is a monadic continuous real-valued function and [argt] is a
numeric array.
The left argument (default 1+⎕ct), is a starting point for the iteration. Some
functions, such as sin←1∘○, are "many-to-one", which means that the inverse
could be any of a number of values. In this case the left argument should be
chosen to be close to the desired one. See the "ArcSin" example below.
The choice of ⎕ct as a default starting point is arbitrary. 0, 1 or ⍵ would be
just as good. 1+⎕ct has the small advantage that it tends to avoid the discont-
inuity at 0, of primitive functions ⍟ and ÷.
Bugs:
With an unfortunate choice of starting value, [invr] may generate a "no inverse"
error or may even fail to terminate.
Examples:
○invr ○ 2 3⍴⍳6 ⍝ inverse of primitive function pi-times.
1 2 3
4 5 6
{⍵+⍵}invr 2 4 6 ⍝ inverse of doubling function.
1 2 3
{2*⍵}invr 16 ⍝ inverse of 2-exp is 2-log
4
{⍵*2}invr 49 ⍝ inverse of square is sqrt.
7
c2f←{32+⍵×1.8} ⍝ define Celsius to Fahrenheit
f2c←c2f invr ⍝ derive Fahrenheit to Celsius
c2f (0 100) (¯40 ¯273.15) ⍝ convert nested array of temperatures.
┌──────┬───────────┐
│32 212│¯40 ¯459.67│
└──────┴───────────┘
f2c (32 212) (¯40 ¯459.67) ⍝ convert using inverse function.
┌─────┬───────────┐
│0 100│¯40 ¯273.15│
└─────┴───────────┘
sin←1∘○ ⍝ Sin(⍵)
sin 10
¯0.54402
arcs←sin invr ⍝ ArcSin(⍵)
arcs sin 10 ⍝ ArcSin(Sin(10)).
68.54
9 arcs sin 10 ⍝ ArcSin(Sin(10)) near 9.
10
See also: limit pow
Back to: contents
Back to: Workspaces