杰瑞科技汇

NumPy poly函数如何实现多项式操作?

Of course! The term "Python numpy poly" most commonly refers to NumPy's family of functions for working with polynomials. These functions are powerful tools for polynomial arithmetic, evaluation, root finding, and fitting.

NumPy poly函数如何实现多项式操作?-图1
(图片来源网络,侵删)

Let's break down the main components of NumPy's polynomial module.

The Core Concept: The Coefficient Array

In NumPy, a polynomial is represented not by its symbolic form (like 3x² + 2x - 5), but by an array of its coefficients, ordered from the lowest degree to the highest degree.

This is the most important concept to grasp.

Example: The polynomial P(x) = -5 + 2x + 3x² is represented by the NumPy array: coeffs = np.array([-5, 2, 3])

NumPy poly函数如何实现多项式操作?-图2
(图片来源网络,侵删)

The index of the element in the array corresponds to the power of x.

  • coeffs[0] is the constant term (x⁰).
  • coeffs[1] is the coefficient for .
  • coeffs[2] is the coefficient for .

Key Functions in numpy.poly

While NumPy has a more modern numpy.polynomial package, the older numpy.poly functions are still very common and useful. Here are the most important ones.

a. Creating a Polynomial from Roots: numpy.poly

This function takes a list of roots (the values of x that make the polynomial zero) and returns the array of coefficients.

import numpy as np
# Find the polynomial with roots at x = 1 and x = 2
# (x - 1)(x - 2) = x² - 3x + 2
roots = [1, 2]
coeffs = np.poly(roots)
print(f"Roots: {roots}")
print(f"Coefficients (lowest to highest power): {coeffs}")
# Output: Coefficients (lowest to highest power): [ 1. -3.  2.]
# Note: The output is [2, -3, 1], which represents 2 - 3x + x².
# This is the reverse order of what we discussed! This is a common source of confusion.
# The convention for np.poly is highest power first.

⚠️ Important Note: The np.poly() function returns coefficients in highest-to-lowest order, which is different from the standard numpy.polynomial package. This is a legacy feature.

b. Evaluating a Polynomial: numpy.polyval

This is one of the most frequently used functions. It evaluates a polynomial at a given point or array of points.

# Let's evaluate the polynomial P(x) = 2 - 3x + x² at x = 5
# Using the coefficients from the previous example: [1, -3, 2] (for x² - 3x + 2)
# Wait, let's be consistent. Let's use P(x) = 1 - 3x + 2x²
coeffs = np.array([1, -3, 2]) # Represents 1 - 3x + 2x²
x_val = 5
result = np.polyval(coeffs, x_val)
print(f"P({x_val}) = {result}")
# Let's check the math: 1 - 3(5) + 2(5)² = 1 - 15 + 50 = 36
# Output: P(5) = 36.0
# You can also evaluate at multiple points at once
x_values = np.array([0, 1, 2, 3])
results = np.polyval(coeffs, x_values)
print(f"P({x_values}) = {results}")
# Output: P([0 1 2 3]) = [ 1  0  5 16]

c. Finding Roots: numpy.roots

This is the inverse of np.poly(). It takes an array of coefficients (in highest-to-lowest order) and returns the roots of the polynomial.

# Find the roots of the polynomial P(x) = 2x² - 4x + 1
# Coefficients are [2, -4, 1] (highest power first)
coeffs = [2, -4, 1]
roots = np.roots(coeffs)
print(f"Coefficients: {coeffs}")
print(f"Roots: {roots}")
# Output: Roots: [1.3660254 0.3660254]
# The roots are (2 ± √2) / 2

d. Polynomial Arithmetic

You can add, subtract, and multiply polynomials using simple operators.

# P1(x) = 1 + 2x + 3x²
# P2(x) = 4 + 5x
p1_coeffs = np.array([1, 2, 3])
p2_coeffs = np.array([4, 5])
# Addition: (1+4) + (2+5)x + 3x² = 5 + 7x + 3x²
# Note: NumPy handles arrays of different lengths automatically
sum_coeffs = p1_coeffs + p2_coeffs
print(f"Sum coefficients: {sum_coeffs}") # Output: [5 7 3]
# Subtraction
diff_coeffs = p1_coeffs - p2_coeffs
print(f"Difference coefficients: {diff_coeffs}") # Output: [-3 -3  3]
# Multiplication: (1+2x+3x²) * (4+5x)
# This requires numpy.polymul for clarity, but * also works in modern NumPy
prod_coeffs = np.polymul(p1_coeffs, p2_coeffs)
print(f"Product coefficients: {prod_coeffs}")
# Output: [ 4 13 22 15] -> Represents 4 + 13x + 22x² + 15x³

