Вычислительная практика I, ММФ, БГУ
Лаврова О.А., ноябрь 2017
import numpy as np
Выведем на экран таблицу чисел из двух столбцов с использованием while-цикла
x_start = 100
dx = 10
x_max = 200
x = x_start
while x<=x_max: # Важно: не забывайте символ : в конце while-строки!
print(x,x/5+4) # Важно: строки внутри цикла должны иметь одинаковый отступ!
x+=dx
print("End of loop") # Важно: конец цикла определяется командой, имеющей одинаковый отступ с while-строкой
Сохраним табличные результаты в виде списка (list)
T = [] # Инициализация пустого списка
x = x_start
while x<=x_max:
T.append([x, x/5+4]) # Добавление элемента в конец списка
x += dx
print(T)
for x,y in T:
print(x,y)
Аналогичный результат можно сделать более компактным, используя for-цикл с итерированием по списку. Часто список для цикла создается с помощью функции range -- генератора списка ЦЕЛЫХ чисел
for x in range(x_start,x_max+1,dx): # Важно: значение верхнего предела последовательности (второй аргумент range установлен C_max+1)
# должно превышать желаемое максимальное значение последовательности (желаемое значение C_max)!
print (x, x/5+4)
print("End of loop")
T = []
for x in range(x_start,x_max+1,dx):
T.append([x, x/5+4])
print(T)
Важно: Никогда не изменяйте список, по которому осуществляется итерирование в цикле!
Использование генератора списка (list comprehension)
T = [[x, x/5+4] for x in range(x_start,x_max+1,dx)]
print(T)
Использование map-функции и lambda-функции
T = list(map(lambda x: [x, x/5+4],range(x_start,x_max+1,dx)))
print(T)
x = np.arange(x_start, x_max+1, dx)
T =np.transpose([x, x/5+4])
print(T)
x_start = 100; x_max = 10^4
while-цикл
%timeit('while x<=x_max:; T.append([x, x/5+4]); x +=dx','x = x_start; T = []')
for-цикл
%timeit('for x in range(x_start,x_max+1,dx):; T.append([x, x/5+4])','T = []')
генератор списка
%timeit('[[x, x/5+4] for x in range(x_start,x_max+1,dx)]')
map-функция
%timeit('list(map(lambda x: [x, x/5+4],range(x_start,x_max+1,dx)))')
%timeit('x = np.arange(x_start, x_max+1,dx);T =np.transpose([x, x/5+4])')
Самым быстрым способом работы оказалось использование массивов пакета numpy (8.78 ns per loop) и функционального стиля программирования. Далее эффективным по времени оказалось использование циклов while и for (14.1 ns per loop)
N = int(input("Введите n:"))
x1 = 1
x2 = 1
xn = 1
n = 3
while n<=N:
xn = x2 + x1
x1 = x2
x2 = xn
n += 1
print ("%d число Фибоначчи равно %d" % (N, xn))
N = int(input("Введите n:"))
x1 = 1
x2 = 1
xn = 1
for n in range(3,N+1):
xn = x2 + x1
x1 = x2
x2 = xn
print ("%d число Фибоначчи равно %d" % (N, xn))
Создадим список с помощью for-цикла
N = int(input("Введите n:"))
if N == 0 or N == 1:
fib = [1]
else:
fib = [1,1]
for n in range(2,N):
fib.append(fib[-1] + fib[-2])
fib
Создадим массив с помощью for цикла
N = int(input("Введите n:"))
import numpy as np
fib = np.zeros(N,dtype=np.int64) # Важно: при работе с массивами необходимо предварительное выделение памяти.
fib[0] = 1
fib[1] = 1
for n in range(2,N):
fib[n] = fib[n-1] + fib[n-2]
fib
help(np.zeros)
def fib(n):
if n==0:
return 0
elif n==1:
return 1
else:
return fib(n-2)+fib(n-1)
N = int(input("Введите N:"))
print ("%d число Фибоначчи равно %d" % (N, fib(N)))
Создание списка с использованием функционального стиля
def fib(n):
if n==0:
return 1
elif n==1:
return 1
else:
return fib(n-2)+fib(n-1)
N = int(input("Введите n:"))
Fib = [fib(n) for n in range(N)]
Fib
Попробуйте создать последовательность из 100 чисел Фибоначчи, используя три способа (список + for, массив + for, список + рекурсия). Оцените время для генерации последовательности. Сравните с результатом из Примера 1.
Прочитайте [Style Guide for Python Code] (https://www.python.org/dev/peps/pep-0008/). Обратите внимание на следующую информацию:
Приведите 5 правил оформления кода (английский вариант и его перевод), которые Вы считаете важными.
Для Задачи о падении тела (Лабораторная работа 1) определите время касания телом земли (время нахождения тела в воздухе).
ВАЖНО: скорректируйте сначала реализацию ЛР1, переместив начало координат с центра масс тела на уровень земли. В этом случае изменится формула для вертикального перемещения
$$ s_{ver}(t) = h_{ver,start} + v0_{ver} t - \frac{g}{2} t^2. $$Формула для горизонтального перемещения останется без изменений.
Дальнейшую реализацию осуществите двумя способами:
Сравните полученные результаты.
Для Задачи о падении тела (Лабораторная работа 1) определите максимальную высоту тела во время полета.
Измените реализацию Лабораторной работы 1 (Задача о падении тела), заменив использование массивов (ndarray) на списки (list).
Вычислите приближенно число $\pi$ по частичным суммам рядов
Для этого напишите пользовательскую функцию, которая возвращает последовательность (массив или список) соответствующих ряду частичных сумм.
Визуализируйте абсолютную ошибку вычисления числа $\pi$ в зависимости от количества слагаемых частичной суммы. Определите формулу, которая реализует самую быструю сходимость.
Проверьте корректность формул, используя возможности символьных вычислений с применением библиотеки sympy. Например,
from sympy import *
k = symbols('k')
Sum(1/(4*k+1)/(4*k+3), (k, 0, oo)).doit().simplify()
Задание выполняется по вариантам. Необходимо реализовать ряд, соответствующий номеру Вашего варианта, а также два соседних по номеру ряда.