Python решить уравнение в целых числах

Математическая библиотека Python SymPy

SymPy — это библиотека Python для выполнения символьных вычислений. Это система компьютерной алгебры, которая может выступать как отдельное приложение, так и в качестве библиотеки для других приложений. Поработать с ней онлайн можно на https://live.sympy.org/. Поскольку это чистая библиотека Python, ее можно использовать даже в интерактивном режиме.

В SymPy есть разные функции, которые применяются в сфере символьных вычислений, математического анализа, алгебры, дискретной математики, квантовой физики и так далее. SymPy может представлять результат в разных форматах: LaTeX, MathML и так далее. Распространяется библиотека по лицензии New BSD. Первыми эту библиотеку выпустили разработчики Ondřej Čertík и Aaron Meurer в 2007 году. Текущая актуальная версия библиотеки — 1.6.2.

Вот где применяется SymPy:

  • Многочлены
  • Математический анализ
  • Дискретная математика
  • Матрицы
  • Геометрия
  • Построение графиков
  • Физика
  • Статистика
  • Комбинаторика

Установка SymPy

Для работы SymPy требуется одна важная библиотека под названием mpmath . Она используется для вещественной и комплексной арифметики с числами с плавающей точкой произвольной точности. Однако pip установит ее автоматически при загрузке самой SymPy:

Такие дистрибутивы, как Anaconda, Enthough, Canopy и другие, заранее включают SymPy. Чтобы убедиться в этом, достаточно ввести в интерактивном режиме команду:

Исходный код можно найти на GitHub.

Символьные вычисления в SymPy

Символьные вычисления — это разработка алгоритмов для управления математическими выражениями и другими объектами. Такие вычисления объединяют математику и компьютерные науки для решения математических выражений с помощью математических символов.

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

Как можно увидеть, квадратный корень числа 7 вычисляется приблизительно. Но в SymPy квадратные корни чисел, которые не являются идеальными квадратами, просто не вычисляются:

Вот каким будет вывод этого кода: sqrt(7) .

Это можно упростить и показать результат выражения символически таким вот образом:

В случае с модулем math вернется число, а вот в SymPy — формула.

Для рендеринга математических символов в формате LaTeX код SymPy, используйте Jupyter notebook:

Если выполнить эту команду в IDLE, то получится следующий результат:

Квадратный корень неидеального корня также может быть представлен в формате LaTeX с помощью привычных символов:

Символьные вычисления с помощью таких систем, как SymPy, помогают выполнять вычисления самого разного рода (производные, интегралы, пределы, решение уравнений, работа с матрицами) в символьном виде.

В пакете SymPy есть разные модули, которые помогают строить графики, выводить результат (LaTeX), заниматься физикой, статистикой, комбинаторикой, числовой теорией, геометрией, логикой и так далее.

Числа

Основной модуль в SymPy включает класс Number , представляющий атомарные числа. У него есть пара подклассов: Float и Rational . В Rational также входит Integer .

Класс Float

Float представляет числа с плавающей точкой произвольной точности:

SymPy может конвертировать целое число или строку в число с плавающей точкой:

При конвертации к числу с плавающей точкой, также можно указать количество цифр для точности:

Представить число дробью можно с помощью объекта класса Rational , где знаменатель — не 0:

Если число с плавающей точкой передать в конструктор Rational() , то он вернет дробь:

Для упрощения можно указать ограничение знаменателя:

Выведется дробь 1/5 вместо 3602879701896397/18014398509481984.

Если же в конструктор передать строку, то вернется рациональное число произвольной точности:

Также рациональное число можно получить, если в качестве аргументов передать два числа. Числитель и знаменатель доступны в виде свойств:

Класс Integer

Класс Integer в SymPy представляет целое число любого размера. Конструктор принимает рациональные и числа с плавающей точкой. В результате он откидывает дробную часть:

Также есть класс RealNumber , который является алиасом для Float . В SymPy есть классы-одиночки Zero и One , доступные через S.Zero и S.One соответственно.

Другие числовые объекты-одиночки — Half , NaN , Infinity и ImaginaryUnit .

Бесконечность представлена в виде объекта-символа oo или как S.Infinity :

ImaginaryUnit можно импортировать как символ I , а получить к нему доступ — через S.ImaginaryUnit .

Символы

Symbol — самый важный класс в библиотеке SymPy. Как уже упоминалось ранее, символьные вычисления выполняются с помощью символов. И переменные SymPy являются объектами класса Symbol .

Аргумент функции Symbol() — это строка, содержащая символ, который можно присвоить переменной.

Код выше является эквивалентом этого выражения:

Символ может включать больше одной буквы:

Также в SymPy есть функция Symbols() , с помощью которой можно определить несколько символов за раз. Строка содержит названия переменных, разделенные запятыми или пробелами.