The Modern Approach: numpy.polynomial

For new code, it's recommended to use the numpy.polynomial package. It's more consistent, flexible, and follows the "lowest power first" convention, which aligns with how polynomials are often represented in mathematics (as power series).

Let's repeat the previous examples using this modern package.

a. Creating a Polynomial from Coefficients: numpy.polynomial.Polynomial

from numpy.polynomial import Polynomial
# P(x) = -5 + 2x + 3x²
# Coefficients are lowest power first: [-5, 2, 3]
p = Polynomial([-5, 2, 3])
print(p)
# Output: Poly(-5 + 2*x + 3*x²)
# This is much more intuitive!

b. Evaluating a Polynomial: The __call__ method

The Polynomial object itself is a callable function.

p = Polynomial([-5, 2, 3]) # P(x) = -5 + 2x + 3x²
# Evaluate at x = 2
result = p(2)
print(f"P(2) = {result}")
# Output: P(2) = 11.0
# Let's check: -5 + 2(2) + 3(2)² = -5 + 4 + 12 = 11
# Evaluate at multiple points
x_values = np.array([0, 1, -1])
results = p(x_values)
print(f"P({x_values}) = {results}")
# Output: P([ 0  1 -1]) = [-5.  0. -6.]

c. Finding Roots: .roots()

This is a method of the Polynomial object.

# Find roots of P(x) = 1 - 3x + 2x²
# Coefficients (lowest to highest): [1, -3, 2]
p = Polynomial([1, -3, 2])
roots = p.roots()
print(f"Roots of P(x) = {p}: {roots}")
# Output: Roots of P(x) = Poly(1 - 3*x + 2*x²): [1.  0.5]

d. Fitting a Polynomial to Data: numpy.polyfit

This is an extremely useful function for data analysis. It performs a least-squares polynomial fit to a set of data points.

import matplotlib.pyplot as plt
# Some sample data
x_data = np.array([0, 1, 2, 3, 4, 5])
y_data = np.array([1.0, 0.8, 0.5, 0.2, -0.1, -0.5])
# Fit a 2nd-degree polynomial (a parabola) to the data
# The output coefficients are HIGHEST power first!
degree = 2
fit_coeffs = np.polyfit(x_data, y_data, degree)
print(f"Fitted coefficients (highest to lowest): {fit_coeffs}")
# Output might be: [-0.10666667  0.02  0.98]
# Now, use these coefficients to create a polynomial function
p_fit = np.poly1d(fit_coeffs)
# Generate points for the smooth fitted curve
x_curve = np.linspace(0, 5, 100)
y_curve = p_fit(x_curve)
# Plot the results
plt.scatter(x_data, y_data, color='red', label='Original Data')
plt.plot(x_curve, y_curve, color='blue', label=f'Fit: {p_fit}')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')'Polynomial Fit')
plt.grid(True)
plt.show()

Summary and Recommendation

Feature numpy.poly (Legacy) numpy.polynomial.Polynomial (Modern)
Representation Array of coefficients, highest power first. Array of coefficients, lowest power first.
Creation np.poly(roots) Polynomial(coeffs)
Evaluation np.polyval(coeffs, x) p(x) where p is a Polynomial object.
Roots np.roots(coeffs) p.roots() where p is a Polynomial object.
Clarity Can be confusing due to mixed conventions. Very clear and object-oriented.
Recommendation Okay for quick tasks, especially np.polyfit and np.polyval. Recommended for new code. More robust and consistent.

Final Advice:

  • For quick, simple tasks, np.polyval and np.polyfit are fantastic and widely used.
  • For any serious polynomial manipulation or when writing new, maintainable code, use the numpy.polynomial package. Its object-oriented nature and consistent "lowest power first" convention will save you from confusion.
分享:
扫描分享到社交APP
上一篇
下一篇