Лекция 5. Язык Питон-базовые структуры. Итерационный цикл (1152908), страница 2
Текст из файла (страница 2)
«Информатика. Язык Питон»шаг i1i-й член ряда из формулы (4.4)1 = 23∙1−12= − 23∙1+3623∙2−12∙523()3 = 2 ∙ 2 2 = − ∙ (−)=63∙2+36∙93…2 = 1 ∙ 2 (1) = ∙ (−)…Обратите внимание, что отличаются как формулы, так ифактический аргумент, который необходимо задать, для полученияочередного члена ряда, хотя формальный аргумент остаетсяодинаковым – это «».Программный код для вычисления суммы ряда (4.3) припомощи формулы (4.4) c фиксированной точностью# РАЗДЕЛ ПОДКЛЮЧЕНИЯ МОДУЛЕЙimport math as t # доступ к библиотеке по короткому имени ‘t’# РАЗДЕЛ КОНСТАНТEPS = 0.00001 # точность вычисленияMAX_COUNT = 2500 # ограничение числа итераций# РАЗДЕЛ ПЕРЕМЕННЫХx = 0.0# аргумент функцииi=0s_i = 0.0sums = 0.0# номер слагаемого в сумме – шаг итерации# слагаемое частичной суммы sums на i-м шаге# накапливаемое значение суммы ряда,# т.е.
частичная суммаFunc = 0.0# результат функции по проверочной формуле# РАЗДЕЛ ОПЕРАТОРОВprint('Вычисление функции разложением ее в ряд.\n')13Воробьева И.А. «Информатика. Язык Питон»print('Введите Х в диапазоне: -1 < X < 1: \n')x = float(print ('X = ')) # ввод аргумента Xprint ('x= ', x) # самоконтроль# вычислим сразу же контрольную формулу и выведем на экранFunc = 3 * t.exp((1/3)*t.log(1+x)) - 3print ('Контрольное значение функции = {0:9.6f}'.format(Func))#--- Блок инициализации перед вычислением ----------i=1# первый шагs_i = x # первое слагаемоеsums = s_i # частичная сумма на первом шаге# равна первому слагаемомуwhile not (t.fabs(s_i) < EPS) and (i !=MAX_COUNT): # если очередное# слагаемое не меньше и число итераций не достигло# допустимого предела, тогда продолжим накопление суммыi+= 1# увеличим номер слагаемого (и число итераций)s_i = (-s_i)*(3*i-4)*x/(3*i) # очередное слагаемоеsums = sums + s_i# накапливаем частичную суммуprint ('Сумма ряда ={0:9.6f}'.format(sums)) # вывод значения функции,# полученной с помощью суммы ряда# ===================================Вывод рекуррентного соотношения, когда член ряда – суммаслагаемыхРассмотрим вариант суммы ряда, когда слагаемые ряда являютсясоставными, вида ( ± ).
Например, функциисоответствует ряд111111!12!3(2)!( + ) − 2 ( + ) + ⋯ ± 2 (+1(2+1)())∓⋯+ ()(4.5)Ряд сходится при | | < 1 , а функция не определена для = 0.14Воробьева И.А. «Информатика. Язык Питон»В рядах такого вида будем выводить рекуррентные соотношениядля каждой составляющей слагаемого отдельно: = − ∙ (); = − ∙ ().и(4.6)Выведем формулу для ряда (4.5): () = () = 2−1−1= (−1) ∙ (2)! ∙ 2(2−2)! 2−2= (−1) ∙ (2+1) ∙и сделаем проверку:шаг i0(2−2)!= − 2 (2)∙(2−1)∙(2−2)! = −(2−1) 2−2= − 2(2−1)(2+1)22∙(2−1);(4.7)i-й член ряда из формулы (4.3)110 = = 1; 0 = = 1;1!1(см. замечание 4.2)1221 = 0 ∙ (−1)=− ;2∙12!2 ∙ 121 = 0 ∙ (−1)=− ;3322242 = − ∙ (−1)= ;2!4 ∙ 3 4!22 ∙ 3 42 = − ∙ (−1)= ;344……Фрагмент кода для такого ряда будет выглядеть следующим образом:#--- Блок инициализации перед вычислением ----------i=0# первый шагa_i = 1# первое составное слагаемоеb_i = 1# второе составное слагаемоеsums = a_i +b_i # частичная сумма на первом шагеwhile NOT(t.fabs(a_i +b_i ) < EPS) and (i !=MAX_COUNT): # если очередное# слагаемое не меньше и число итераций не достигло# допустимого предела, тогда продолжим накопление суммыi+= 1# увеличим номер слагаемогоa_i = (-a_i) * (x**2)/(4 * (i**2) - 2*i)# очередное слагаемое15Воробьева И.А.
«Информатика. Язык Питон»b_i = (-b_i) * (2*i-1) * (x**2)/(2*i + 1)sums = sums + a_i +b_i# накапливаем частичную сумму# ===================================Замечание 4.3. Рекомендации по выполнению лабораторнойработы.Использовать в условии прерывания цикла дополнительный счетчикдля защиты от зацикливания итераций.Использовать формулу 4.1. для вывода рекуррентного соотношения.Обязательно просчитать на калькуляторе значение контрольнойфункции при «хорошем числе» = 0.5 , чтобы иметьгарантированную величину, по которой можно контролироватьправильность работы программы при отладке.Некоторые варианты: работают с последовательностями, начиная с индекса «0»:0 ; 1 ; 2 ; .
. . . .. , а не с индекса «1»: 1 ; 2 ; . . . … . Отличительныйпризнак таких рядов – это «1» в качестве первого члена ряда; требуют поиска двух рекуррентных соотношений (когда член ряда является суммой 2-х слагаемых); имеют область определения | | < 1, ≠ 0 (когда в контрольнойфункции есть деление на ноль).Варианты 1, 7, 9, 27 - могут содержать опечатки (зависит от источника), 28, 33 –могут потребовать помощи или комментария (обратиться ко мне).16Воробьева И.А. «Информатика. Язык Питон»Проведение тестов и форматированный вывод результатовДля обеспечения качественной проверки суммирования ряда,исследования его сходимости и предоставления удобного результата,потребуется выполнить (и отобразить в отчете) следующие действия: вычислить на калькуляторе контрольную формулу при X=0.5; обеспечить табличное представление результата для фиксированной точности и массива значений Х = -0.98, -0.5, 0.1,0.5.
0.95; провестисериютестовдлязначенийточности = 10-2, 10-4, 10-6, 10-8; подсчитать число итераций, потребовавшихся для достижениязаданной точности.Результаты вычислений вывести на экран в виде таблице соследующими столбцами:|() − ()|,№XS(x),K,F(x),Номерчисло потребо- контрольнаяконтрольэлементасуммававшихсяформулаточностимассива Xрядаитераций-0.98…0.95Результат проведения эксперимента для одного фиксированногозначения точности приведен в таблице на рисунке ниже:17Воробьева И.А.
«Информатика. Язык Питон»Покажем, как обеспечить форматированный вывод в виде таблицы вPython. Пусть в программе определены величины:# РАЗДЕЛ ПЕРЕМЕННЫХx = [-0.98, -0.5, 0.1, 0.5, 0.95] # массив аргументов функцииeps = 0.0 # задаваемая точность суммирования ряда# (или константа или вводится с клавиатуры)sums = 0.0 # значение суммы ряда, вычисленное с точностью i=0# шаг итерации ≡ число итераций, которое было# выполнено для получения Sum# ----------- вспомогательные переменные -------------k = 0 # рабочая переменная для вывода заголовкаz = 0 # «число знаков после запятой в » +1zs = ‘’ # символьное представление целого числа из zformat_s= ‘’ # строка таблицы для форматного выводаТогда фрагменты кода табличного вывода данных:# посчитаем «число знаков после запятой в » +11z = math.ceil( abs(math.log(eps)/math.log(10)) ) + 1zs = str(z) # и преобразуем целое число z в символьный вид,например, число 5 символ ‘5’print(‘Eps = {0:e}‘.format(eps))# вывод в экспоненциальной форе# вывод заголовка таблицыprint (‘N |X| S(X) | K |F(X) | |S(X)-F(X)|’)for k in range (0, 80, 1): # обычно хватает 80 символов под таблицуprint (‘=’, end=’’) # на экране: ‘================================’# вывод полученных в программе данных в таблицу.
Очевидно, чтоэта строка должна попасть внутрь параметрического цикла по некоторомуиндексу = , , … , прохода по массиву , а до вывода этой строки долженотработать итерационный цикл вычисления , показанный на с.12format_s = ‘{0:2d}|{1:17.’ +zs+ ’f}|{2:17.’ +zs+ ’f}|{3:4d}|{4:17.’ +zs+’f}|{5:17.’ +zs+’f}|’ # сначала сформируем строку форматного выводаprint (format_s.format(j, x[j], sums, i, Func, abs(sums-Func)) # и приме# ним к ней метод str.format()использовано: [1]. “A Byte of Python” Автор – Swaroop Chitlur, перевод – В. Смоляр1Использованы свойства: 1) log10 10−4 = −4; 2) log =log ⁄log .18Воробьева И.А.
«Информатика. Язык Питон».