Генерация кода Python из SymPy

1 min


Вчера я писал о домохозяйстве высшего порядка обобщения метода нахождения корня Ньютона. За N как минимум 2, определить

H_n (x) = x + (n-1)  frac { left ( frac {1} {f (x)}  right) ^ {(n-2)}} { left ( frac {1} {Р (х)}  справа) ^ {(п-1)}}

и повторять ЧАСN найти корень е(Икс). когда N = 2, это метод Ньютона. Во вчерашнем посте я использовал Mathematica, чтобы найти выражения для ЧАС3 а также ЧАС4, а затем использовал Mathematica FortranForm() функция для экспорта кода Python. (Mathematica не имеет функции для экспорта кода Python как такового, но синтаксис Fortran в этом случае был идентичен.)

Аарон Мюрер указал, что было бы проще сгенерировать код Python в Python, используя SymPy для вычисления и labdify() сгенерировать код. Я не слышал о lambdify раньше, поэтому я опробовал его предложение. Полученный код красив и компактен.

    from sympy import diff, symbols, lambdify

    def f(x, a, b):
        return x**5 + a*x + b

    def H(x, a, b, n):
        x_, a_, b_ = x, a, b
        x, a, b = symbols('x a b')
        expr = diff(1/f(x,a,b), x, n-2) / 
               diff(1/f(x,a,b), x, n-1)
        g = lambdify((x,a,b), expr)
        return x_ + (n-1)*g(x_, a_, b_)

Это реализует все ЧАСN сразу. В предыдущем посте реализовано три ЧАСN отдельно.

Первая пара строк H требуется небольшое объяснение. Я хотел использовать те же имена для чисел что функция ЧАС берет и символы что SymPy работал, поэтому я сохранил числа в локальные переменные.

Этот код подходит для демонстрации, но в процессе работы вы бы хотели сгенерировать функцию g один раз (для каждого N) и сохранять результат, а не генерировать его при каждом вызове H,


0 Comments

Ваш e-mail не будет опубликован. Обязательные поля помечены *