Добрый день уважаемые пользователи. Данная статья ориентированна на начинающих программистов. Как вы знаете для Python существует большое множество библиотек которые помогают с вычислениями. И я хотел бы поделиться одной из библиотек, которая может существенно помочь при вычислениях, но использовать ее в коде я не рекомендую. Но она может значительно облегчить вам жизнь, если вы решаете уровнения и занимаетесь их преобразованием, упрощением для дальнейшего использования.

Библиотека SymPy умеет многое, начиная с решения уравнений и заканчивая построениями графиков, но тут я хотел рассмотреть на примерах, как же работают функции "упрощения" в этой библиотеке на примере решения нескольких простых задач.

Приступим!)

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

\frac{(\sqrt{13}+\sqrt{7})^{2}}{10+\sqrt{91}}

Проведем преобразования:

\frac{(\sqrt{13}+\sqrt{7})^2}{10 + \sqrt{91}}\rightarrow\frac{(\sqrt{13})^2+2\times\sqrt{13}\times\sqrt{7}+(\sqrt{7})^2}{10 + \sqrt{91}}\rightarrow\frac{20+2\times\sqrt{91}}{10 + \sqrt{91}}\rightarrow2

Проверим наше преобразование с помощью 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 не дала нам ответ, а вывел очень красиво нашу формулу:

\frac{(\sqrt{13}+\sqrt{7})^{2}}{10+\sqrt{91}}

Предлагаю упростить это выражение, т.е. решить его, но для упрощения я буду использовать функцию simplify:

simplify(expression) # функция simplify выполняет упрощение выражений

И тут мы получаем:

2

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

Задача. Найдите значение выражения, если lgb = 5:

lg\frac{10}{b^3}

Проведем преобразования. Для начала вычислим значение b.

\lg{b}=5\rightarrow\log_{10}{b}=5\rightarrow b= 10^5

Теперь поставим значение b в наше выражение, которое нужно было вычислить:

\lg{\frac{10}{b^3}}\rightarrow\lg{\frac{10}{(10^5)^3}}\rightarrow\lg{\frac{10}{10^{15}}}\rightarrow\log_{10}{\frac{10}{10^{15}}}\rightarrow\log_{10}{10}-\log_{10}{10^{15}}\rightarrow1-15\rightarrow-14

Проверим наше преобразование с помощью SymPy:

b = Symbol('b') # введем символ b далее мы сможем его вычислить
expression_b = log(b, 10)
expression_b

Этот код выведет нам следующее сообщение:

\frac{log\;(b)}{log\;(10)}

После того как мы создадим выражение 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

На выводе получим:

-log\;(100000000000000)

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

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

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

2\times a\times\sqrt[3]{a^4}\times3\times\sqrt[3]{a^2}

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

2\times a\times\sqrt[3]{a^4}\times3\times\sqrt[3]{a^2}\rightarrow6\times a^{1 +\frac{4}{3}+\frac{2}{3} }\rightarrow 6\times a^{3}

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

a = Symbol('a')
expression_a = 2 * a * a**(4/3) * 3 * a**(2/3)
expression_a

Выведет , в красивом виде:

6a^{3.0}

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

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

\sum_{i=1}^{n} ln \; i
def summa(n):
    summa = 0
    for x in range(1, n+1, 1):
        summa = log(x) + summa
    return summa

Используем нашу функцию:

summa(5)

Получим на выводе:

log(2)+log(3)+log(4)+log(5)

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

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

ln \; (\prod_{i=1}^{n} i)

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

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

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

multiplication(2)

Получим на вывод:

log(2)

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

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

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

Функция из задния 4: log(2) + log(3) + log(4) + log(5) \\ Функция из задния 5: log(120)

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

summa_expression_simplify = simplify(summa(5))
summa_expression_simplify

На выводе получим:

log(120)

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

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

\frac{g(2-x)}{g(2+x)}, если \;g(x)=\sqrt[3]{x(4-x)} \; при \mid x\mid \neq2

Воспользуемся SymPy:

x = Symbol('x')
expression_g = (4*x-x*x)**(1/3)
expression_g = simplify(expression_g)
expression_g

