SymPy | 获取表达式自由变量方法与因式分解

news2025/5/24 19:27:56

SymPy 是 Python 中强大的符号计算库,广泛应用于数学建模、公式推导和科学计算。本文将从两个核心功能展开:表达式中自由变量的获取因式分解的实现,通过完整代码示例和深入分析,帮助读者掌握其使用方法。


第一部分:获取表达式的自由变量

在符号计算中,自由变量(未被积分、求和等操作绑定的符号)的识别是关键步骤。SymPy 通过 free_symbols 属性实现这一功能,支持从简单到复杂表达式的解析。

1.1 基础用法:free_symbols 属性

free_symbols 返回表达式中所有未被绑定的符号集合,自动过滤被积分、求和等操作绑定的变量。

代码示例
from sympy import symbols, Integral, Derivative, Sum, Function

# 定义符号
x, y, z = symbols('x y z')
n = symbols('n', integer=True)
f = Function('f')

# 示例1:简单表达式
expr1 = x + y**2
print("示例1自由变量:", expr1.free_symbols)  # 输出: {x, y}

# 示例2:积分表达式(x被积分绑定)
expr2 = Integral(x*y, (x, 0, 1))
print("示例2自由变量:", expr2.free_symbols)  # 输出: {y}

# 示例3:导数表达式(变量不绑定)
expr3 = Derivative(f(x), x) + y
print("示例3自由变量:", expr3.free_symbols)  # 输出: {x, y}

# 示例4:求和表达式(n被求和绑定)
expr4 = Sum(x*n, (n, 0, 5))
print("示例4自由变量:", expr4.free_symbols)  # 输出: {x}

# 示例5:复杂复合表达式(y被积分绑定)
expr5 = Integral(Derivative(f(x), x) + y, (y, 0, z))
sorted_vars = sorted(expr5.free_symbols, key=lambda s: s.name)
print("示例5自由变量(排序后):", sorted_vars)  # 输出: [x, z]
关键点分析
  • 积分与求和:操作中的积分变量(如 x)或求和索引(如 n)会被自动排除。
  • 导数与函数:导数操作(如 Derivative(f(x), x))不会绑定变量,x 仍视为自由变量。
  • 结果排序:通过 sorted(..., key=lambda s: s.name) 按符号名称排序,提升可读性。

第二部分:因式分解的实现

SymPy 的 factor 函数支持从简单多项式到复杂表达式的分解,并可扩展至自定义数域。

2.1 基础因式分解

使用 factor(expr) 对多项式进行有理数域上的分解。

代码示例
from sympy import symbols, factor

x, y = symbols('x y')

# 单变量分解
expr1 = x**2 - 4
print("分解1:", factor(expr1))  # 输出: (x - 2)*(x + 2)

# 多变量分解
expr2 = x**2*y + x*y**2
print("分解2:", factor(expr2))  # 输出: x*y*(x + y)

2.2 扩展数域分解

通过 extension 参数指定数域(如复数域),分解包含无理数的表达式。

代码示例
from sympy import factor, sqrt,symbols
x = symbols('x')
# 默认无法分解的表达式
expr3 = x**2 - 2
print("默认分解:", factor(expr3))  # 输出: x² - 2

# 扩展至包含√2的域
print("扩展分解:", factor(expr3, extension=sqrt(2)))  # 输出: (x - √2)*(x + √2)

2.3 分式表达式分解

分解分子和分母后,使用 cancel 函数化简分式。

代码示例
from sympy import factor, cancel,symbols
x = symbols('x')
# 分式分解与化简
expr4 = (x**2 - 4)/(x**2 - 3*x + 2)
factored4 = factor(expr4)
simplified4 = cancel(factored4)
print("分式分解:", factored4)   
print("化简后:", simplified4)  

2.4 复杂多项式分解

支持含三角函数或高次多项式的分解。

代码示例
from sympy import cos, factor,symbols
x,y = symbols('x,y')
# 含三角函数的表达式
expr5 = x**2 - 2*cos(y)*x + cos(y)**2
print("三角分解:", factor(expr5))  # 输出: (x - cos(y))**2

# 高次多项式分解
expr6 = x**5 - x**4 - 2*x**3 + 2*x**2 + x - 1
print("高次分解:", factor(expr6))  

2.5 不可分解表达式处理

对无法分解的表达式,使用 roots 分析根或 expand 展开验证。

代码示例
from sympy import roots, expand,symbols,factor
x = symbols('x')
# 无法分解的表达式
expr7 = x**2 + x + 1
print("分解结果:", factor(expr7))  # 输出: x² + x + 1

