mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-24 21:41:08 +00:00
bc8df6de31
* [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.2.2 → v0.3.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.2.2...v0.3.2) - [github.com/pre-commit/mirrors-mypy: v1.8.0 → v1.9.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.8.0...v1.9.0) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
"""
|
||
Python program to show how to interpolate and evaluate a polynomial
|
||
using Neville's method.
|
||
Neville’s method evaluates a polynomial that passes through a
|
||
given set of x and y points for a particular x value (x0) using the
|
||
Newton polynomial form.
|
||
Reference:
|
||
https://rpubs.com/aaronsc32/nevilles-method-polynomial-interpolation
|
||
"""
|
||
|
||
|
||
def neville_interpolate(x_points: list, y_points: list, x0: int) -> list:
|
||
"""
|
||
Interpolate and evaluate a polynomial using Neville's method.
|
||
Arguments:
|
||
x_points, y_points: Iterables of x and corresponding y points through
|
||
which the polynomial passes.
|
||
x0: The value of x to evaluate the polynomial for.
|
||
Return Value: A list of the approximated value and the Neville iterations
|
||
table respectively.
|
||
>>> import pprint
|
||
>>> neville_interpolate((1,2,3,4,6), (6,7,8,9,11), 5)[0]
|
||
10.0
|
||
>>> pprint.pprint(neville_interpolate((1,2,3,4,6), (6,7,8,9,11), 99)[1])
|
||
[[0, 6, 0, 0, 0],
|
||
[0, 7, 0, 0, 0],
|
||
[0, 8, 104.0, 0, 0],
|
||
[0, 9, 104.0, 104.0, 0],
|
||
[0, 11, 104.0, 104.0, 104.0]]
|
||
>>> neville_interpolate((1,2,3,4,6), (6,7,8,9,11), 99)[0]
|
||
104.0
|
||
>>> neville_interpolate((1,2,3,4,6), (6,7,8,9,11), '')
|
||
Traceback (most recent call last):
|
||
...
|
||
TypeError: unsupported operand type(s) for -: 'str' and 'int'
|
||
"""
|
||
n = len(x_points)
|
||
q = [[0] * n for i in range(n)]
|
||
for i in range(n):
|
||
q[i][1] = y_points[i]
|
||
|
||
for i in range(2, n):
|
||
for j in range(i, n):
|
||
q[j][i] = (
|
||
(x0 - x_points[j - i + 1]) * q[j][i - 1]
|
||
- (x0 - x_points[j]) * q[j - 1][i - 1]
|
||
) / (x_points[j] - x_points[j - i + 1])
|
||
|
||
return [q[n - 1][n - 1], q]
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import doctest
|
||
|
||
doctest.testmod()
|