没有阶乘函数在 python 中进行指数逼近
without factorial function to do exponent approximation in python
使用循环编写一个程序,使用以下公式计算 的值。
e ^ x = 1+x/1!+x^2/2!+x^3/3!+ ...
注意不要在数学模块中导入阶乘函数。
样本 answers:e=2.71828 和 e^2=7.389056
不使用阶乘:
def calc_exp(x, n = 10):
' calc e^x using 1+x/1!+x^2/2!+x^3/3!+ . with a default of 10 terms (n = 10) '
term = 1 # First term is 1
result = term # init result to first term of series
for k in range(1, n):
term *= x/k # current term is (previous term)*x/k (i.e. effectively x^k/k!)
result += term # add current term
return result
测试
for x in [1, 2]:
print(f'e^{x} = {calc_exp(x)}') # Use print('e^{} = {}'.format(x, calc_exp(x)))
# for earlier than Python 3.6
输出
e^1 = 2.7182815255731922
e^2 = 7.3887125220458545
您可以使用 accumulate() 函数(来自 itertools)用您指定的项数构建序列,然后使用 sum() 函数将它们全部相加:
from itertools import accumulate
def exp(x,terms=20):
return sum(accumulate(range(1,terms+1),lambda t,i:t*x/(i-1)))
print(exp(1)) # 2.7182818284590455
print(exp(2)) # 7.389056098925863
也可以递归完成(不用库):
def exp(x,terms=20,f=1):
return 1 + x/f if f==terms else 1 + x*exp(x,terms,f+1)/f
递归函数的工作方式是从上一项开始逐步向后构建系列。这种方法比添加项收敛得更快(可能是因为它在每次迭代时不会损失那么多的精度)
从最深的递归级别到初始函数调用:
f=20: 1 + x/f F20: 1 + x/20
f=19: 1 + x * F20 / f F19: 1 + x * (1 + x/20) / 19
1 + x/19 + x^2/(20*19)
f=18: 1 + x * F19 / f F18: 1 + x * (1 + x/19 + x^2/(20*19)) / 18
1 + x/18 + x^2/(19*18) + x^3/(20*19*18)
f=17: 1 + x * F18 / f F17: 1 + x/17 + x^2/(18*17) + x^3/(19*18*17) + ...
...
f=3 : 1 + x * F4 / f F3: 1 + x/3 + x^2/(4*3) + x^3/(5*4*3) + ...
f=2 : 1 + x * F3 / f F2: 1 + x/2 + x^2/(3*2) + x^3/(4*3*2) + ...
f=1 : 1 + x * F2 / f exp: 1 + x/1 + x^2/(2*1) + x^3/(3*2*1) + ...
或者,如果你不喜欢递归,迭代的解决方案也是可以的:
def exp(x,terms=20):
result = 1
for f in range(terms,0,-1):
result = 1 + x * result / f
return result
请注意,在所有情况下,随着 x 变大,您将需要更多项才能获得所需的精度
使用循环编写一个程序,使用以下公式计算 的值。
e ^ x = 1+x/1!+x^2/2!+x^3/3!+ ...
注意不要在数学模块中导入阶乘函数。
样本 answers:e=2.71828 和 e^2=7.389056
不使用阶乘:
def calc_exp(x, n = 10):
' calc e^x using 1+x/1!+x^2/2!+x^3/3!+ . with a default of 10 terms (n = 10) '
term = 1 # First term is 1
result = term # init result to first term of series
for k in range(1, n):
term *= x/k # current term is (previous term)*x/k (i.e. effectively x^k/k!)
result += term # add current term
return result
测试
for x in [1, 2]:
print(f'e^{x} = {calc_exp(x)}') # Use print('e^{} = {}'.format(x, calc_exp(x)))
# for earlier than Python 3.6
输出
e^1 = 2.7182815255731922
e^2 = 7.3887125220458545
您可以使用 accumulate() 函数(来自 itertools)用您指定的项数构建序列,然后使用 sum() 函数将它们全部相加:
from itertools import accumulate
def exp(x,terms=20):
return sum(accumulate(range(1,terms+1),lambda t,i:t*x/(i-1)))
print(exp(1)) # 2.7182818284590455
print(exp(2)) # 7.389056098925863
也可以递归完成(不用库):
def exp(x,terms=20,f=1):
return 1 + x/f if f==terms else 1 + x*exp(x,terms,f+1)/f
递归函数的工作方式是从上一项开始逐步向后构建系列。这种方法比添加项收敛得更快(可能是因为它在每次迭代时不会损失那么多的精度)
从最深的递归级别到初始函数调用:
f=20: 1 + x/f F20: 1 + x/20
f=19: 1 + x * F20 / f F19: 1 + x * (1 + x/20) / 19
1 + x/19 + x^2/(20*19)
f=18: 1 + x * F19 / f F18: 1 + x * (1 + x/19 + x^2/(20*19)) / 18
1 + x/18 + x^2/(19*18) + x^3/(20*19*18)
f=17: 1 + x * F18 / f F17: 1 + x/17 + x^2/(18*17) + x^3/(19*18*17) + ...
...
f=3 : 1 + x * F4 / f F3: 1 + x/3 + x^2/(4*3) + x^3/(5*4*3) + ...
f=2 : 1 + x * F3 / f F2: 1 + x/2 + x^2/(3*2) + x^3/(4*3*2) + ...
f=1 : 1 + x * F2 / f exp: 1 + x/1 + x^2/(2*1) + x^3/(3*2*1) + ...
或者,如果你不喜欢递归,迭代的解决方案也是可以的:
def exp(x,terms=20):
result = 1
for f in range(terms,0,-1):
result = 1 + x * result / f
return result
请注意,在所有情况下,随着 x 变大,您将需要更多项才能获得所需的精度