В модуле abc можно найти элементы латинского и греческого алфавитов в виде символов. Таким образом вместо создания экземпляра Symbol можно использовать метод:

Однако C, O, S, I, N, E и Q являются заранее определенными символами. Также символы с более чем одной буквы не определены в abc. Для них нужно использовать объект Symbol . Модуль abs определяет специальные имена, которые могут обнаружить определения в пространстве имен SymPy по умолчанию. сlash1 содержит однобуквенные символы, а clash2 — целые слова.

Индексированные символы (последовательность слов с цифрами) можно определить с помощью синтаксиса, напоминающего функцию range() . Диапазоны обозначаются двоеточием. Тип диапазона определяется символом справа от двоеточия. Если это цифра, то все смежные цифры слева воспринимаются как неотрицательное начальное значение.

Смежные цифры справа берутся на 1 больше конечного значения.

Подстановка параметров

Одна из базовых операций в математических выражениях — подстановка. Функция subs() заменяет все случаи первого параметра на второй.

Этот код даст вывод, эквивалентный такому выражению.

А кодом expr.subs(x,a) мы получим туже формулу, но с a вместо x .

Эта функция полезна, когда требуется вычислить определенное выражение. Например, нужно посчитать значения выражения, заменив a на 5 :

Также функция используется для замены подвыражения другим подвыражением. В следующем примере b заменяется на a+b .

Это дает такой вывод:

Функция simplify()

Функция simplify() используется для преобразования любого произвольного выражения, чтобы его можно было использовать как выражение SymPy. Обычные объекты Python, такие как целые числа, конвертируются в SymPy.Integer и так далее. Строки также конвертируются в выражения SymPy:

Любой объект Python можно конвертировать в объект SymPy. Однако учитывая то, что при преобразовании используется функция eval() , не стоит использовать некорректные выражения, иначе возникнет ошибка SimplifyError .

Функция simplify() принимает следующий аргумент: strict=False . Если установить True , то преобразованы будут только те типы, для которых определено явное преобразование. В противном случае также возникнет ошибка SimplifyError . Если же поставить False , то арифметические выражения и операторы будут конвертированы в их эквиваленты SumPy без вычисления выражения.

Функция evalf()

Функция вычисляет данное числовое выражение с точностью до 100 цифр после плавающей точки. Она также принимает параметр subs , как объект словаря с числовыми значениями для символов. Например такое выражение:

Даст такой результат: ?? 2

Вычислим выражение с помощью evalf() и заменим r на 5:

По умолчанию точность после плавающей точки — 15, но это значение можно перезаписать до 100. Следующее выражение вычисляет, используя вплоть до 20 цифр точности:

Функция lambdify()

Функция lambdify() переводит выражения SymPy в функции Python. Если выражение, которое нужно вычислить, затрагивает диапазон значений, то функция evalf() становится неэффективной. Функция lambdify действует как лямбда-функция с тем исключением, что она конвертирует SymPy в имена данной числовой библиотеки, обычно NumPy. По умолчанию же она реализована на основе стандартной библиотеки math.

У выражения может быть больше одной переменной. В таком случае первым аргументом функции является список переменных, а после него — само выражение:

Но чтобы использовать numpy в качестве основной библиотеки, ее нужно передать в качестве аргумента функции lambdify() .

В этой функции использовались два массива numpy: a и b . В случае с ними выполнение гораздо быстрее:

Логические выражения

Булевы функции расположены в модуле sympy.basic.booleanarg . Их можно создать и с помощью стандартных операторов Python: & (And), | (Or),

(Not), а также >> и . Булевы выражения наследуются от класса Basic .

BooleanTrue.
Эта функция является эквивалентом True из Python. Она возвращает объект-одиночку, доступ к которому можно получить и с помощью S.true .

BooleanFalse.
А эта функция является эквивалентом False . Ее можно достать с помощью S.False .

And.
Функция логического AND оценивает два аргумента и возвращает False , если хотя бы один из них является False . Эта функция заменяет оператор & .

Or.
Оценивает два выражения и возвращает True , если хотя бы одно из них является True . Это же поведение можно получить с помощью оператора | .

Not.
Результат этой функции — отрицание булево аргумента. True, если аргумент является False , и False в противном случае. В Python за это отвечает оператор

Xor.
Логический XOR (исключающий OR) возвращает True, если нечетное количество аргументов равняется True , а остальные — False . False же вернется в том случае, если четное количество аргументов True , а остальные — False . То же поведение работает в случае оператора ^ .

В предыдущем примере один(нечетное число) аргумент является True , поэтому Xor вернет True . Если же количество истинных аргументов будет четным, результатом будет False , как показано дальше.

Nand.
Выполняет логическую операцию NAND. Оценивает аргументы и возвращает True , если хотя бы один из них равен False , и False — если они истинные.

