伴侣矩阵求解多项式的根

本文介绍了如何通过构建伴侣矩阵来求解多项式方程的根,包括矩阵的构造过程,以及使用Python中的numpy和sympy库进行计算的示例。展示了如何将多项式系数转化为伴侣矩阵,并通过求解矩阵特征值找到原方程的根。
摘要由CSDN通过智能技术生成

伴侣矩阵求解多项式的根

已知方程 P ( x ) = ∑ i = 0 n a i x n = 0 P(x) = \sum_{i=0}^{n}a_ix^n = 0 P(x)=i=0naixn=0,通过伴侣矩阵求解该方程的根。

伴侣矩阵

此处参考百度知道,就可以大概知道伴侣矩阵的构建。具体如下,


f ( t ) = t n + a 1 t n − 1 + … + a n − 1 t + a n . f(t)=t^n+a_1 t^{n-1}+\ldots+a_{n-1} t+a_n . f(t)=tn+a1tn1++an1t+an.

是数域 F F F 上的首项为 1 的多项式, 则 n n n 阶矩阵:
C = [ 0 0 … 0 − a n 1 0 … 0 − a n − 1 0 1 … 0 − a n − 2 ⋮ ⋮ ⋮ ⋮ 0 0 … 1 − a 1 ] C=\left[\begin{array}{ccccc} 0 & 0 & \ldots & 0 & -a_n \\ 1 & 0 & \ldots & 0 & -a_{n-1} \\ 0 & 1 & \ldots & 0 & -a_{n-2} \\ \vdots & \vdots & & \vdots & \vdots \\ 0 & 0 & \ldots & 1 & -a_1 \end{array}\right] C= 010000100001anan1an2a1
对于原来的多项式 a 0 a_0 a0系数可能不为1,那就可以通过左右两边同时除以 a 0 a_0 a0得到首项系数为1的多项式。

求解示例

假设我们有一个多项式如下。
P ( x ) = a 0 x 3 + a 1 x 2 + a 2 x + a 3 = 0 P(x)=a_0 x^3+a_1 x^2+a_2 x+a_3=0 P(x)=a0x3+a1x2+a2x+a3=0
b 1 = a 1 a 0 b_1 = \frac{a_1}{a_0} b1=a0a1 b 2 = a 2 a 0 b_2 = \frac{a_2}{a_0} b2=a0a2…依此类推,就得到了如下
P ′ ( x ) = x 3 + b 1 x 2 + b 2 x + b 3 = 0 P'(x)=x^3+b_1 x^2+b_2 x+b_3=0 P(x)=x3+b1x2+b2x+b3=0
此时 P ′ P' P P P P的根是相同。构建伴侣矩阵A:
A = [ 0 0 − b 3 1 0 − b 2 0 1 − b 1 ] A = \left[\begin{array}{lll} 0 & 0 & -b_3 \\ 1 & 0 & -b_2 \\ 0 & 1 & -b_1 \end{array}\right] A= 010001b3b2b1
为了便于观察,可以将A先进行转置,此时的特征根和特征方程是不会发生改变的。

令,

A = [ − b 1 − b 2 − b 3 1 0 0 0 1 0 ] A = \left[\begin{array}{ccc} -b_1 &- b_2 & -b_3 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right] A= b110b201b300

然后就求解该矩阵的特征值和特征向量,由定义得,
A y = λ y A\bold{y} = \lambda \bold{y} Ay=λy
我们可以假设此时多项式 P ( x ) P(x) P(x)的根 x 0 x_0 x0就是矩阵 A阵的特征值,因此有
A y = x 0 y A \mathbf{y}=x_0 \mathbf{y} Ay=x0y
然后,令 y = [ x 0 2 , x 0 , 1 ] T \mathbf{y}=\left[x_0^2, x_0, 1\right]^T y=[x02,x0,1]T,就可以得到,
A y = [ − b 1 x 0 2 − b 2 x 0 − b 3 x 0 2 x 0 ] = [ x 0 3 x 0 2 x 0 ] = x 0 y A\mathbf{y} = \left[\begin{array}{ccc} -b_1x_0^2 -b_2x_0 -b_3 \\ x_0^2 \\ x_0 \end{array}\right] = \left[\begin{array}{c}x_0^3 \\ x_0^2 \\ x_0\end{array}\right] = x_0\mathbf{y} Ay= b1x02b2x0b3x02x0 = x03x02x0 =x0y
此时第一行就得到了我们所需要求解的方程了。

− b 1 x 0 2 − b 2 x 0 − b 3 = x 0 3 -b_1x_0^2 - b_2x_0-b_3 = x_0^3 b1x02b2x0b3=x03

所以只需要解出伴侣矩阵A的所有特征根 x 0 x_0 x0就可以求出原来方程的根了。

参考文档: 传送门

然后让GPT随机给我生成了一个示例的代码,可以验证一下,

import numpy as np
import sympy as sp
import matplotlib.pyplot as plt

# 定义三次方程的系数
coefficients = [1, -6, 11, -6]

# 构建友矩阵
A = [[-coefficients[1], -coefficients[2], -coefficients[3]],
     [1, 0, 0],
     [0, 1, 0]]
A = np.array(A)

# 输出友矩阵
print("Companion Matrix A:")
print(A)

# 求解特征值
eigenvalues = np.linalg.eigvals(A)

# 输出结果
print("\nCoefficients of the cubic equation:", coefficients)
print("Eigenvalues of the companion matrix:", eigenvalues)


# 求解方程的准确根
# Define the symbolic variable x
x = sp.symbols('x')

# Define the cubic equation
equation = x**3 - 6*x**2 + 11*x - 6

# Solve the cubic equation
roots = sp.solve(equation, x)

# Display the roots
print("\nExact roots of the cubic equation:", roots)

# Plot the cubic equation
def cubic_equation(x):
    return x**3 - 6*x**2 + 11*x - 6

x_values = np.linspace(0, 4, 400)
y_values = cubic_equation(x_values)

plt.plot(x_values, y_values, label='y = $x^3 - 6x^2 + 11x - 6$')
plt.axhline(0, color='black', linewidth=0.5, linestyle='--', label='y = 0')

plt.scatter(roots, [0, 0, 0], color='black', marker='o', label='Roots')

plt.xlabel('x')
plt.ylabel('y')
plt.title('Plot of the Cubic Equation')
plt.legend()
plt.grid(True)

plt.show()
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值