2016-09-06 2 views
3

У меня есть рациональное выражение (здесь: билинейное) и хочу, чтобы я симплицировал для сбора коэффициентов . Но как?В sympy, как мне получить коэффициенты рационального выражения?

from sympy import symbols, Wild, pretty_print 

a, b, c, d, x, s = symbols("a b c d x s") 

def coeffs(expr): 
    n0 = Wild("n0", exclude=[x]) 
    n1 = Wild("n1", exclude=[x]) 
    d0 = Wild("d0", exclude=[x]) 
    d1 = Wild("d1", exclude=[x]) 
    match = expr.match((n0 + n1*x)/(d0 + d1*x)) 
    n0 = n0.xreplace(match) 
    n1 = n1.xreplace(match) 
    d0 = d0.xreplace(match) 
    d1 = d1.xreplace(match) 
    return [n0, n1, d0, d1] 

if __name__ == '__main__': 
    pretty_print(coeffs((a + b*x)/(c + d*x))) 
    pretty_print(coeffs(2 * (a + b*x)/(c + d*x))) 
    pretty_print(coeffs(s * (a + b*x)/(c + d*x))) 

Я попытался это с помощью match, но она не почти всегда, например, в последней строке (один с символическими предэкспонентами в «с») Я получаю

Traceback (most recent call last): 
    File "...", line 20, in <module> 
    pretty_print(coeffs(s * (a + b*x)/(c + d*x))) 
    File "...", line 11, in coeffs 
    n0 = n0.xreplace(match) 
    File "/usr/lib/python3/dist-packages/sympy/core/basic.py", line 1626, in xreplace 
    return rule.get(self, self) 
AttributeError: 'NoneType' object has no attribute 'get' 

поэтому матч сделал не работа.

ответ

3

Если вы знаете, что выражения, которые вы рассмотрите, являются рациональными, вы можете извлечь их числитель и знаменатель и найти их коэффициенты независимо.

Вот один подход, чтобы сделать так:

import sympy as sp 

def get_rational_coeffs(expr): 
    num, denom = expr.as_numer_denom() 

    return [sp.Poly(num, x).all_coeffs(), sp.Poly(denom, x).all_coeffs()] 

a, b, c, d, x, s = sp.symbols("a b c d x s") 
expr = (a + b*x)/(c + d*x) 

# note the order of returned coefficients 
((n1, n0), (d1, d0)) = get_rational_coeffs(s*expr) 
print(((n0, n1), (d0, d1))) 

((a*s, b*s), (c, d))

выше подход также быстрее, чем coeffs. Я получаю следующие тайминги (на основе %timeit магии Jupyter в) для случая, когда требуются коэффициенты expr (случай, когда coeffs преуспевает):

%timeit get_rational_coeffs(expr) 
%timeit coeffs(expr) 

1000 loops, best of 3: 1.33 ms per loop

1000 loops, best of 3: 1.99 ms per loop

Смежные вопросы