hp41programs

RatFunInter

Rational Function Interpolation for the HP-41


Overview
 

-The following program uses Thiele's formula:

-Given n data points  ( x1 , y1 ) , ( x2 , y2 ) , .................. , ( xn , yn ) ,   the rational function f(x) is evaluated by the continued fraction:

                       x - x1     x - x2      x - x3                                       x - xn-1
  f(x) =   y1 +  ------    -------    --------   ...............................  ---------
                       r12 +      r123 +     r1234 +                                      r12......n
 

  where  r1k = ( xk - x1 )/( yk - y1 )  ,    r12k = ( xk - x2 )/( r1k - r12 )  ,   r123k = ( xk - x3 )/( r12k - r123 )  , .............. ,  r12....n = ( xn - xn-1 )/( r12...n - r12...n-1 )
 

-Thus,  f(x) = p(x)/q(x)   where  deg(p) = deg(q)         if  n is odd
                                        and   deg(p) = deg(q) + 1   if n is even      ( the degrees may of course be smaller if some leading coefficients equal zero )

-However, if n is even, you may prefer:   deg(p) = deg(q) - 1
-In this case, simply set flag F02 and the above formula will be applied to 1/y
-But this will work only if all y-values are different from zero.

-"THIELE" uses synthetic registers M N O P Q  which can be replaced by any unused data registers.
 

Program Listing
 

Data Registers:           •  R00 = n                                                     ( Registers R00 thru R2n  are to be initialized before executing "THIELE"  )

                                      •  R01 = x1    •  Rn+1 = y1
                                      •  R02 = x2    •  Rn+2 = y2       R2n+1 = r12
                                         ---------        ----------         R2n+2 = r13     R3n = r123
                                         ---------        ----------         ------------       ---------

                                      •  Rnn = xn    •  R2n   = yn        R3n-1 = r1n     R4n-3 = r12n  ---------  R(n2+3n)/2 = r12.....n

Flags:  F01-F02-F10   Set flag F01 after executing the routine once: it will avoid to re-calculate the reciprocal differences.
                                     Set flag F02 if you prefer that the degree of the numerator is smaller than the degree of the denominator ( if n is even )
Subroutines: /
 
 

  01  LBL "THIELE"
  02  STO M
  03  RCL 00
  04  RCL 00
  05  3
  06  +
  07  *
  08  2
  09  /
  10  FS? 01
  11  GTO 03
  12  CF 10
  13  FS? 02
  14  SF 10
  15  RCL 00
  16   E3
  17  /
  18  STO O
  19  .999
  20  +
  21  STO N
  22  SIGN
  23  RCL 00 
  24  +
  25  STO P 
  26  STO Q
  27  RCL 00          
  28  +
  29  ISG Q
  30  LBL 01
  31  RCL N
  32  INT
  33  ISG X
  34  CLX
  35  RCL O
  36  FRC
  37  +
  38  STO O
  39  X<>Y
  40  LBL 02
  41  RCL IND N
  42  RCL IND O
  43  -
  44  RCL IND P
  45  FS? 10
  46  1/X
  47  RCL IND Q  
  48  FS? 10
  49  1/X
  50  -
  51  /
  52  STO IND Y
  53  CLX
  54  SIGN
  55  ST+ Q
  56  +
  57  ISG O
  58  GTO 02
  59  CF 10
  60  RCL Q
  61  STO P 
  62  SIGN
  63  ST+ Q
  64  X<>Y
  65  ISG N
  66  GTO 01
  67  LASTX
  68  LBL 03
  69  STO O
  70  RCL 00
  71  STO N
  72  SIGN
  73  ST- N
  74  0
  75  LBL 04
  76  RCL IND O  
  77  +
  78  RCL M
  79  RCL IND N
  80  -
  81  X<>Y
  82  /
  83  X<>Y
  84  1
  85  +
  86  ST- O
  87  X<>Y
  88  DSE N
  89  GTO 04
  90  RCL IND O  
  91  FS? 02
  92  1/X
  93  +
  94  FS? 02
  95  1/X
  96  RCL M
  97  SIGN
  98  X<>Y
  99  CLA
100  END

 
   ( 159 bytes SIZE (n2+3n+2)/2 )
 
 

      STACK        INPUTS      OUTPUTS
           X             x          f(x)
           L             /            x

 
Example1:     Given  f(0) = 226 ,  f(2) = 58 ,  f(5) = 18 ,  f(10) = 6 ,  f(20) = 1     Calculate  f(1) ,  f(3)  ,  f(7)

-There are 5 points so   5  STO 00  and we store:

    0   226             R01   R06
    2    58              R02   R07
    5    18      in     R03   R08    respectively
   10    6               R04   R09
   20    1               R05   R10

-Then,  CF 01    1  XEQ "THIELE"   >>>>   f(1) =  109.4020   ( in 12 seconds )

-After executing "THIELE" once, the r12...-values are in the required registers ( R11 R15 R18 R20 in this example ),
 and we can set flag F01 to speed up execution:

  SF 01   3   R/S  >>>>   f(3) =  35.8827   ( in 3 seconds )
              7   R/S  >>>>   f(7) =  10.8845

-Here, the number of points is odd ( n = 5 ), so setting or clearing flag F02 yields the same results ( provided no y-value equals zero )
 

Example2:     Given  f(0) = 226 ,  f(2) = 58 ,  f(10) = 6 ,  f(20) = 1      Evaluate again f(1) , f(3) , f(7)

-There are 4 points whence   4  STO 00  and

    0    STO 01    2   STO 02   10   STO 03   20  STO 04
  226  STO 05   58  STO 06    6    STO 07    1   STO 08

 1°)  With flag F02 clear CF 02, we find:

   CF 01     1  XEQ "THIELE"  >>>>   f(1) = 97.5178 ,  SF 01   3  R/S  >>>>   f(3) = 38.9928 ,  7  R/S  >>>>  f(7)  = 12.2710

 2°)  With flag F02 set SF 02, we find:

   CF 01     1  R/S  >>>>    f(1) = 100.1803 ,   SF 01   3  R/S  >>>>   f(3) = 37.8940 ,  7  R/S  >>>>  f(7)  = 11.5319
 

Notes:

-If  y1 equals another y-value, there will be a DATA ERROR , so always choose the first point such that y1 is different from all other yk
-There is always a small risk that some denominators equal 0. If it ever happens, change the order of the data points and start again...

-This program only deals with the cases:

  deg(numerator) = deg(denominator)          if n is odd
  deg(numerator) = deg(denominator) +/-1  if n is even,  but there are many other possibilities.

-For instance, if you want to fit a set of data points ( xi , yi ) to a rational function of the type  1/p(x)  where p is a polynomial,
 you can use Lagrange's interpolation formula to the set ( xi , 1/yi ) and take the reciprocal of the results.

-In the first example above ( 5 points ) it gives  f(1) = 108.4804  ,   f(3) = 35.8694  ,  f(7) = 10.9406
 

References:

[1]  F. Scheid -  "Numerical Analysis" - Mc Graw Hill   ISBN 07-055197-9
[2]  Abramowitz and Stegun  -  "Handbook of Mathematical Functions"  -  Dover Publications  -  ISBN  0-486-61272-4