29、已知范德蒙德矩阵可以在Python中使用vander命令来创建,Python的polyval命令可用于计算由系数向量定义的多项式。现有任务:给定向量y,求解线性方程组Va = y(其中V为范德蒙德矩阵)。设a的分量为ai,i = 0, …, 5。编写一个函数poly,该函数以a和z为输入,计算多项式。绘制该多项式,并在同一图中将点(xi, yi)绘制成小星号。使用向量x = (0.0, 0.5, 1.0, 1.5, 2.0, 2.5),y = (-2.0, 0.5, -2.0, 1.0, -0.5, 1.0)测试代码。请使用上述vander和polyval命令完成该任务。
可结合以下要求编写代码:给定向量 `y`,在 Python 中求解线性方程组 `Va = y`。设 `a` 的分量为 `aᵢ`,`i = 0, …, 5`。
编写一个函数 `poly`,该函数以 `a` 和 `z` 为输入,计算多项式:
$$
P(z) = a_0 + a_1 z + a_2 z^2 + a_3 z^3 + a_4 z^4 + a_5 z^5
$$
绘制该多项式,并在同一图中将点 `(xᵢ, yᵢ)` 绘制成小星号 `*`。
使用向量测试代码:
```python
x = [0.0, 0.5, 1.0, 1.5, 2.0, 2.5]
y = [-2.0, 0.5, -2.0, 1.0, -0.5, 1.0]
30、构造矩阵 B = (A 的转置乘以 A)的逆乘以 A 的转置。已知矩阵 A 为 2 行 2 列矩阵,示例矩阵可设为 [[1, 2], [3, 4]],请给出计算矩阵 B 的具体步骤及 Python 代码实现。
按照线性代数常规步骤,可先计算矩阵 $ A $ 的转置 $ A^T $,再计算 $ A^T $ 与 $ A $ 的乘积得到 $ A^T A $,接着求 $ A^T A $ 的逆 $ (A^T A)^{-1} $,最后将 $ (A^T A)^{-1} $ 与 $ A^T $ 相乘得到矩阵 $ B $。
在 Python 中可使用 NumPy 库完成,示例代码如下:
import numpy as np
# 假设 A 是一个已知矩阵
A = np.array([[1, 2], [3, 4]])
# 计算 A 的转置
A_T = A.T
# 计算 A^T A
ATA = np.dot(A_T, A)
# 计算 (A^T A) 的逆
ATA_inv = np.linalg.inv(ATA)
# 计算 B = (A^T A)^(-1) A^T
B = np.dot(ATA_inv, A_T)
print(B)
31、使用 Python 中的 numpy 的 polyval 函数绘制由系数向量 c 定义的多项式曲线,并在同一图中绘制点 (xi, yi)。
实现步骤如下:
- 导入必要的库,如
numpy
和matplotlib
; - 定义
x
和y
向量; - 得到矩阵
A
、B
和向量c
; - 使用
polyval
函数根据c
计算多项式的值; - 使用
matplotlib
绘制多项式和点(xi, yi)
。
示例代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 定义 x 和 y 向量
x = np.array([0.0, 0.5, 1.0, 1.5, 2.0, 2.5])
y = np.array([-2.0, 0.5, -2.0, 1.0, -0.5, 1.0])
# 构建 Vandermonde 矩阵 V
V = np.vander(x, increasing=True)
# 删除 V 的第一列得到矩阵 A
A = V[:, 1:]
# 计算 B = (A^T A)^(-1) A^T
B = np.linalg.inv(A.T @ A) @ A.T
# 计算 c
c = B @ y
# 定义绘制范围
x_plot = np.linspace(min(x), max(x), 400)
# 使用 polyval 计算多项式的值
y_plot = np.polyval(c[::-1], x_plot)
# 绘制多项式和点 (xi, yi)
plt.plot(x_plot, y_plot, label='Polynomial defined by c')
plt.plot(x, y, 'r*', label='Points (xi, yi)')
plt.legend()
plt.show()