Interpolation and linear algebra

AI Thread Summary
The discussion focuses on using numpy for interpolation to estimate the force on a projectile at 750 ft/sec based on measured air resistance data. A polynomial of degree five is required for accurate interpolation with six data points, yielding a force estimate of approximately 6483.83 lbs. However, it is suggested that a third-degree polynomial may suffice for practical purposes, especially when considering only the last four data points, as higher-order polynomials can introduce round-off errors and oscillation issues. The user plans to compare the results from both the cubic and fifth-degree polynomials for better understanding. Overall, the conversation highlights the balance between polynomial degree and accuracy in interpolation.
mafagafo
Messages
188
Reaction score
12

Homework Statement


As a string in my program.

Homework Equations


Solving a system with the forward phase of row echelon reduction and a consecutive back substitution.
All done by numpy here. (The book suggested MATLAB, etc).

The Attempt at a Solution


Python:
import numpy

""" In a wind tunnel experiment, the force on a projectile due to air
resistance was measured at different velocities:
Velocity (100 ft/sec) 0 2.00 4.00 6.00 8.00 10.00
Force (100 lb)        0 2.90 14.8 39.6 74.3 119.0
Find an interpolating polynomial for these data and estimate the force on the
projectile when the projectile is traveling at 750 ft/sec.
Use p(t) = a0 + a1*t + a2*t^2 + a3*t^3 + a4*t^4 + a5*t^5.
What happens if you try to use a polynomial of degree less than 5?
(Try a cubic polynomial, for instance.)
"""

make_row_for_t = lambda t: [t ** n for n in range(6)]

A = numpy.array([make_row_for_t(t * 100) for t in range(0, 11, 2)])
B = numpy.array([[n] for n in [0, 290, 1480, 3960, 7430, 11900]])

coefficients = numpy.linalg.solve(A, B)

p = numpy.polynomial.Polynomial(coefficients.flatten())

print_p = lambda x: print("{:<8} = {}".format("p(" + str(x) + ")", p(x)))

for n in range(0, 1100, 200):
    print_p(n)

print_p(750)

Code:
p(0)     = 0.0
p(200)   = 290.0000000000015
p(400)   = 1480.0000000000023
p(600)   = 3960.0000000000036
p(800)   = 7430.000000000004
p(1000)  = 11900.00000000001
p(750)   = 6483.837890625005

Did it work? Yes. (Just get the python3 and python3-numpy packages under Linux and it should run in your machine too.)

The book does not have the answer, but mine seems OK, I wanted to get some review on what I did as I am new to numpy and interpolation and thought I would get some useful advice or even corrections.
 
Physics news on Phys.org
The interpolation requires a polynomial in x5, as you have six data points. For 750 fps, you get 6483,83 lbs

With a smaller polynomial, and if you want to consider all the points, you would have to conform yourself with a best-fit (that, in this case, is quite good with a third-degree polynomial...).Since you are asked for the resistance at 750 fps, the sensible thing to do, in my opinion, is to take the last four points and to obtain the interpolation, third-degree polynomial.
 
Very few things are interpolated well using polynomials higher than third order. You fight round-off errors and then the polynomial will want to oscillate. Most data interpolate quite well with either parabolas or cubics.
 
Interesting. Thank you for the answers, will have a somewhat decent graph of the cubic soon. Maybe will compare it with the fifth degree polynomial. My first thought was that really small coefficients and bigger polynomials would just make the interpolation more and more accurate.
 
mafagafo said:
Interesting. Thank you for the answers, will have a somewhat decent graph of the cubic soon. Maybe will compare it with the fifth degree polynomial. My first thought was that really small coefficients and bigger polynomials would just make the interpolation more and more accurate.

If the coefficients of the higher powers of your interpolating polynomial are really small, that can also be an indication that a lower order polynomial will interpolate the data just fine.
 
NTW said:
The interpolation requires a polynomial in x5, as you have six data points. For 750 fps, you get 6483,83 lbs

With a smaller polynomial, and if you want to consider all the points, you would have to conform yourself with a best-fit (that, in this case, is quite good with a third-degree polynomial...).Since you are asked for the resistance at 750 fps, the sensible thing to do, in my opinion, is to take the last four points and to obtain the interpolation, third-degree polynomial.
p(t) = 2.0833e-07*t^3 + 0.012*t^2 + 0.24167*t^1 - 550 // using the last 4 points.
p(t) = 0.0125*t^2 - 0.15*t^1 - 450 // using the last 3 points.
Nice that the graphics (in the region of interest) almost coincide.
upload_2014-12-4_0-12-20.png
 
Back
Top