Arhn - архитектура программирования

Как найти n-й член производящей функции с помощью sympy?

У меня есть рациональная функция: f(x) = P(x)/Q(x). Например:

f(x) = (5x + 3)/(1-x^2)

Поскольку f(x) является производящей функцией, ее можно записать в виде:

f(x) = a0 + a1*x + a2*x² + ... + a_n*x^n + ... = P(x)/Q(x)

Как я могу использовать sympy, чтобы найти nth член производящей функции f(x) (то есть a_n)?

Если в Sympy такой реализации нет, мне также любопытно узнать, реализована ли она в других пакетах, таких как Maxima.

Я ценю любую помощь.

19.12.2019


Ответы:


1

Чтобы получить общую формулу для a_n производящей функции рациональной формы, rational_algorithm можно использовать. Например:

from sympy import simplify
from sympy.abc import x, n
from sympy.series.formal import rational_algorithm

f = (5*x + 3)/(1-x**2)
func_n, independent_term, order = rational_algorithm(f, x, n, full=True)
print(f"The general formula for a_n is {func_n}")
for k in range(10):
    print(f"a_{k} = {simplify(func_n.subs(n, k))}")

Выход:

The general formula for a_n is (-1)**(-n - 1) + 4
a_0 = 3
a_1 = 5
a_2 = 3
a_3 = 5
a_4 = 3
a_5 = 5
a_6 = 3
a_7 = 5
a_8 = 3
a_9 = 5
20.12.2019
  • Это именно то, что я искал. Спасибо 20.12.2019

  • 2

    Вы можете взять k-ю производную и заменить 0 на x и разделить на factorial(k):

    >>> f = (5*x + 3) / (1-x**2)
    >>> f.diff(x, 20).subs(x, 0)/factorial(20)
    3
    

    Ссылка здесь говорит о рациональных производящих функциях. В поисках повторения вы можете довольно быстро увидеть шаблон, используя дифференцирование:

    [f.diff(x,i).subs(x,0)/factorial(i) for i in range(6)]
    [3, 5, 3, 5, 3, 5]
    
    19.12.2019

    3

    Адаптируя подход из этот пост, вы можно попробовать следующее:

    from sympy import *
    from sympy.abc import x
    
    f = (5*x + 3) / (1-x**2)
    print(f.series(n=20))
    k = 50
    coeff50 = Poly(series(f, x, n=k + 1).removeO(), x).coeff_monomial(x ** k)
    print(f"The coeffcient of x^{k} of the generating function of {f} is {coeff50}")
    
    # to get the first 100 coeffcients (reversing the list to get a[0] the
    #   coefficient of x**0 etc.):
    a = Poly(series(f, x, n=100).removeO(), x).all_coeffs()[::-1]
    
    

    Выход:

    3 + 5*x + 3*x**2 + 5*x**3 + 3*x**4 + 5*x**5 + 3*x**6 + 5*x**7 + 3*x**8 + 5*x**9 + 3*x**10 + 5*x**11 + 3*x**12 + 5*x**13 + 3*x**14 + 5*x**15 + 3*x**16 + 5*x**17 + 3*x**18 + 5*x**19 + O(x**20)
    The coeffcient of x^50 of the generating function of (5*x + 3)/(1 - x**2) is 3
    

    Следуя этому примеру на Cut The Knot, этот подход можно использовать для узнайте, сколькими способами сумму n можно оплатить монетами в 1, 5, 10, 25 и 50 центов.

    f = 1/((1 - x)*(1 - x**5)*(1 - x**10)*(1 - x**25)*(1 - x**50))
    a = Poly(series(f, x, n=101).removeO(), x).all_coeffs()[::-1]
    print(a[50]) # there are 50 ways to pay 50 cents
    print(a[100]) # there are 292 ways to pay 100 cents
    
    19.12.2019

    4

    Максимум:

    powerseries((5*x+3)/(1-x^2),x,0);
    

    возвращается

    powerseries_maxima_result

    Используйте part для извлечения генератора:

    part(''%,1);
    (4-(-1)^i1)x^i1
    

    и coeff, чтобы получить коэффициент:

    a(i1) := coeff(''%, x, i1);
    [a(0), a(1), a(2)];
    [3, 5, 3]
    
    20.12.2019
  • Как вернуть только коэффициент a_n? 20.12.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..