- Использование SymPy в вычислениях
- Задача. Найдите значение выражения:
- Задача. Найдите значение выражения, если lgb = 5:
- Задача. Упростите выражение:
- Задача. Реализуйте функцию на языке Python, принимающую на вход n и возвращающую значение следующей суммы:
- Задача. Реализуйте функцию на языке Python, принимающую на вход n и возвращающую значение следующего выражения:
- Задача. Проверьте, что функции из предыдущих двух заданий эквивалентны. Объясните, почему это так.
- Задача. Найдите значение выражения.
- Задача. Найдите значение выражения.
- Задача. Найдите значение выражения при b=2.
- Найти корни квадратного уравнения
- Решение квадратного уравнения в 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 приведем еще пару примеров.
Задача. Найдите значение выражения, если 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 не всегда упрошает выражения до самого простого, это было видно по заданиям в этой статье.
Найти корни квадратного уравнения
Таким образом, программа для нахождения корней квадратного уравнения должна иметь три ветви условного оператора.
Функция float преобразует переданный ей аргумент в вещественное число.
import math print("Введите коэффициенты для уравнения") print("ax^2 + bx + c = 0:") a = float(input("a = ")) b = float(input("b = ")) c = float(input("c = ")) discr = b ** 2 - 4 * a * c print("Дискриминант D = %.2f" % discr) if discr > 0: x1 = (-b + math.sqrt(discr)) / (2 * a) x2 = (-b - math.sqrt(discr)) / (2 * a) print("x1 = %.2f \nx2 = %.2f" % (x1, x2)) elif discr == 0: x = -b / (2 * a) print("x = %.2f" % x) else: print("Корней нет")
Введите коэффициенты для уравнения ax^2 + bx + c = 0: a = 2 b = 4 c = 2 Дискриминант D = 0.00 x = -1.00
Введите коэффициенты для уравнения ax^2 + bx + c = 0: a = 3.2 b = -7.8 c = 1 Дискриминант D = 48.04 x1 = 2.30 x2 = 0.14
Введите коэффициенты для уравнения ax^2 + bx + c = 0: a = 8 b = 4 c = 2 Дискриминант D = -48.00 Корней нет
Обратите внимание, что для данной программы коэффициент a не должен быть равен нулю. Иначе в теле условного оператора будет происходить попытка деления на 0, что приведет к аварийному завершению программы.
Если a = 0, то квадратное уравнение превращается в линейное, которое решается иным способом. Оно всегда имеет один корень.
Решение квадратного уравнения в Python
Квадратное уравнение образовано от латинского термина «quadrates», что означает «квадрат». Это специальный тип уравнения, имеющий форму:
Здесь «x» неизвестное, которое вы должны найти, «a», «b», «c» задает числа, такие что «a» не равно 0. Если a = 0, то уравнение становится линейным, а не квадратным. В уравнении a, b и c называются коэффициентами.
Возьмем пример решения квадратного уравнения 8x 2 + 16x + 8 = 0.
# import complex math module import cmath a = float(input('Enter a: ')) b = float(input('Enter b: ')) c = float(input('Enter c: ')) # calculate the discriminant d =(b**2) -(4*a*c) # find two solutions sol1 =(-b-cmath.sqrt(d))/(2*a) sol2 =(-b+cmath.sqrt(d))/(2*a) print('The solution are and '.format(sol1,sol2))
Enter a: 8 Enter b: 5 Enter c: 9 The solution are(-0.3125-1.0135796712641785j) and(-0.3125+1.0135796712641785j)
В первой строке мы импортировали модуль cmath и определили три переменные с именами a, b и c, которые получают ввод от пользователя. Затем вычисляем дискриминант по формуле. С помощью метода cmath.sqrt() мы вычислили два решения и распечатали результат.
Второй метод
Мы можем получить решение квадратного уравнения, используя прямую формулу. Давайте разберем следующий пример.
Вышеприведенная формула состоит из следующих случаев.
# Python program to find roots of quadratic equation import math # function for finding roots def findRoots(a, b, c): dis_form = b * b - 4 * a * c sqrt_val = math.sqrt(abs(dis_form)) if dis_form > 0: print(" real and different roots ") print((-b + sqrt_val) /(2 * a)) print((-b - sqrt_val) /(2 * a)) elif dis_form == 0: print(" real and same roots") print(-b /(2 * a)) else: print("Complex Roots") print(- b /(2 * a), " + i", sqrt_val) print(- b /(2 * a), " - i", sqrt_val) a = int(input('Enter a:')) b = int(input('Enter b:')) c = int(input('Enter c:')) # If a is 0, then incorrect equation if a == 0: print("Input correct quadratic equation") else: findRoots(a, b, c)
Enter a:7 Enter b:5 Enter c:2 Complex Roots -0.35714285714285715 + i 5.5677643628300215 -0.35714285714285715 - i 5.5677643628300215
В приведенном выше коде мы импортировали математический модуль и определили формулу для вычисления дискриминанта. Затем мы определили функцию findRoots, которая принимает три целых значения в качестве аргументов. Затем мы проверили корни с помощью оператора if-elif-else.