# 1. Print out data in columns
height = [134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 174, 178]
fev = [1.7, 1.9, 2., 2.1, 2.2, 2.5, 2.7, 3.,3.1, 3.4, 3.8, 3.9]
n_height =len(height)
print (f' HEIGHT FEV')
for i in range(0, n_height) :
print (f' {height[i]} {fev[i]} ')
HEIGHT FEV
134 1.7
138 1.9
142 2.0
146 2.1
150 2.2
154 2.5
158 2.7
162 3.0
166 3.1
170 3.4
174 3.8
178 3.9
# 2. Import libraries - NumPy and matplotlib
import numpy as np
import matplotlib.pyplot as plt
# 3. Plot the data; add labels to axes and plot title
plt.plot(height, fev, 'c*')
plt.xlabel ('height')
plt.ylabel ('fev')
plt.title ('height vs fev in boys age 10 to 15')
# 4. Input functions to find interpolating polynomial
def compute_int_coeff (n, x, y) :
coeff = [] # initialize list
for i in range (0,n+1): # loop to calculate n+1 coefficients
numerator = y[i]
denominator = 1. # because denominator is a product we must initialize to 1
for j in range (0,n+1):
if ( i != j) : # denominator is product of all terms except
# when x_i=x_j which would give 0
denominator = denominator * (x[i] - x[j])
coeff.append (numerator / denominator) # add term to list
return (coeff)
#
#
def eval_int_polynomial (n, x, x_eval, coeff) :
my_sum = 0. # formula is sum of n+1 terms so initialize
for i in range (0,n+1) : # loop to form sum of terms
product = 1. # initialize product in numerator of L_i
for j in range (0, n+1) : # loop to form product of terms in numerator
if ( i != j ) : # include all terms except when i = j
product = product * (x_eval - x[j])
# when this j loop is complete we have the numerator of L_i for one term
yi_times_Li = product * coeff[i] # multiplies numerator times C_i (y_i/ product)
my_sum = my_sum + yi_times_Li # keeps running tally of sum of terms
return (my_sum)
# 5. Plot the interpolating polynomial from a height of 134 cm to 178 cm
df = len(fev) -1
coeff = compute_int_coeff (df, height, fev)
x1and2 = np.linspace (134, 178);
y1and2= []
for i in range (0, len(x1and2)):
y1and2.append (eval_int_polynomial(df, height, x1and2[i] , coeff))
plt.plot (height, fev, 'bo')
plt.xlabel ('height')
plt.ylabel ('fev')
plt.plot (x1and2, y1and2, 'm')
plt.title (f'{df} degree polynomial interprolating data')
# 6. Use the polynomial to predict the FEV for a height of 165 cm and of 175 cm.
# Which do you think is a better prediction?
print (f' predicted fev based on height of 165 cm is', eval_int_polynomial(df, height, 165, coeff))
print (f' predicted fev based on height of 175 cm is', eval_int_polynomial(df, height, 175, coeff))
#175 is a poor prediction because after about the 170 mark is when the graph goes off trend
predicted fev based on height of 165 cm is 3.1044129974208774
predicted fev based on height of 175 cm is 3.3490242131985744
# Import libraries
import matplotlib.pyplot as plt
import numpy as np
# Plot piecewise linear interpolating polynomial and data; use
plt.plot (height, fev, 'r+')
plt.xlabel ('height')
plt.ylabel ('fev')
x_plt = np.linspace(134, 178)
y_plt = np.interp(x_plt, height, fev)
plt.plot (x_plt, y_plt, 'c')
plt.title ('piecewise polynomial predictions')
# Use the piecewise polynomial to predict the FEV for a height of 165 cm and of 176 cm.
# How does this compare with 11th degree polynomial which predicted 3.104 for 165 cm and
# 2.697 for 176 cm
print (f' fev prediction based on height of 165 is' , np.interp(165, height, fev))
print (f' fev prediction based on height of 176 is' , np.interp(176, height, fev))
#predicted value for 165 is better because it was closer to the 11th degree polynomial prediction
fev prediction based on height of 165 is 3.075
fev prediction based on height of 176 is 3.8499999999999996