# 检查有理数域根
print("根检查:", roots(expr7))      # 输出: {}

# 验证展开一致性
expr8 = (x + 1)**2
expanded = expand(expr8)
print("展开验证:", expanded)       # 输出: x² + 2x + 1

总结与对比

功能核心方法应用场景
自由变量提取expr.free_symbols分析表达式依赖的独立变量
基础因式分解factor(expr)单变量/多变量多项式分解
扩展数域分解factor(expr, extension)处理含无理数(如√2, i)的表达式
分式化简factor + cancel分子分母分解后约简
复杂结构分解factor(expr)高次多项式、三角函数表达式
不可分解表达式分析roots(expr)检查根的存在性或验证表达式等效性

完整代码整合

# 自由变量提取
from sympy import symbols, Integral, Derivative, Sum, Function

x, y, z = symbols('x y z')
n = symbols('n', integer=True)
f = Function('f')

expr_a = Integral(Derivative(f(x), x) + y, (y, 0, z))
print("自由变量:", sorted(expr_a.free_symbols, key=lambda s: s.name))  # [x, z]

# 因式分解
from sympy import factor, cancel, sqrt, cos

expr_b = (x**2 - 4)/(x**2 - 3*x + 2)
print("分式分解:", cancel(factor(expr_b)))  # (x + 2)/(x - 1)

expr_c = x**5 - x**4 - 2*x**3 + 2*x**2 + x - 1
print("高次分解:", factor(expr_c))          

通过本文的代码与解析,读者可掌握 SymPy 在自由变量提取和因式分解中的核心方法,并灵活应用于符号计算、工程建模等领域。进一步学习可参考 SymPy 官方文档。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度剖析并发I/O模型select、poll、epoll与IOCP核心机制

核心概要:select、poll、epoll 和 IOCP 是四种用于提升服务器并发处理能力的I/O模型或机制。前三者主要属于I/O多路复用范畴,允许单个进程或线程监视多个I/O流的状态;而 IOCP 则是一种更为彻底的异步I/O模型。 一、引言:为何需要这…

数据结构 -- 交换排序(冒泡排序和快速排序)

冒泡排序 基于“交换”的排序&#xff1a;根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置 //交换 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …

【算法】: 前缀和算法(利用o(1)的时间复杂度快速求区间和)

前缀和算法&#xff1a;高效处理区间求和的利器 目录 引言什么是前缀和前缀和的基本实现前缀和的作用前缀和的典型应用场景前缀和的优缺点分析实战例题解析 引言 区间求和问题的普遍性暴力解法的时间复杂度问题前缀和算法的核心思想 什么是前缀和 前缀和的数学定义 通俗来…

macOS 安装 PostgreSQL

文章目录 安装安装信息 验证GUI 工具下载 安装 最简单的方式是通过 brew 安装 brew install postgresql17该版本在 brew 上的详情页&#xff1a;https://formulae.brew.sh/formula/postgresql17 你也可以根据需要&#xff0c;搜索 安装更新版本 如果你没有安装 brew&#xf…

Linux系统:基础命令之 ls~pwd~cd

文章目录 前言一、ls命令&#x1f4d8; 命令简介&#xff1a;&#x1f9e0; 基本语法&#xff1a;演示ls&#x1f527; 常用选项&#xff1a;-l选项-a选项-h选项 小结 ls 二、pwd命令&#x1f4d8; 命令简介&#xff1a;何为绝对路径&#xff01;何为相对路径&#xff01;&…

基于OAuth2-proxy和Keycloak为comfyui实现SSO

背景 comfyui无认证被漏扫后易被rce挖矿 攻击过程 https://www.oschina.net/news/340226 https://github.com/comfyanonymous/ComfyUI/discussions/5165 阿里云漏洞库关于comfyui的漏洞 https://avd.aliyun.com/search?qcomfyui&timestamp__1384n4%2BxBD0GitGQ0QD8ID%2F…

SmartSoftHelp 之 SQL Server 数据库安全备份与安全还原详解---深度优化版:SmartSoftHelp DeepCore XSuite

SmartSoftHelp 菜单之 DBMS 数据库备份与还原 (DBBackRest) 使用实例 SQL Server 数据库备份与还原详解 SQL Server 数据库的备份与还原是管理数据库的核心任务之一&#xff0c;涉及本地与远程操作、大小监控及目录管理等多个方面。以下是详细说明&#xff1a; 一、数据库…

Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决

