【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.22 多项式运算:从求根到拟合的数值方法

在这里插入图片描述

2.22 多项式运算:从求根到拟合的数值方法

目录

2.22 多项式运算:从求根到拟合的数值方法
2.22.1 多项式表示形式
2.22.2 特征值求根法
2.22.3 最小二乘拟合优化
2.22.4 控制系统建模案例
2.22.5 与SymPy对比
2.22.6 总结与参考文献

2.22.1 多项式表示形式

2.22.1.1 多项式的定义

多项式是一种数学表达式,由一个或多个项组成,每个项都是常数与变量的乘积。多项式可以表示为:

[ P(x) = a_n x^n + a_{n-1} x^{n-1} + \cdots + a_1 x + a_0 ]

其中,( a_n, a_{n-1}, \ldots, a_0 ) 是多项式的系数,( x ) 是变量,( n ) 是多项式的次数。

2.22.1.2 NumPy 中的多项式表示

NumPy 提供了 numpy.polynomial 模块,用于处理多项式。多项式可以使用 numpy.polynomial.Polynomial 类来表示。

import numpy as np
from numpy.polynomial import Polynomial# 创建一个多项式 P(x) = 2x^2 + 3x + 1
p = Polynomial([1, 3, 2])  # [1, 3, 2] 表示常数项、一次项和二次项的系数
print(p)  # 输出: 1.0 + 3.0·x + 2.0·x²

2.22.1.3 多项式的基本操作

2.22.1.3.1 多项式求值
# 求多项式在 x = 2 处的值
value = p(2)  # 求 P(2)
print(value)  # 输出: 15.0
2.22.1.3.2 多项式加法
# 创建另一个多项式 Q(x) = x^2 + 2
q = Polynomial([2, 0, 1])  # [2, 0, 1] 表示常数项、一次项和二次项的系数# 多项式加法
r = p + q  # P(x) + Q(x)
print(r)  # 输出: 3.0 + 3.0·x + 3.0·x²
2.22.1.3.3 多项式乘法
# 多项式乘法
s = p * q  # P(x) * Q(x)
print(s)  # 输出: 2.0 + 6.0·x + 5.0·x² + 3.0·x³ + 2.0·x⁴

2.22.2 特征值求根法

2.22.2.1 特征值求根法的基本原理

特征值求根法是通过将多项式问题转化为矩阵的特征值问题来求解多项式的根。具体步骤如下:

  1. 构造多项式的 companion 矩阵。
  2. 求解 companion 矩阵的特征值。
  3. 特征值即为多项式的根。

2.22.2.2 companion 矩阵

对于多项式 ( P(x) = a_n x^n + a_{n-1} x^{n-1} + \cdots + a_1 x + a_0 ),其 companion 矩阵 ( C ) 定义为:

[ C = \begin{bmatrix}
0 & 0 & \cdots & 0 & -\frac{a_0}{a_n} \
1 & 0 & \cdots & 0 & -\frac{a_1}{a_n} \
0 & 1 & \cdots & 0 & -\frac{a_2}{a_n} \
\vdots & \vdots & \ddots & \vdots & \vdots \
0 & 0 & \cdots & 1 & -\frac{a_{n-1}}{a_n}
\end{bmatrix} ]

2.22.2.3 代码实现

import numpy as np
from numpy.linalg import eig# 定义多项式的系数
coefficients = [1, -6, 11, -6]  # 表示 x^3 - 6x^2 + 11x - 6# 构造 companion 矩阵
n = len(coefficients) - 1  # 多项式的次数
companion_matrix = np.zeros((n, n))# 填充 companion 矩阵
for i in range(n-1):companion_matrix[i, i+1] = 1
companion_matrix[-1, :] = -np.array(coefficients[:-1]) / coefficients[-1]# 求解特征值
eigenvalues, _ = eig(companion_matrix)
roots = eigenvalues
print(f"多项式的根: {roots}")  # 输出: 多项式的根

2.22.3 最小二乘拟合优化

2.22.3.1 最小二乘法的基本原理

最小二乘法是一种常用的拟合方法,通过最小化误差平方和来求解拟合参数。具体步骤如下:

  1. 定义拟合多项式。
  2. 计算拟合多项式与实际数据之间的误差平方和。
  3. 通过求解最小化问题来确定拟合参数。

2.22.3.2 代码实现

2.22.3.2.1 生成数据
import numpy as np# 生成样本数据
x = np.linspace(0, 10, 100)  # 生成 100 个在 [0, 10] 之间的等间距点
y = 2 * x**2 + 3 * x + 1 + np.random.normal(0, 10, 100)  # 生成带有噪声的多项式数据# 绘制数据
plt.figure(figsize=(10, 6))
plt.scatter(x, y, label='Sample Data')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
2.22.3.2.2 多项式拟合
# 使用 np.polyfit 进行多项式拟合
degrees = [1, 2, 3]  # 拟合的多项式次数
fits = {}for degree in degrees:# 拟合多项式coefficients = np.polyfit(x, y, degree)  # 拟合多项式fit_polynomial = np.poly1d(coefficients)  # 创建多项式对象fits[degree] = fit_polynomial# 计算拟合值y_fit = fit_polynomial(x)  # 计算拟合值# 绘制拟合结果plt.figure(figsize=(10, 6))plt.scatter(x, y, label='Sample Data')plt.plot(x, y_fit, label=f'Fit {degree} Degree')plt.xlabel('x')plt.ylabel('y')plt.legend()plt.title(f'Polynomial Fit of Degree {degree}')plt.show()
2.22.3.2.3 拟合效果评估
# 计算拟合误差
for degree, fit_polynomial in fits.items():y_fit = fit_polynomial(x)error = np.sum((y - y_fit)**2)  # 计算误差平方和print(f"拟合 {degree} 次多项式的误差: {error:.2f}")  # 输出: 拟合误差

