Исследуем ряд exp(x)
<x=1
eps=10**(-6)
s=x
t=x
i=1
while abs(t/s)>eps:
t=(x/i)*t
s=s+t
i=i+1
import math
a=math.fabs(s-math.exp(x))/math.exp(x)
print ('s=',s, 'tmax=',t, 'a=',a, 'i=', i)>
sum | t max | ошибка | степень eps |
---|---|---|---|
2.7166666666666663 | 0.008333333333333333 | 0.0005941848175817597 | -2 |
2.7180555555555554 | 0.0013888888888888887 | 8.324114928800986e-05 | -3 |
2.7182539682539684 | 0.00019841269841269839 | 1.125202597843745e-06 | -4 |
2.7182818284467594 | 1.605904383682161e-10 | 2.220446049250313e-16 | -8 |
2.7182818284590455 | 1.561920696858622e-16 | 1.6337129034990842e-16 | -16 |
- Из данной таблицы мы видим, что при значениях x=1 алгоритм сходится к 2.7182(e). Значение тем ближе к е, чем больше точность.
- Количество точных знаков меньше ожидаемого, так как мы привысили точность.
- После того, как наша точность превысила машинную, значение суммы ряда остается постоянным( при х=1 s=2.7182818284590455).
Используем "плохую" версию алгоритма.
<import math
x=1
eps=10**(-5)
s=x
t=x
i=1
while abs(t/s)>eps:
import math
t=x**i/math.factorial(i)
s=s+t
i=i+1
import math
a=math.fabs(s-math.exp(x))/math.exp(x)
print ('s=',s, 'tmax=',t, 'a=',a, 'i=', i)
>
"Хороший" | "Плохой" |
---|---|
2.71827876984127 | 2.71827876984127 |
7.38905609893089 | 8.389046015712681 |
21.476989610413156 | 22.08553692318766 |
Используем встроенную функцию math.exp(x). И сравним с суммой ряда при дольшой точности
math.exp(x) | Сумма ряда |
---|---|
2.718281828459045 | 2.7182818284590455 |
7.38905609893065 | 8.389056098930649 |
20.085536923187668 | 21.476989610413156 |
- Из данной таблицы мы видим, что ряд не совсем точно сходится к истинному значению.
- При больших точностях функция ошибок от количества слагаемых выходит на константу.