Символьная математика на python

Использование SymPy в вычислениях

Добрый день уважаемые пользователи. Данная статья ориентированна на начинающих программистов. Как вы знаете для 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 выполняет упрощение выражений

Для лучшего понимаю как можно использовать функцию simplify приведем еще пару примеров.

Читайте также:  Php include path phpunit

Задача. Найдите значение выражения, если 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

Да, мы уже получили с вами это же числе проводя преобразования в ручную.

expression_b_main = log(10 / solve_b**3) expression_b_main

Да, вывод не всегда удобно читать. Но отметим что, В ответе выше содержится 14 нулей, а логарифм по основанию 10 будет равен — 14.

И именно тут я хочу сделать важное замечание, что в SymPy нужно быть очень внимательными с логарифмами и нужно явно указывать основание. Если его не указать, то по умолчанию основание логарифма будет — е.

Задача. Упростите выражение:

Когда перемножаются степени одинаковых чисел, можно просто сложить показатели степеней.

Проверим наше выражение и упростим его с помощью библиотеки.

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

Обратите внимание что функция работает верно. Т.е. наша сумма начинается с i = 1, но поскольку натуральный логарифм т 1 будет равен 0, то в вывод 0 не попадает.

Задача. Реализуйте функцию на языке Python, принимающую на вход n и возвращающую значение следующего выражения:

Сразу скажу что не нужно пугаться большой буквы П. В этой записи П оначает что это произведение ряда числе начиная с 1 и до n.

В этом математическом выражении нам необходимо посчитать натуральный логарифм от произведений чисел от 1 до n.

А теперь используем функцию:

Задача. Проверьте, что функции из предыдущих двух заданий эквивалентны. Объясните, почему это так.

print('Функция из задния 4:', summa(5)) print('Функция из задния 5:', multiplication(5))

Тут мы вывели значения которые получили от функций суммы и произведения. Полуим на выводе:

Исходя из свойств логарифмов упростим первое выражение. Поскольку у логарифмов везде одинаковое основание, то мы можем перемножить числа в скобках.

summa_expression_simplify = simplify(summa(5)) summa_expression_simplify

Как мы видим выражения полностью одинаковы.

Задача. Найдите значение выражения.

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 = 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 не всегда упрошает выражения до самого простого, это было видно по заданиям в этой статье.

Источник

Оцените статью