python 中的泰勒级数有问题(同情)
Trouble with taylor series in python (sympy)
我正在尝试获取此函数的泰勒级数
应该和这个类似,考虑到d居中或者围绕rs
然而,当我尝试以 @Saullo 为例来解决我的问题时,
如你所见,结果是从泰勒级数中消去"d",这不应该是我的目标。
关于该功能的另一个附加信息实际上是:
我做错了什么??,有没有办法在不删除 "d" 的情况下得到我的结果??
感谢任何帮助
代码
Thank you for your response and interest in helping me, here is my code until nowdays @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
问题是你的表达式足够复杂,以至于 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
它们都是复杂的表达式。事实上,在系列得到一个不会取消到 0 的术语之前,你需要得到几个术语(最多 a3
):
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
。 series
返回的 O
项总是正确的(意味着所有低阶项都是完整的)。
我正在尝试获取此函数的泰勒级数
应该和这个类似,考虑到d居中或者围绕rs
然而,当我尝试以 @Saullo 为例来解决我的问题时,
如你所见,结果是从泰勒级数中消去"d",这不应该是我的目标。
关于该功能的另一个附加信息实际上是:
我做错了什么??,有没有办法在不删除 "d" 的情况下得到我的结果??
感谢任何帮助
代码
Thank you for your response and interest in helping me, here is my code until nowdays @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
问题是你的表达式足够复杂,以至于 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
它们都是复杂的表达式。事实上,在系列得到一个不会取消到 0 的术语之前,你需要得到几个术语(最多 a3
):
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
。 series
返回的 O
项总是正确的(意味着所有低阶项都是完整的)。