You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:58:13