- Euler’s Method Python Program for Solving Ordinary Differential Equation
- Python Source Code: Euler’s Method
- Output
- ФУНКЦИЯ ЭЙЛЕРА PYTHON
- 5++ способов в одну строку на Python решить первую задачу Проекта Эйлера
- Условие задачи
- 00 — Базовое решение
- 01 — Generator Expression. Выражение-генератор
- 01.a — List Comprehension. Выражение на основе списка
- 01.b — Set Comprehension. Выражение на основе множества
- 02 — Filter
- 03 — Map
- 04 — Reduce
- 05 — Однострочное решение на основе множества
- 05.a — Ещё одно однострочное решение на основе множества
- 05.b — И ещё одно однострочное решение на основе множества
- 05.c И последнее однострочное решение на основе множества
- Смотрим на скорость выполнения каждого однострочного решения
- Заключение
Euler’s Method Python Program for Solving Ordinary Differential Equation
Output of this Python program is solution for dy/dx = x + y with initial condition y = 1 for x = 0 i.e. y(0) = 1 and we are trying to evaluate this differential equation at y = 1. ( Here y = 1 i.e. y(1) = ? is our calculation point)
Python Source Code: Euler’s Method
In this Python program x0 & y0 represents initial condition. xn is calculation point on which value of yn corresponding to xn is to be calculated using Euler’s method. step represents number of finite step before reaching to xn .
# Euler method python program # function to be solved def f(x,y): return x+y # or # f = lambda x: x+y # Euler method def euler(x0,y0,xn,n): # Calculating step size h = (xn-x0)/n print('\n-----------SOLUTION-----------') print('------------------------------') print('x0\ty0\tslope\tyn') print('------------------------------') for i in range(n): slope = f(x0, y0) yn = y0 + h * slope print('%.4f\t%.4f\t%0.4f\t%.4f'% (x0,y0,slope,yn) ) print('------------------------------') y0 = yn x0 = x0+h print('\nAt x=%.4f, y=%.4f' %(xn,yn)) # Inputs print('Enter initial conditions:') x0 = float(input('x0 = ')) y0 = float(input('y0 = ')) print('Enter calculation point: ') xn = float(input('xn = ')) print('Enter number of steps:') step = int(input('Number of steps = ')) # Euler method call euler(x0,y0,xn,step)
Output
Output of above implementation to solve ordinary differential equation by Euler’s method is:
Enter initial conditions: x0 = 0 y0 = 1 Enter calculation point: xn = 1 Enter number of steps: Number of steps = 10 -----------SOLUTION----------- ------------------------------ x0 y0 slope yn ------------------------------ 0.0000 1.0000 1.0000 1.1000 ------------------------------ 0.1000 1.1000 1.2000 1.2200 ------------------------------ 0.2000 1.2200 1.4200 1.3620 ------------------------------ 0.3000 1.3620 1.6620 1.5282 ------------------------------ 0.4000 1.5282 1.9282 1.7210 ------------------------------ 0.5000 1.7210 2.2210 1.9431 ------------------------------ 0.6000 1.9431 2.5431 2.1974 ------------------------------ 0.7000 2.1974 2.8974 2.4872 ------------------------------ 0.8000 2.4872 3.2872 2.8159 ------------------------------ 0.9000 2.8159 3.7159 3.1875 ------------------------------ At x=1.0000, y=3.1875
- Algorithm for Bisection Method
- Pseudocode for Bisection Method
- C Program for Bisection Method
- C++ Program for Bisection Method
- MATLAB Program for Bisection Method
- Python Program for Bisection Method
- Bisection Method Advantages
- Bisection Method Disadvantages
- Bisection Method Features
- Convergence of Bisection Method
- Bisection Method Online Calculator
ФУНКЦИЯ ЭЙЛЕРА PYTHON
Функция Эйлера (или функция «фи») — это функция, которая определяет количество положительных целых чисел, меньших и взаимно простых с заданным целым числом n. В Python эта функция может быть реализована следующим образом:
def euler_func(n):
result = n
p = 2
while p*p 1:
result -= result // n
return result
Здесь мы используем формулу, основанную на разложении n на простые множители. Также мы проверяем каждое простое число от 2 до корня из n, чтобы убедиться, что мы не пропустим какие-то простые множители.
Пример использования функции:
print(euler_func(10)) # выводит 4
Это означает, что существует 4 положительных целых чисел, меньших 10 и взаимно простых с ним: 1, 3, 7 и 9.
Функция Эйлера — Теория чисел
ПРОЕКТ ЭЙЛЕРА №1 ♣ ФУНКЦИЯ PERF_COUNTER ♣ ПРОГРАММИРОВАНИЕ НА PYTHON
ТОП 5 Ошибок в написании функций Python
Sourcery is an INCREDIBLE AI refactoring tool for Python
Вычисление значений функции Эйлера на Python
The Ultimate Guide to Writing Functions
You Should Be Using This For Work/Research in Python — OOP Tutorial
Функция Эйлера (часть 16)- Криптография — Программирование
e (Число Эйлера) [Numberphile на русском]
- Как нарисовать полукруг в python turtle
- Мантисса и порядок числа python
- Python разбить файл на части
- Python метод apply
- Python arcade уроки
- Метод нелдера мида python
- Python pip не является внутренней или внешней командой
- Python метод монте карло
- Как убрать табуляцию в python
- Кросс валидация python
- Python на вход вашей программе строка содержащая число сократите его указанным образом до 1 цифры
- Python поиск в строке
- Не запускается pytest
5++ способов в одну строку на Python решить первую задачу Проекта Эйлера
Однажды меня посетила мысль, а что если попробовать решить первую задачу Проекта Эйлера всевозможными способами, но с условием, что решение должно быть в одну строку. В итоге получилось более пяти однострочных решений с применением Filter, Map, Reduce, Generator Expression и т.д. В этой статье я покажу то, к чему я пришёл.
Это моя первая статья. Стоит отнестись к ней настороженно. Уникальные решения будут оформлены в отдельные пункты. Менее уникальные — в подпункты.
Условие задачи
Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел равна 23.
Найдите сумму всех чисел меньше 1000, кратных 3 или 5.
00 — Базовое решение
Прежде чем перейти непосредственно к однострочным решениям, разумно было бы упомянуть сначала стандартное, классическое решение:
result = 0 for i in range(1, 1000): if i%3 == 0 or i%5 == 0: result += i print(result) # => 233168
Перебираем последовательность чисел от 1 до 999. Если перебираемое число делится на 3 или на 5 без остатка от деления, то прибавляем каждое такое число в заранее объявленную переменную result .
01 — Generator Expression. Выражение-генератор
print(sum(i for i in range(1, 1000) if i%3 == 0 or i%5 == 0)) # => 233168
Числа из последовательности от 1 до 999, делящиеся на 3 или на 5 без остатка от деления, собираются в генератор. Затем функция sum() складывает содержимое генератора.
01.a — List Comprehension. Выражение на основе списка
print(sum([i for i in range(1, 1000) if i%3 == 0 or i%5 == 0])) # => 233168
В отличии от предыдущего, здесь выражение дополнительно помещается в список. Стоило упомянуть этот вариант, так как он довольно часто встречается в различных статьях.
01.b — Set Comprehension. Выражение на основе множества
Тоже, что и в предыдущем, но вместо списка здесь множество.
02 — Filter
print(sum(filter(lambda i: i%3 == 0 or i%5 == 0, range(1, 1000)))) # => 233168
Функция filter схожа по принципу работы с выражением-генератором. Функция лямбда применяется к каждому элементу последовательности чисел от 1 до 999. Все числа последовательности, делящиеся на 3 или на 5 без остатка от деления, возвращаются, затем суммируются функцией sum() .
03 — Map
print(sum(map(lambda i: i if i%3 == 0 or i%5 == 0 else 0, range(1, 1000)))) # => 233168
Перебираемые числа последовательности от 1 до 999, делящиеся на 3 или 5 без остатка от деления, остаются без изменений, все остальные числа заменяются на ноль. Полученная последовательность суммируется функцией sum() .
04 — Reduce
from functools import reduce print(reduce(lambda x, y: x+y if y%3 == 0 or y%5 == 0 else x, range(1, 1000), 0)) # => 233168
Из всей подборки, этот вариант «очень не очень». Как по степени реализации, так и по времени выполнения(но об этом попозже).
Если в reduce указан инициализатор(в нашем случае ноль), то он становится накопителем. К нему по очереди прибавляются только те числа из последовательности от 1 до 999, которые делятся на 3 или на 5 без остатка от деления. Если из функции reduce убрать инициализатор ноль, то инициализатором станет крайний левый элемент последовательности.
05 — Однострочное решение на основе множества
print(sum(set(range(3, 1000, 3)) | set(range(5, 1000, 5)))) # => 233168
Самое элегантное решение, как по красоте написания, так и по времени выполнения.
Последовательность чисел от 1 до 999, кратную трём, помещаем во множество и объединяем со множеством, содержащим в себе последовательность чисел от 1 до 999, кратную пяти. Содержимое, полученного множества суммируем функцией sum() .
05.a — Ещё одно однострочное решение на основе множества
Похожий вариант на предыдущий, но, если использовать фигурные скобки, то последовательность чисел от 1 до 999, кратную трём и последовательность чисел от 1 до 999, кратную пяти, нужно распаковывать.
05.b — И ещё одно однострочное решение на основе множества
print(sum(set(range(3, 1000, 3)).union(range(5, 1000, 5)))) # => 233168
Создаём множество, с последовательностью чисел от 1 до 999, кратную трём и присоединяем к нему последовательность чисел от 1 до 999, кратную пяти. Затем функцией sum() суммируем.
05.c И последнее однострочное решение на основе множества
print(sum(set([*range(3, 1000, 3)] + [*range(5, 1000, 5)]))) # => 233168
По аналогии с предыдущими. Распаковываем последовательности чисел в списки. Складываем списки. Оборачиваем во множество. Затем суммируем функцией sum() .
Смотрим на скорость выполнения каждого однострочного решения
Если проверить скорость выполнения каждого однострочного решения в командной строке, при помощи timeit, получим следующие значения в микросекундах:
sum(i for i in range(1, 1000) if i%3 == 0 or i%5 == 0) # 203 usec sum([i for i in range(1, 1000) if i%3 == 0 or i%5 == 0]) # 181 usec sum() # 189 usec sum(filter(lambda i: i%3 == 0 or i%5 == 0, range(1, 1000))) # 306 usec sum(map(lambda i: i if i%3 == 0 or i%5 == 0 else 0, range(1, 1000))) # 313 usec reduce(lambda x, y: x+y if y%3 == 0 or y%5 == 0 else x, range(1, 1000), 0)# 324 usec sum(set(range(3, 1000, 3)) | set(range(5, 1000, 5))) # 47 usec sum( <*range(3, 1000, 3)>| <*range(5, 1000, 5)>) # 47 usec sum(set(range(3, 1000, 3)).union(range(5, 1000, 5))) # 41 usec sum(set([*range(3, 1000, 3)] + [*range(5, 1000, 5)])) # 43 usec
Методика расчёта: python -m timeit «выражение»
Быстрее всего справились с задачей последние четыре варианта.
Заключение
Всего получилось 5 уникальных + 5 не уникальных решений. Благодаря этой задаче у меня появилось более устойчивое понимание работы функций Filter, Map, Reduce. И если раньше я недоумевал, почему функцию Reduce убрали из основного модуля, то теперь я не сомневаюсь в правильности этого решения.
В статье я старался отойти от популярного шаблона повествования «точность на грани бесполезности». Где предложения набиты под завязку «тяжёлыми» терминами, а из знакомого там только союзы и предлоги. Не уверен, что у меня получилось.