本文将以factor、expand和equals三个核心函数为切入点,帮助初学者快速掌握SymPy的基本代数操作。
from __future__ import annotations
from sympy import factor , sqrt , symbols
x = symbols('x')
# 因式分解能直接暴露多项式的根
expr = x ** 2 - 5 * x + 6
factored = factor(expr) # 输出: (x - 3)*(x - 2)
print(f'{expr} ->因式分解后-> {factored}')
# 将复杂多项式转换为更紧凑的乘积形式,便于后续分析(如积分、对称性分析)
expr = x ** 3 + 3 * x ** 2 + 3 * x + 1
factored = factor(expr) # 输出: (x + 1)**3
print(f'{expr} ->因式分解后-> {factored}')
# 在指定域(如实数域、复数域)或包含代数数
expr = x ** 2 - 2
factored = factor(expr , extension = sqrt(2)) # 输出: (x - sqrt(2))*(x + sqrt(2))
print(f'{expr} ->因式分解后-> {factored}')
# 在模素数 p 的域中分解(如密码学或编码理论中常用)
expr = x ** 2 + 1
factored = factor(expr , modulus = 5) # 输出: (x - 2)*(x + 2) (模5下 2²=4 ≡ -1)
print(f'{expr} ->因式分解后-> {factored}')
from sympy import I , exp , expand , expand_power_exp , log , sin , symbols
a , b , c = symbols('a b c' , positive = True , real = True)
"""
expand 展开表达式中的括号,合并同类项
factor 将多项式分解为不可约因子的乘积形式
"""
expr = (a + b) * (a + c)
print(f'{expr} ->(mul = True)->展开乘法表达式-> {expand(expr , mul = True)}')
expr = a ** (b + c)
# 需要声明 a 为正数, 严格数学场景,确保展开安全
print(f'{expr} ->(power_exp = True)->展开幂的指数加法-> {expand(expr , power_exp = True)}')
# 快速强制展开,忽略符号假设
print(f'{expr} ->(expand_power_exp)->强制展开幂的指数加法-> {expand_power_exp(expr)}')
expr = (a * b) ** c
print(f'{expr} ->(power_base = True)->展开底数的乘积-> {expand(expr , power_base = True)}')
expr = log(a * b)
print(f'{expr} ->(log = True)->展开对数表达式-> {expand(expr , log = True)}')
expr = sin(a + b)
print(f'{expr} ->(trig = True)->展开三角函数的和角公式-> {expand(expr , trig = True)}')
expr = (a + b) ** 3
print(f'{expr} ->(multinomial = True)->展开多项式的高次幂-> {expand(expr , multinomial = True)}')
expr = (a + I * b) ** 3
print(f'{expr} ->(complex = True)->分离虚数的实部和虚部-> {expand(expr , complex = True)}')
expr = exp(a + I * b)
print(f'{expr} ->(complex = True)->分离虚数的实部和虚部-> {expand(expr , complex = True)}')
expr = (a + b) ** 3
print(f'{expr} ->(modulus = 2)->对展开后的系数取模运算-> {expand(expr , modulus = 2)}')
假设有两个表达式,比如(x + 1)^2和x^2 + 2x + 1,这时候用equals()应该返回True,因为它们展开后是一样的,而用==的话可能返回False,因为结构不同。
from __future__ import annotations
from sympy import cos , sin , sqrt , symbols
x , y = symbols('x y')
"""
验证公式化简是否正确
判断方程解的等价性
测试代码中表达式是否数学等价
返回值可能是 None: 当无法确定等价性时(如涉及未定义符号的复杂条件)
数值验证: equals() 会尝试代入随机数值进行验证,增加结果的可信度
符号假设: 符号的假设(如正数、实数等)可能影响结果
"""
# 示例1:结构不同但数学等价
expr1 = (x + 1) ** 2
expr2 = x ** 2 + 2 * x + 1
print(expr1.equals(expr2)) # 输出 True
# 示例2:三角函数恒等式
expr3 = cos(x) ** 2 + sin(x) ** 2
expr4 = 1
print(expr3.equals(expr4)) # 输出 True
# 示例3:符号假设的影响
a = symbols('a' , positive = True)
expr5 = sqrt(a ** 2)
expr6 = a
print(expr5.equals(expr6)) # 输出 True(因为 a 被定义为正数)
# 示例4:无法确定的情况
expr7 = x + y
expr8 = y + x
print(expr7 == expr8) # 输出 False(结构顺序不同)
print(expr7.equals(expr8)) # 输出 True(数学等价)
# 示例5:涉及复杂化简
expr9 = x ** 2 - 1
expr10 = (x - 1) * (x + 1)
print(expr9.equals(expr10)) # 输出 True
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。