2.22.4 控制系统建模案例

2.22.4.1 控制系统简介

控制系统用于管理、指挥、指导和调节一个系统的运行,使其按期望的方式工作。多项式在控制系统中常用于描述系统的传递函数和模型。

2.22.4.2 多项式在控制系统的应用

2.22.4.2.1 传递函数

传递函数是一种描述线性时不变系统(LTI)在频域中的数学表达式。形式为:

[ H(s) = \frac{B(s)}{A(s)} ]

其中,( A(s) ) 和 ( B(s) ) 是多项式,( s ) 是复变量。

2.22.4.2.2 代码实现
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lti, step# 定义传递函数的系数
numerator = [1, 1]  # 分子多项式的系数
denominator = [1, 5, 6]  # 分母多项式的系数# 创建传递函数对象
system = lti(numerator, denominator)# 计算阶跃响应
t, y = step(system)# 绘制阶跃响应
plt.figure(figsize=(10, 6))
plt.plot(t, y)
plt.title('Step Response of the Control System')
plt.xlabel('Time [s]')
plt.ylabel('Response')
plt.grid(True)
plt.show()

2.22.5 与SymPy对比

2.22.5.1 SymPy 简介

SymPy 是一个 Python 的符号计算库,可以用于处理符号数学问题,包括多项式的符号求解、微积分、代数方程等。

2.22.5.2 多项式的符号求解

2.22.5.2.1 SymPy 中的多项式求根
import sympy as sp# 定义变量
x = sp.symbols('x')# 定义多项式
polynomial = x**3 - 6*x**2 + 11*x - 6# 求解多项式的根
roots = sp.solve(polynomial, x)
print(f"多项式的根: {roots}")  # 输出: 多项式的根
2.22.5.2.2 SymPy 与 NumPy 的对比
  • NumPy:适用于数值计算,速度快,适用于大规模数据处理。
  • SymPy:适用于符号计算,可以处理复杂的数学问题,但速度较慢。

2.22.5.3 多项式拟合的符号求解

# 生成带噪声的数据
x_data = np.linspace(0, 10, 100)
y_data = 2 * x_data**2 + 3 * x_data + 1 + np.random.normal(0, 10, 100)# 转换为 SymPy 的符号变量
x_sym = sp.symbols('x')
y_sym = 2 * x_sym**2 + 3 * x_sym + 1# 求解拟合参数
A = np.vander(x_data, 3)  # 生成 Vandermonde 矩阵
b = y_data  # 实际数据
coefficients = np.linalg.lstsq(A, b, rcond=None)[0]  # 求解最小二乘问题
fit_polynomial = np.poly1d(coefficients)  # 创建多项式对象# 绘制拟合结果
plt.figure(figsize=(10, 6))
plt.scatter(x_data, y_data, label='Sample Data')
plt.plot(x_data, fit_polynomial(x_data), label='Fit Polynomial', color='red')
plt.title('Polynomial Fit Using SymPy and NumPy')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

2.22.6 总结与参考文献

2.22.6.1 总结

本文详细介绍了 NumPy 中多项式的基本操作、特征值求根法、最小二乘拟合优化、控制系统建模案例以及与 SymPy 的对比。通过这些内容,读者可以深入理解如何在实际应用中高效地处理多项式运算。

2.22.6.2 参考文献

资料名称链接
NumPy 官方文档https://numpy.org/doc/
SciPy 官方文档https://docs.scipy.org/doc/scipy/reference/
SymPy 官方文档https://docs.sympy.org/latest/index.html
最小二乘法原理https://en.wikipedia.org/wiki/Least_squares
多项式拟合原理https://www.mathsisfun.com/data/least-squares-regression.html
控制系统建模与分析https://www.mathworks.com/help/control/ug/modeling-control-systems.html
companion 矩阵https://en.wikipedia.org/wiki/Companion_matrix
特征值求解https://www.cs.cornell.edu/~bindel/class/cs4220-s12/lec16.pdf
随机数生成与拟合https://www.stat.cmu.edu/~cshalizi/402/lectures/06-least-squares/lecture-06.pdf
Python 数据科学手册https://www.data-science-handbook.com/
随机数生成器的高级应用https://www.high-performance-computing.com/
多项式的数值计算https://www.cs.princeton.edu/courses/archive/fall18/cos323/notes/COS323-polynomials.pdf
控制系统的数学原理https://www.control.lth.se/
Python 科学计算库对比https://www.pydata.org/

