note | To evaluate the fitted Lagrange polynomial at a given point, apply the POLY Function to lp. |
; Here, we are trying to reproduce the function f(x) = x^2.
; f(1) = 1
; f(2) = 4
; f(3) = 9
PRINT, LAGRANGE([1, 2, 3], [1, 4, 9])
; PV-WAVE prints:
; 0.00000000 0.00000000 1.0000000
PRINT, POLY(5, LAGRANGE([1, 2, 3], [1, 4, 9]))
; PV-WAVE prints:
; 25.000000
; Make up five abscissas to define five, 4th-degree,
; Lagrange basis polynomials on.
x = [0.0, 1.5, 3.6, 7, 10]
; Define the function values associated with each of the
; five Lagrange basis polynomials. By definition, the
; polynomial associated with the 0th abscissa will equal 1
; at x(0)=0, while the other four polynomials will equal 0.
; Likewise, the polynomial associated with the 1st abscissa
; will equal 1 at x(1)=1.5, while the other four polynomials
; will equal 0, etc.
y = [1, 0, 0, 0, 0]
L40 = LAGRANGE(x, y)
; L40 means the 4th-degree Lagrange basis polynomial
; associated with the 0th abscissa.
y = [0, 1, 0, 0, 0]
L41 = LAGRANGE(x, y)
y = [0, 0, 1, 0, 0]
L42 = LAGRANGE(x, y)
y = [0, 0, 0, 1, 0]
L43 = LAGRANGE(x, y)
y = [0, 0, 0, 0, 1]
L44 = LAGRANGE(x, y)
; Now evaluate the five Lagrange basis polynomials
; over the domain x=[0, 10].
domain = INTERPOL([0, 10], 1000)
P40 = POLY(domain, L40)
P41 = POLY(domain, L41)
P42 = POLY(domain, L42)
P43 = POLY(domain, L43)
P44 = POLY(domain, L44)
; Plot each of the basis polynomials.
!P.font = 0
TEK_COLOR
clrs = WoColorConvert(INDGEN(256))
WINDOW, /Free, Xsize=700, Ysize=400
minY = MIN([P40, P41, P42, P43, P44], Max=maxY)
PLOT, domain, P40, /Nodata, Xrange=[-0.5, 10.5], $
Yrange=[minY,maxY], Ystyle=1, Xstyle=1, $
Title='4!eth!N-degree Lagrange Basis Polynomials', $
Xtitle='Abscissas: 0, 1.5, 3.6, 7, 10', $
Color=clrs(0), Background=clrs(1)
OPLOT, !X.Crange, [0, 0], Linestyle=1, Color=clrs(15)
OPLOT, !X.Crange, [1, 1], Linestyle=1, Color=clrs(15)
FOR i=0L,4 DO OPLOT, [x(i), x(i)], !Y.Crange, $
Linestyle=1, Color=clrs(15)
line_clrs = clrs([2, 25, 4, 8, 30])
OPLOT, domain, P40, Thick=2, Color=line_clrs(0)
OPLOT, domain, P41, Thick=2, Color=line_clrs(1)
OPLOT, domain, P42, Thick=2, Color=line_clrs(2)
OPLOT, domain, P43, Thick=2, Color=line_clrs(3)
OPLOT, domain, P44, Thick=2, Color=line_clrs(4)
; Add a legend.
oldCharsize = !P.Charsize
!P.charsize = 0.75
labels = ['L40', 'L41', 'L42', 'L43', 'L44']
line_types = REPLICATE(!P.linestyle, 5)
psyms = REPLICATE(!P.psym, 5)
LEGEND, labels, line_clrs, line_types, psyms, 1.6, -0.3, 0.1
!P.charsize = oldCharsize
; Make up some function data to go with the abscissa values.
sales_data = [0.918, 1.056, 1.906, 2.134, 3.029]
month = [0, 1, 3, 7, 10]
WINDOW, /Free, Xsize=700, Ysize=400
!P.font = 0
TEK_COLOR
clrs = WoColorConvert(INDGEN(256))
PLOT, month, sales_data, Psym=2, Xrange=[-0.1, 10.1], $
Yrange=[0, 3.5], Ystyle=1, Xstyle=1, $
Xtitle='Month', Ytitle='Log Sales Revenue', $
Title='4!eth!N-degree Lagrange Interpolating Polynomial', $
Color=clrs(0), Background=clrs(1)
; Fit the Lagrange interpolating polynomial to the data and plot it.
l_val = LAGRANGE(month, sales_data)
x_val = INTERPOL([0,10], 1000)
p_val = POLY(x_val, l_val)
OPLOT, x_val, p_val, Color=clrs(8), Thick=2