Добрый день уважаемые пользователи. Данная статья ориентированна на начинающих программистов. Как вы знаете для Python существует большое множество библиотек которые помогают с вычислениями. И я хотел бы поделиться одной из библиотек, которая может существенно помочь при вычислениях, но использовать ее в коде я не рекомендую. Но она может значительно облегчить вам жизнь, если вы решаете уровнения и занимаетесь их преобразованием, упрощением для дальнейшего использования.
Библиотека SymPy умеет многое, начиная с решения уравнений и заканчивая построениями графиков, но тут я хотел рассмотреть на примерах, как же работают функции "упрощения" в этой библиотеке на примере решения нескольких простых задач.
Приступим!)
Задача. Найдите значение выражения:
Проведем преобразования:
Проверим наше преобразование с помощью SymPy:
from sympy import * # знак звездочки означает, чт омы импортировали все данные из библиотеки
init_printing(use_unicode = False, wrap_line = False, no_global = True) # формат вывода информации
expression = (sqrt(13)+sqrt(7))**2/(10+sqrt(91))
expression
Скопируйте этот код и посмотрите на нывод. Библиотека SymPy не дала нам ответ, а вывел очень красиво нашу формулу:
Предлагаю упростить это выражение, т.е. решить его, но для упрощения я буду использовать функцию simplify:
simplify(expression) # функция simplify выполняет упрощение выражений
И тут мы получаем:
2
Для лучшего понимаю как можно использовать функцию simplify приведем еще пару примеров.
Задача. Найдите значение выражения, если lgb = 5:
Проведем преобразования. Для начала вычислим значение b.
Теперь поставим значение b в наше выражение, которое нужно было вычислить:
Проверим наше преобразование с помощью SymPy:
b = Symbol('b') # введем символ b далее мы сможем его вычислить
expression_b = log(b, 10)
expression_b
Этот код выведет нам следующее сообщение:
После того как мы создадим выражение expression_b давайте вычислим само значение b:
solve_b = solve(expression_b-5, b) # функция slove решает уровнение,тут "-5" эквивалентно "=5"
solve_b = solve_b[0]
solve_b
На выводе получим 100000.
Да, мы уже получили с вами это же числе проводя преобразования в ручную.
Подставим b в выражение:
expression_b_main = log(10 / solve_b**3)
expression_b_main
На выводе получим:
Да, вывод не всегда удобно читать. Но отметим что, В ответе выше содержится 14 нулей, а логарифм по основанию 10 будет равен - 14.
И именно тут я хочу сделать важное замечание, что в SymPy нужно быть очень внимательными с логарифмами и нужно явно указывать основание. Если его не указать, то по умолчанию основание логарифма будет - е.
Задача. Упростите выражение:
Когда перемножаются степени одинаковых чисел, можно просто сложить показатели степеней.
Проверим наше выражение и упростим его с помощью библиотеки.
a = Symbol('a')
expression_a = 2 * a * a**(4/3) * 3 * a**(2/3)
expression_a
Выведет , в красивом виде:
Наша библиотека сразу же дала нам упрощенное выражение, перемножив все слагаемые. Результат верный. Реализуйте функцию на языке Python, принимающую на вход n и возвращающую значение следующей суммы:
Задача. Реализуйте функцию на языке Python, принимающую на вход n и возвращающую значение следующей суммы:
def summa(n):
summa = 0
for x in range(1, n+1, 1):
summa = log(x) + summa
return summa
Используем нашу функцию:
summa(5)
Получим на выводе:
Обратите внимание что функция работает верно. Т.е. наша сумма начинается с i = 1, но поскольку натуральный логарифм т 1 будет равен 0, то в вывод 0 не попадает.
Задача. Реализуйте функцию на языке Python, принимающую на вход n и возвращающую значение следующего выражения:
Сразу скажу что не нужно пугаться большой буквы П. В этой записи П оначает что это произведение ряда числе начиная с 1 и до n.
В этом математическом выражении нам необходимо посчитать натуральный логарифм от произведений чисел от 1 до n.
А теперь используем функцию:
multiplication(2)
Получим на вывод:
Задача. Проверьте, что функции из предыдущих двух заданий эквивалентны. Объясните, почему это так.
print('Функция из задния 4:', summa(5))
print('Функция из задния 5:', multiplication(5))
Тут мы вывели значения которые получили от функций суммы и произведения. Полуим на выводе:
Исходя из свойств логарифмов упростим первое выражение. Поскольку у логарифмов везде одинаковое основание, то мы можем перемножить числа в скобках.
summa_expression_simplify = simplify(summa(5))
summa_expression_simplify
На выводе получим:
Как мы видим выражения полностью одинаковы.
Задача. Найдите значение выражения.
Воспользуемся SymPy:
x = Symbol('x')
expression_g = (4*x-x*x)**(1/3)
expression_g = simplify(expression_g)
expression_g
Выведет нам:
Решим данное уравнение:
expression_g_solve = solve(expression_g-0, x) # Найдем корни
expression_g_solve
На выводе получим:
Мы нашли корни уравнения.
Теперь перейдем к решению основного уравнения. На самом деле для решения не нужно было искать корни, это было продемонстрировано для примера.
numerator_g = (4*(2-x)-(2-x)*(2-x))**(1/3)
denominator_g = (4*(2+x)-(2+x)*(2+x))**(1/3)
expr_g_main = numerator_g / denominator_g
expr_g_main
На выводе получим:
Воспользовавшись функцией упрощения, упростим это выражение.
expr_g_main = simplify(expr_g_main)
expr_g_main
На выводе получим:
И так мы получили ответ 1. Посмотрим как это получилось, приведя поэтапные преобразования:
Задача. Найдите значение выражения.
Упростим выражение в ручную:
В ответе мы получили 5. Проверим наши преобразования используя библиотеку sympy.
x = Symbol('x')
Expression = ((2*x**3)**4-(x**2)**6)/(3*x**12)
Expression
На выводе получим:
Наше решение верно. Ответы сошлись.
Задача. Найдите значение выражения при b=2.
Проведем упрощения выражения:
Ответ при b=2 будет -1/2.
Проверим наши вычисления с помощью библиотеки:
b = Symbol('b')
expression_b = (11*a**6*b**3-(3*a**2*b)**3)/(4*a**6*b**6)
expression_b
На выводе получим:
Как видим библиотека сразу сделал упрощение нашего выражения.
expression_g_solve = solve(expression_b+0.5, b)
expression_g_solve[0]
На выводе получим:
Поставив свой ответ который мы получили, мы нашли значение b = 2, значит выражение решено верно.
Надеюсь на нескольких простых примерах вы поняли суть работы с SymPy и применением ее в ваших вычислениях. Обращаю внимание, что SymPy не всегда упрошает выражения до самого простого, это было видно по заданиям в этой статье.
Комментарии (2)
fpinger
02.08.2022 06:21А с каким пакетом python проще всего проверить мат выражение на допустимость и извлеч имена переменных для подстановки значений?
flx0
Во-первых, для примеров без переменных sympy не нужен вообще вообще, можно просто посчитать.
Во-вторых, от вашей реализации фукции суммы логарифмов глаза вытекают. Можно же просто `sum(map(log, range(1, n+1)))`.
В-третьих, 1/3 в показателе степени у вас оказывается float'ом, и это ломает многие стратегии упрощения выражения/решения уравнения. Если уж решили писать на sympy, пишите `Rational(1,3)`
Ну и вообще, статья выглядит как будто восьмиклассник нашел чит для решения домашки по математике. sympy умеет намного больше.