希望本文对您理解 NumPy 中多项式的数值方法及其应用有所帮助。这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12703.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】MySQL经典面试题深度解析

文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL?1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…

(脚本学习)BUU18 [CISCN2019 华北赛区 Day2 Web1]Hack World1

自用 题目 考虑是不是布尔盲注,如何测试:用"1^1^11 1^0^10,就像是真真真等于真,真假真等于假"这个测试 SQL布尔盲注脚本1 import requestsurl "http://8e4a9bf2-c055-4680-91fd-5b969ebc209e.node5.buuoj.cn…

互联网行业常用12个数据分析指标和八大模型

本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…

Verilog语言学习总结

Verilog语言学习! 目录 文章目录 前言 一、Verilog语言是什么? 1.1 Verilog简介 1.2 Verilog 和 C 的区别 1.3 Verilog 学习 二、Verilog基础知识 2.1 Verilog 的逻辑值 2.2 数字进制 2.3 Verilog标识符 2.4 Verilog 的数据类型 2.4.1 寄存器类型 2.4.2 …

知识蒸馏教程 Knowledge Distillation Tutorial

来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附:Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…

docker pull Error response from daemon问题

里面填写 里面解决方案就是挂代理。 以虚拟机为例,将宿主机配置端口设置,https/http端口设为7899 配置虚拟机的http代理: vim /etc/systemd/system/docker.service.d/http-proxy.conf里面填写,wq保存 [Service] Environment…

从Transformer到世界模型:AGI核心架构演进

文章目录 引言:架构革命推动AGI进化一、Transformer:重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律 二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破 三、构建…

Verilog基础(三):过程

过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的,所以任何电路都可以表示为模块和赋值语句的某种组合. 然而,有时这不是描述电路最方便的方法. 两种always block是十分有用的: 组合逻辑: always @(…

STM32 串口发送与接收

接线图 代码配置 根据上一章发送的代码配置,在GPIO配置的基础上需要再配置PA10引脚做RX接收,引脚模式可以选择浮空输入或者上拉输入,在USART配置串口模式里加上RX模式。 配置中断 //配置中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE…

Docker技术相关学习三

一、Docker镜像仓库管理 1.docker仓库:用于存储和分发docker镜像的集中式存储库,开发者可以将自己创建的镜像推送到仓库中也可以从仓库中拉取所需要的镜像。 2.docker仓库: 公有仓库(docker hub):任何人都可…

Java BIO详解

一、简介 1.1 BIO概述 BIO(Blocking I/O),即同步阻塞IO(传统IO)。 BIO 全称是 Blocking IO,同步阻塞式IO,是JDK1.4之前的传统IO模型,就是传统的 java.io 包下面的代码实现。 服务…

【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据

说明: 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的 数据准备:准备一…

【电脑系统】电脑突然(蓝屏)卡死发出刺耳声音

文章目录 前言问题描述软件解决方案尝试硬件解决方案尝试参考文献 前言 在 更换硬盘 时遇到的问题,有时候只有卡死没有蓝屏 问题描述 更换硬盘后,电脑用一会就卡死,蓝屏,显示蓝屏代码 UNEXPECTED_STORE_EXCEPTION 软件解决方案…

基于LabVIEW的Modbus-RTU设备通信失败问题分析与解决

在使用 LabVIEW 通过 Modbus-RTU 协议与工业设备进行通信时,可能遇到无法正常发送或接收指令的问题。常见原因包括协议参数配置错误、硬件连接问题、数据帧格式不正确等。本文以某 RGBW 控制器调光失败为例,提出了一种通用的排查思路,帮助开发…

解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题

mac安装软件时,如果出现这个问题,其实很简单 首先打开终端,输入下面的命令 sudo xattr -r -d com.apple.quarantine 输入完成后,先不要回车,点击访达--应用程序--找到你无法打开的app图标,拖到终端窗口中…

1.攻防世界easyphp

进入题目页面如下 是一段PHP代码进行代码审计 <?php // 高亮显示PHP文件源代码 highlight_file(__FILE__);// 初始化变量$key1和$key2为0 $key1 0; $key2 0;// 从GET请求中获取参数a的值&#xff0c;并赋值给变量$a $a $_GET[a]; // 从GET请求中获取参数b的值&#xff…

牛客周赛 Round 79

题目目录 A 小红的合数寻找解题思路参考代码 B 小红的小球染色解题思路参考代码 C 小红的二叉树解题思路参考代码 D 小红的“质数”寻找解题思路参考代码 E 小红的好排列解题思路参考代码 F 小红的小球染色期望解题思路参考代码 A 小红的合数寻找 \hspace{15pt} 小红拿到了一个…

《苍穹外卖》项目学习记录-Day11订单统计

根据起始时间和结束时间&#xff0c;先把begin放入集合中用while循环当begin不等于end的时候&#xff0c;让begin加一天&#xff0c;这样就把这个区间内的时间放到List集合。 查询每天的订单总数也就是查询的时间段是大于当天的开始时间&#xff08;0点0分0秒&#xff09;小于…

电子电器架构 --- 电子电气架构设计要求与发展方向

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…