Выведет нам:

(????(4−????))^{0.333333333333333}

Решим данное уравнение:

expression_g_solve = solve(expression_g-0, x) # Найдем корни
expression_g_solve

На выводе получим:

[0.0, 4.0]

Мы нашли корни уравнения.

Теперь перейдем к решению основного уравнения. На самом деле для решения не нужно было искать корни, это было продемонстрировано для примера.

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

На выводе получим:

\frac{(-4x-(2-x)^2+8)^{0.33333333333}}{(4x-(2+x)^2+8)^{0.33333333333}}

Воспользовавшись функцией упрощения, упростим это выражение.

expr_g_main = simplify(expr_g_main)
expr_g_main

На выводе получим:

1

И так мы получили ответ 1. Посмотрим как это получилось, приведя поэтапные преобразования:

\frac{g(2-x)}{g(2+x)}\rightarrow\frac{\sqrt[3]{(2-x)\times(4-(2-x))}}{\sqrt[3]{(2+x)\times(4-(2+x))}}\rightarrow\frac{\sqrt[3]{4\times(2-x)-{(2-x)}^2}}{\sqrt[3]{4\times(2+x)-{(2+x)}^2}} \\ \rightarrow\frac{\sqrt[3]{8-4x-(4-4x+x^2)}}{\sqrt[3]{8+4x-(4+4x+x^2)}}  \rightarrow\frac{\sqrt[3]{8-4x-4+4x-x^2)}}{\sqrt[3]{8+4x-4-4x-x^2)}}  \rightarrow\frac{\sqrt[3]{4-x^2)}}{\sqrt[3]{4-x^2)}}\rightarrow1

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

((2x^3)^4-(x^2)^6)\div(3x^{12})

Упростим выражение в ручную:

((2x^3)^4-(x^2)^6)\div(3x^{12})\rightarrow(2^4x^{12}-x^{12})\div(3x^{12})\rightarrow\frac{2^4-1}{3}\rightarrow5

В ответе мы получили 5. Проверим наши преобразования используя библиотеку sympy.

x = Symbol('x')
Expression = ((2*x**3)**4-(x**2)**6)/(3*x**12)
Expression

На выводе получим:

5

Наше решение верно. Ответы сошлись.

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

(11????6????3−(3????2????)3)÷(4????6????6)

Проведем упрощения выражения:

(11a^6b^3 - (3a^2b)^3)\div(4a^6b^6)\rightarrow\frac{11a^6b^3-27a^6b^3}{4a^6b^6}\rightarrow\frac{-16a^6b^3}{4a^6b^6}\rightarrow-\frac{4}{b^3}

Ответ при 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

На выводе получим:

-\frac{4}{b^3}

Как видим библиотека сразу сделал упрощение нашего выражения.

expression_g_solve = solve(expression_b+0.5, b)
expression_g_solve[0]

На выводе получим:

2.0

Поставив свой ответ который мы получили, мы нашли значение b = 2, значит выражение решено верно.

Надеюсь на нескольких простых примерах вы поняли суть работы с SymPy и применением ее в ваших вычислениях. Обращаю внимание, что SymPy не всегда упрошает выражения до самого простого, это было видно по заданиям в этой статье.

Комментарии (2)


  1. flx0
    01.08.2022 18:01
    +5

    Во-первых, для примеров без переменных sympy не нужен вообще вообще, можно просто посчитать.

    Во-вторых, от вашей реализации фукции суммы логарифмов глаза вытекают. Можно же просто `sum(map(log, range(1, n+1)))`.

    В-третьих, 1/3 в показателе степени у вас оказывается float'ом, и это ломает многие стратегии упрощения выражения/решения уравнения. Если уж решили писать на sympy, пишите `Rational(1,3)`

    Ну и вообще, статья выглядит как будто восьмиклассник нашел чит для решения домашки по математике. sympy умеет намного больше.


  1. fpinger
    02.08.2022 06:21

    А с каким пакетом python проще всего проверить мат выражение на допустимость и извлеч имена переменных для подстановки значений?