Spring 代理与 Redis 分布式锁冲突&#xff1a;一次锁释放异常的分析与解决 Spring 代理与 Redis 分布式锁冲突&#xff1a;一次锁释放异常的分析与解决1. 问题现象与初步分析2 . 原因探究&#xff1a;代理机制对分布式锁生命周期的干扰3. 问题复现伪代码4. 解决方案&#xff1…

【数据结构】队列的完整实现

队列的完整实现 队列的完整实现github地址前言1. 队列的概念及其结构1.1 概念1.2 组织结构 2. 队列的实现接口一览结构定义与架构初始化和销毁入队和出队取队头队尾数据获取size和判空 完整代码与功能测试结语 队列的完整实现 github地址 有梦想的电信狗 前言 ​ 队列&…

根据YOLO数据集标签计算检测框内目标面积占比(YOLO7-10都适用)

程序&#xff1a; 路径改成自己的&#xff0c;阈值可以修改也可以默认 #zhouzhichao #25年5月17日 #计算时频图中信号面积占检测框面积的比值import os import numpy as np import pandas as pd from PIL import Image# Define the path to the directory containing the lab…

LLM笔记(九)KV缓存(2)

文章目录 1. 背景与动机2. 不使用 KV Cache 的情形2.1 矩阵形式展开2.2 计算复杂度 3. 使用 KV Cache 的优化3.1 核心思想3.2 矩阵形式展开3.3 计算复杂度对比 4. 总结5. GPT-2 中 KV 缓存的实现分析5.1 缓存的数据结构与类型5.2 在注意力机制 (GPT2Attention) 中使用缓存5.3 缓…

LVS 负载均衡集群应用实战

前提:三台虚拟机,有nginx,要做负载 1. LVS-server 安装lvs管理软件 [root@lvs-server ~]# yum -y install ipvsadm 程序包:ipvsadm(LVS管理工具) 主程序:/usr/sbin/ipvsadm 规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file 配置文件:/etc/sysconfig/ipvsad…

MySQL——基本查询内置函数

目录 CRUD Create Retrieve where order by limit Update Delete 去重操作 聚合函数 聚合统计 内置函数 日期函数 字符函数 数学函数 其它函数 实战OJ 批量插入数据 找出所有员工当前薪水salary情况 查找最晚入职员工的所有信息 查找入职员工时间升序排…

Day34打卡 @浙大疏锦行

知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数GPU性能的查看&#xff1a;看显存、看级别、看架构代际GPU训练的方法&#xff1a;数据和模型移动到GPU device上类的call方法&#xff1a;为什么定义前向传播时可以直接写作self.fc1(x) 作业 计算资…

AdGuard解锁高级版(Nightly)_v4.10.36 安卓去除手机APP广告

AdGuard解锁高级版(Nightly)_v4.10.36 安卓去除手机APP广告 AdGuard Nightly是AdGuard团队为及时更新软件而推出的最新测试版本&#xff0c;适合追求最新功能和愿意尝试新版本的用户。但使用时需注意其潜在的不稳定性和风险。…

C++修炼:红黑树的模拟实现

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

基于Python+YOLO模型的手势识别系统

本项目是一个基于Python、YOLO模型、PyQt5的实时手势识别系统&#xff0c;通过摄像头或导入图片、视频&#xff0c;能够实时识别并分类不同的手势动作。系统采用训练好的深度学习模型进行手势检测和识别&#xff0c;可应用于人机交互、智能控制等多种场景。 1、系统主要功能包…

自制操作系统day10叠加处理

day10叠加处理 叠加处理&#xff08;harib07b&#xff09; 现在是鼠标的叠加处理&#xff0c;以后还有窗口的叠加处理 涉及图层 最上面小图层是鼠标指针&#xff0c;最下面的一张图层用来存放桌面壁纸。移动图层的方法实现鼠标指针的移动以及窗口的移动。 struct SHEET { u…

鸿蒙Flutter实战:23-混合开发详解-3-源码模式引入

引言 在前面的文章混合开发详解-2-Har包模式引入中&#xff0c;我们介绍了如何将 Flutter 模块打包成 Har 包&#xff0c;并引入到原生鸿蒙工程中。本文中&#xff0c;我们将介绍如何通过源码依赖的方式&#xff0c;将 Flutter 模块引入到原生鸿蒙工程中。 创建工作 创建一个…

leetcode:2469. 温度转换(python3解法,数学相关算法题)

难度&#xff1a;简单 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数…