Я стремлюсь написать многомерное приближение Тейлора, используя sympy
, которое
- использует как можно больше встроенного кода,
- вычисляет усеченную тейлоровскую аппроксимацию заданной функции двух переменных
- возвращает результат без остатка Big-O, например. в
sin(x)=x - x**3/6 + O(x**4)
.
Вот что я пробовал до сих пор:
Подход 1
Наивно можно было просто комбинировать команду series
дважды для каждой переменной, что, к сожалению, не работает, как показано в этом примере для функции sin(x*cos(y))
:
sp.sin(x*sp.cos(y)).series(x,x0=0,n=3).series(y,x0=0,n=3)
>>> NotImplementedError: not sure of order of O(y**3) + O(x**3)
Подход 2
Основываясь на этом сообщении, я сначала написал одномерное приближение Тейлора:
def taylor_approximation(expr, x, max_order):
taylor_series = expr.series(x=x, n=None)
return sum([next(taylor_series) for i in range(max_order)])
Проверка на 1D-примерах работает нормально
mport sympy as sp
x=sp.Symbol('x')
y=sp.Symbol('y')
taylor_approximation(sp.sin(x*sp.cos(y)),x,3)
>>> x**5*cos(y)**5/120 - x**3*cos(y)**3/6 + x*cos(y)
Однако, если я знаю, что нужно выполнить цепочку вызовов для выполнения обоих расширений в x
и y
, sympy вешает трубку.
# this does not work
taylor_approximation(taylor_approximation(sp.sin(x*sp.cos(y)),x,3),y,3)
Кто-нибудь знает, как это исправить или добиться этого альтернативным способом?