Nor.
Выполняет логическую операцию NOR. Оценивает аргументы и возвращает False , если один из них True , или же True , если все — False .

Хотя SymPy и предлагает операторы ^ для Xor ,

для Not , | для Or и & для And ради удобства, в Python они используются в качестве побитовых. Поэтому если операнды будут целыми числами, результаты будут отличаться.

Equivalent.
Эта функция возвращает отношение эквивалентности. Equivalent(A, B) будет равно True тогда и только тогда, когда A и B оба будут True или False . Функция вернет True , если все аргументы являются логически эквивалентными. В противном случае — False .

Запросы

Модуль assumptions в SymPy включает инструменты для получения информации о выражениях. Для этого используется функция ask() .

Следующие свойства предоставляют полезную информацию о выражении:

algebraic(x)
Чтобы быть алгебраическим, число должно быть корнем ненулевого полиномиального уравнения с рациональными коэффициентами. √2, потому что √2 — это решение x2 − 2 = 0. Следовательно, это выражения является алгебраическим.

complex(x)
Предикат комплексного числа. Является истиной тогда и только тогда, когда x принадлежит множеству комплексных чисел.

composite(x)
Предикат составного числа, возвращаемый ask(Q.composite(x)) является истиной тогда и только тогда, когда x — это положительное число, имеющее как минимум один положительный делитель, кроме 1 и самого числа.

even, odd
ask() возвращает True , если x находится в множестве четных и нечетных чисел соответственно.

imaginary
Свойство представляет предикат мнимого числа. Является истиной, если x можно записать как действительное число, умноженное на мнимую единицу.

integer
Это свойство, возвращаемое Q.integer(x) , будет истинным только в том случае, если x принадлежит множеству четных чисел.

rational, irrational
Q.irrational(x) истинно тогда и только тогда, когда x — это любое реальное число, которое нельзя представить как отношение целых чисел. Например, pi — это иррациональное число.

positive, negative
Предикаты для проверки того, является ли число положительным или отрицательным.

zero, nonzero
Предикат для проверки того, является ли число нулем или нет.

Символическая математика с симпы

https://youtu.be/n_zuhuufalk Эта статья показывает, как решать математические уравнения и выражения символически, в Python. Благодаря симпы-библиотеке это оказывается чрезвычайно легкой задачей. Однако, как вы увидите в следующих примерах, количество инструментов и функций, предоставляемых этой библиотекой, огромно. Благодаря всем его функциям, Sympy … Символическая математика с симпы Подробнее »

  • Автор записи

Автор: Andrea Ridolfi
Дата записи

Автор оригинала: Andrea Ridolfi.

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

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

По этим причинам Симпи представляет собой фундаментальный инструмент для решения множества Математика связанные проблемы. Статья разделена на разные разделы, каждый из которых имеет дело с конкретным Симпи функция. Если вы заинтересованы в теме, вы можете найти документацию обо всех описанных здесь функциях (и много других) в https://www.sympy.org/en/index.html Отказ

Импорт Sympy

Первый шаг включает в себя импорт в наш скрипт Симпи библиотека; Поскольку несколько разных пакетов будут использоваться во всем этом примере, мы им импортируем их, написав следующую строку кода (для импорта Sympy Вы, должно быть, ранее установили его, если вы еще этого не сделали, введите « | Установить PIP Sympy » в вашем терминале).

Определение переменных и функций

Начнем с определения переменных, которые мы хотим использовать в наших расчетах. Для этого мы эксплуатируем Симпи Функция Символы () который принимает в качестве ввода строки и превращает его в Симпи Переменная; Затем мы назначаем значение функции переменной с тем же именем выбранной строки. В следующих строках кода мы инициализируем две переменные « X » и « y ».

Аналогичная процедура может быть использована для определения имени функций, которые будут использоваться в сценарии; На этот раз S YMPY Функция, которая служит для цели, это Функция () и работает так же, как Символы () Отказ Мы, следовательно, инициализировать функцию под названием « F », с данного момента каждый раз, когда мы вводим « f » на скрипте, мы имеем в виду функцию.

Использование Sympy в вашем компьютере

Симпи можно даже использовать непосредственно с вашего терминала; Именно здесь его способность символически решать математические уравнения и функции выражают все возможное. Теперь мы увидим, как инициализировать и напрямую использовать Симпи в терминале. Первое, что нужно сделать, это открыть свой терминал и импорт Симпи Аналогичным образом как и раньше. Мы, следовательно, введите «Импортировать Sympy» и нажмите Enter. После этого мы входим в следующую команду « Sympy.init_session () », следующие строки содержат две только что описанные команды и вывод, который будет предложена вашим терминалом.

