Домашние задания: Информатика

Python "Двойные и кратные циклы"

алгоритм идет, но выдаёт очень маленький ответ
задание прикреплено картинкой
.
import math
cj = 10
ci = 0
j = 1
E = 10 ** (-3)
for i in range (1, 21): #while?
sum=0
while cj > = E:
cj = math.sin ( i * j / 3.14 ) / ( i ** 5 + j ** 5 )
j += 1
sum+=cj
ci += cj #i+=1 ?
print (round (0.3 * ci , 3 ))
Точность вычислений - это разница между вычисленной суммой ряда и её точным значением. То, что случайно выбранный член ряда по j оказался меньше заданной точности, ещё ничего не гарантирует. А потом ещё эти никем не учтённые погрешности накапливаются при суммировании по i.

Чтобы гарантированно получить требуемую точность, необходимо оценить остаток ряда.
 ∞                           ∞            ∞            ∞          k
Σ sin(ij/π) / (i⁵ + j⁵) ≤ Σ 1 / j⁵ ≤ Σ 1 / j⁴ = Σ 1 / j⁴ - Σ 1 / j⁴ =
j=k+1 j=k+1 j=k+1 j=1 j=1
k
= π⁴/90 - Σ 1 / j⁴
j=1
Где k - текущий член ряда по j.
Сумма первого слагаемого вычислена Эйлером как сумма обратных четвёртых степеней.
Сумму второго слагаемого (вычитаемого) мы можем накапливать при вычислениях в цикле.
Именно эту штуку и надо сравнивать с точностью в цикле по j.

Кроме того, выше указано, погрешность накапливается при сумме по i, и у неё - один и тот же знак. Проще всего разделить точность на 20 и по каждому i достигать своего куска (0.05 × 10⁻³ / 0.3). Делим на 0.3, потому что итоговое выражение будет умножено на этот коэффициент.

И конечно, если считать π = 3.14, то точность 0.001 никогда не будет достигнута.

И ради Бога, никогда не вычисляй степени таким варварским образом. Возведение в степень - тяжёлая вычислительная операция. Лучше хранить степени i и j между итерациями и в следующей итерации домножать на текущее значение i или j, соответственно.
Маргарита Омельченко
Маргарита Омельченко
87 571
Лучший ответ