Вчера я писал о домохозяйстве высшего порядка обобщения метода нахождения корня Ньютона. За N как минимум 2, определить
и повторять ЧАС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