Julia中实现MATLAB partfrac、Mathematica Apart等效的部分分式分解
Julia本地实现部分分式分解的方案
目前有几个无需依赖SymPy、纯Julia本地实现的部分分式分解方案,完全等效于MATLAB的partfrac、Mathematica的Apart功能:
1. 使用Symbolics.jl(推荐)
Symbolics.jl是Julia原生的符号计算库,内置了完整的部分分式分解功能,性能远优于通过PyCall调用SymPy:
using Symbolics # 定义符号变量 @variables x # 构造目标有理函数 f = (x^2 + 3x + 2) / ((x + 1)^2 * (x - 2)) # 执行部分分式分解 apart_f = Symbolics.apart(f)
执行后apart_f会直接输出分解后的部分分式表达式,支持复杂的有理函数(包括多重根、二次不可约因子等场景)。
2. 基于Polynomials.jl手动实现
如果需要纯数值/多项式运算场景,可以借助Polynomials.jl的多项式因式分解、求导能力,结合留数定理手动实现:
using Polynomials function partial_fraction(num::Polynomial, den::Polynomial) # 先分离整式部分 q, r = divrem(num, den) iszero(r) && return q result = q # 对分母进行因式分解 factors = factor(den) for (factor, multiplicity) in factors if degree(factor) == 1 # 处理一次因子(实根) root_val = -factor.coeffs[2] # 因子形式为x + a,根为-a for k in 1:multiplicity # 计算对应留数系数 deriv = derivative(den, multiplicity - k)(root_val) res = deriv / (factorial(multiplicity - k) * factorial(k - 1)) result += res / (factor)^k end elseif degree(factor) == 2 # 处理二次不可约因子(共轭复根场景) # 示例仅处理单重二次因子,多重情况可扩展 if multiplicity == 1 # 设部分分式为(mx + n)/factor,联立方程求解系数 m, n = symbols(:m, :n) eq = r - (m*x + n)*(den ÷ factor) coeffs = coefficients(eq) sol = solve([coeff == 0 for coeff in coeffs], [m, n]) result += (sol[m]*x + sol[n])/factor end end end return result end # 示例调用 num = Polynomial([2, 3, 1]) # x² + 3x + 2 den = Polynomial([-2, 3, 1]) * Polynomial([1, 1]) # (x-2)(x+1)² partial_fraction(num, den)
注:代码中符号求解部分可替换为纯数值联立方程求解,进一步降低依赖。
3. 使用RationalFunctions.jl
这个包专门针对有理函数运算,内置了apart函数,用法简洁:
using RationalFunctions f = RationalFunction(x^2 + 3x + 2, (x + 1)^2 * (x - 2)) apart_f = apart(f)
内容的提问来源于stack exchange,提问作者ITA
相关产品推荐
相关产品推荐