Как вы можете видеть, после Sympy.init_session () Команда, несколько Симпи пакеты были импортированы; Кроме того, буквы «X», «Y», «Z» и «T» были инициализированы как симпы, «K», «M» и «n» как целочисленные параметры, в то время как буквы «F», «G» и «H» как функции.

Все эти задачи были выполнены автоматически в пределах Sympy.init_session () команда, которая в основном инициировала Симпи сеанс с некоторыми заранее определенными функциями и переменными.

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

Расширение и упрощение математических выражений

В этом разделе мы узнаем, как использовать Симпи расширить или упростить математическое выражение. Обе задачи могут быть выполнены автоматически и мгновенно, просто используя функции Развернуть () и фактор () Отказ

Чтобы увидеть, как расширять() Функция работает, мы сначала определим функцию f = (3x + 5y 2 – 6) 2 И тогда мы передаем его как единственный входной параметр функции Развернуть () Отказ В терминале набираются следующие строки, чтобы получить лучший графический вывод; Тем не менее, они работают так же, когда набираются в скрипте.

Как вы можете увидеть из сообщенных результатов, функция Развернуть () рассчитал выражение, определенное в функции F И напечатал его усовершенствованным графическим способом, избегая звездочек и размещения показателей в качестве вершины. Представление стиля может варьироваться в зависимости от различных терминалов, но обычно его улучшается в отношении входной.

С другой стороны, функция фактор () Работает совершенно противоположным образом, он упрощает выражение, которое передается в его скобках. Вы можете увидеть пример в следующих строках.

Решение уравнений и неравенства

Еще одна полезная функция, предлагаемая Симпи Является ли возможность найти решение алгебраических уравнений, используя функцию .решать () .

Эта функция принимает в качестве ввода двух разных параметров, уравнение, которое мы хотим решить и переменную, для которой мы хотим решить ее соответственно.

Это особенно полезно в случае символических решений уравнений с несколькими переменными, в которых нас могут быть заинтересованы в получении символического решения по одному из двух неизвестных. Следующие строки сообщают либо численное решение уравнения одного переменного и символического решения двумя переменных уравнения относительно переменной « y ».

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

Решение систем уравнений/неравенств

Симпи Может использоваться для решения систем уравнений/неравенств. Для этого мы будем эксплуатировать, снова функции решить () Отказ В случае системы уравнений мы вводим уравнения в виде элементов списка; Следующие строки описывают решение системы трех линейных уравнений с помощью решить () Отказ

Как видно, вывод решить () Функция – это значения трех разных системных переменных. Таким же образом, мы также можем получить решение систем неравенств; Достаточно ввести неравенства как элементы списка; На этот раз символы «>» Метки

Квадратное уравнение

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

Постановка задачи

Уравнение, которое будем решать, выглядит следующим образом: a·x²+b·x+c=0. Пользователю предлагается ввести значения a, b и с в терминале. После этого программа посчитает дискриминант. На его основе найдем решения уравнения – значения x, для которых будет выполняться равенство.

Вот пример работы программы, которая будет написана.

Программа

Для решения квадратных уравнений на Python 3 напишем код, приведенный ниже. Разберем некоторые моменты, которые мы использовали в этой простой программе:

  • print — эта функция выводит на экран информацию.
  • input — выводит информацию и предлагает пользователю ввести данные.
  • b**2 — это возведение в степень, в данном случае переменная b возводится в квадрат.
  • str — эта функция приводит данные к строковому виду.
  • if-elif-else — это условные операторы в языке Python. Исходя из значения discriminant мы определяем количество корней квадратного уравнения.
  • discriminant ** 0.5 — с помощью такого способа извлекаем квадратный корень. В Python есть несколько способов извлечения корней, например, с помощью функции sqrt из библиотеки math. Про способы извлечения корней в Python описано в отдельной статье.

Запустим программу и введём нужные коэффициенты.

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

Дополнительно

Хотелось бы уделить внимание ещё одному моменту. Если дискриминант отрицательный, то действительных корней нет. Но будут комплексные корни. Если мы хотим их обрабатывать, то следует изменить конструкцию условных операторов следующим образом:

Тогда пример решения уравнения будет выглядеть следующим образом:

Как видим, получили два комплексных корня.

Этот простой код написанный на Python 3 можно для обучения программированию немного усложнить:

  • Предлагать запрос в конце программы «Решить ещё одно уравнение (y/n): ». И если пользователь введет «y», то заново запросить коэффициенты. Это нужно делать в цикле. Подробнее о циклах в Python можно прочитать здесь.
  • Сделать проверку корректности ввода. Ведь пользователь вместо числа может ввести какую-нибудь строку, которая не будет корректно обработана. Про проверку на число описано в отдельной статье.


источники:

http://pythobyte.com/symbolic-math-with-sympy-f6fc8e1a/

http://all-python.ru/primery/kvadratnoe-uravnenie.html