Проблема с серией Тейлора в питоне (sympy)

Я пытаюсь получить серию Тейлора для этой функции

Что должно быть похоже на это, учитывая, что d расположен по центру или вокруг rs

Однако, когда я пытаюсь взять пример с >@Saullo для моей проблемы, введите здесь описание изображения

Как видите, результатом является исключение «d» из ряда Тейлора, что не должно быть моей целью.

Еще одна дополнительная информация о функции: введите здесь описание изображения

Я что-то делаю не так??, есть ли способ получить мой результат, не удаляя "d"??

Любая помощь приветствуется

Код

Спасибо за ваш ответ и желание помочь мне, вот мой код до сегодняшнего дня @asmeurer

import sympy as sy
#import numpy as np

from sympy import init_printing
init_printing(use_latex=True)

# Define the variable and the function to approximate
z, d, r_s, N_e, r_t, r_s, r_b = sy.symbols('z  d r_s N_e r_t r_s r_b')

# Define W_model
def W_model(r_t=r_t, r_b=r_b, r_s=r_s, z=z):

    s_model = sy.sqrt(pow(r_t, 2) - pow(r_s*sy.sin(z), 2)) - sy.sqrt(pow(r_b, 2) - pow(r_s*sy.sin(z), 2))
    d_model = r_t - r_b

    STEC_approx = N_e * s_model
    VTEC_approx = N_e * d_model

    return STEC_approx/VTEC_approx

f = W_model() 
# printing Standard model
f

# Some considerations for modify Standard model
rb = r_s - d/2
rt = r_s + d/2

f = W_model(r_b=rb, r_t=rt, r_s=r_s, z=z) 
# printing My model
f

## Finding taylor series aproximmation for W_model
num_of_terms = 2
# creates a generator
taylor_series = f.series(x=d, n=None)

# takes the number of terms desired for your generator
taylor_series = sum([next(taylor_series) for i in range(num_of_terms)])
taylor_series

person William Trigos    schedule 22.11.2016    source источник
comment
Пожалуйста, вставьте свой код сюда. Было бы намного проще проверить, если бы я мог скопировать и вставить его.   -  person asmeurer    schedule 10.12.2016
comment
Спасибо за ваш ответ и желание помочь мне, я обновил свой вопрос своим кодом до сегодняшнего дня. @asmeurer   -  person William Trigos    schedule 13.12.2016


Ответы (1)


Проблема в том, что ваше выражение настолько сложное, что series не знает, что члены нечетного порядка равны нулю (для них вы получаете сложные выражения, но если вы вызываете для них simplify(), они становятся равными 0). Рассмотреть возможность

In [62]: s = f.series(d, n=None)

In [63]: a1 = next(s)

In [64]: a2 = next(s)

In [65]: simplify(a0)
Out[65]:
       rₛ
────────────────
   _____________
  ╱   2    2
╲╱  rₛ ⋅cos (z)

In [66]: simplify(a1)
Out[66]: 0

Если вы напечатаете a0 и a1, они оба будут сложными выражениями. На самом деле вам нужно получить несколько членов (до a3), прежде чем ряд получит член, который не сокращается до 0:

In [73]: simplify(a3)
Out[73]:
      _____________
 2   ╱   2    2        2
d ⋅╲╱  rₛ ⋅cos (z) ⋅sin (z)
───────────────────────────
           3    6
       8⋅rₛ ⋅cos (z)

Если вы сделаете f.series(d, n=3), это даст расширение до d**2 (n=3 означает + O(d**3)). Вы можете немного упростить выражение, используя

collect(expr.removeO(), d, simplify)

Внутри, когда вы даете ряду явное n, он использует почленный генератор, чтобы получить столько членов, сколько необходимо для правильного расширения O(d**n). Если вы используете генератор самостоятельно (n=None), вам необходимо сделать это вручную.

Как правило, итератор не гарантирует, что вы получите следующий срок заказа. Если вам нужны гарантии того, что у вас есть все условия, вам необходимо предоставить явное n. Термин O, возвращаемый series, всегда верен (это означает, что все термины более низкого порядка завершены).

person asmeurer    schedule 12.12.2016
comment
Отличное объяснение, теперь оно понятнее из-за выражений, которые я не мог распознать. Спасибо за вашу помощь. @asmeurer - person William Trigos; 13.12.2016