Как решить уравнение в python

от admin

Solvers#

The solvers module in SymPy implements methods for solving equations.

solve() is an older more mature general function for solving many types of equations. solve() has many options and uses different methods internally to determine what type of equations you pass it, so if you know what type of equation you are dealing with you may want to use the newer solveset() which solves univariate equations, linsolve() which solves system of linear equations, and nonlinsolve() which solves systems of non linear equations.

Algebraic equations#

Use solve() to solve algebraic equations. We suppose all equations are equaled to 0, so solving x**2 == 1 translates into the following code:

The first argument for solve() is an equation (equaled to zero) and the second argument is the symbol that we want to solve the equation for.

sympy.solvers.solvers. solve ( f , * symbols , ** flags ) [source] #

Algebraically solves equations and systems of equations.

f :

  • a single Expr or Poly that must be zero

  • an Equality

  • a Relational expression

  • a Boolean

  • iterable of one or more of the above

symbols : (object(s) to solve for) specified as

  • none given (other non-numeric objects will be used)

  • single symbol

  • denested list of symbols (e.g., solve(f, x, y) )

  • ordered iterable of symbols (e.g., solve(f, [x, y]) )

flags :

dict=True (default is False)

Return list (perhaps empty) of solution mappings.

set=True (default is False)

Return list of symbols and set of tuple(s) of solution(s).

exclude=[] (default)

Do not try to solve for any of the free symbols in exclude; if expressions are given, the free symbols in them will be extracted automatically.

check=True (default)

If False, do not do any testing of solutions. This can be useful if you want to include solutions that make any denominator zero.

numerical=True (default)

Do a fast numerical check if f has only one symbol.

minimal=True (default is False)

A very fast, minimal testing.

warn=True (default is False)

Show a warning if checksol() could not conclude.

simplify=True (default)

Simplify all but polynomials of order 3 or greater before returning them and (if check is not False) use the general simplify function on the solutions and the expression obtained when they are substituted into the function which should be zero.

force=True (default is False)

Make positive all symbols without assumptions regarding sign.

rational=True (default)

Recast Floats as Rational; if this option is not used, the system containing Floats may fail to solve because of issues with polys. If rational=None, Floats will be recast as rationals but the answer will be recast as Floats. If the flag is False then nothing will be done to the Floats.

manual=True (default is False)

Do not use the polys/matrix method to solve a system of equations, solve them one at a time as you might “manually.”

implicit=True (default is False)

Allows solve to return a solution for a pattern in terms of other functions that contain that pattern; this is only needed if the pattern is inside of some invertible function like cos, exp, ect.

particular=True (default is False)

Instructs solve to try to find a particular solution to a linear system with as many zeros as possible; this is very expensive.

quick=True (default is False; particular must be True)

Selects a fast heuristic to find a solution with many zeros whereas a value of False uses the very slow method guaranteed to find the largest number of zeros possible.

cubics=True (default)

Return explicit solutions when cubic expressions are encountered. When False, quartics and quintics are disabled, too.

quartics=True (default)

Return explicit solutions when quartic expressions are encountered. When False, quintics are disabled, too.

quintics=True (default)

Return explicit solutions (if possible) when quintic expressions are encountered.

Решаем систему линейных алгебраических уравнений с Python-пакетом scipy.linalg (не путать с numpy.linalg)

Аппарат линейной алгебры применяют в самых разных областях — в линейном программировании, эконометрике, в естественных науках. Отдельно отмечу, что этот раздел математики востребован в машинном обучении. Если, например, вам нужно поработать с матрицами и векторами, то, вполне возможно, на каком-то шаге вам придётся решать систему линейных алгебраических уравнений (СЛАУ).

СЛАУ — мощный инструмент моделирования процессов. Если некая хорошо изученная модель на основе СЛАУ годится для формализации задачи, то с высокой вероятностью её можно будет решить. А вот насколько быстро — это зависит от вашего инструментария и вычислительных мощностей.

Я расскажу про один из таких инструментов — Python-пакет scipy.linalg из библиотеки SciPy, который позволяет быстро и эффективно решать многие задачи с использованием аппарата линейной алгебры.

В этом туториале вы узнаете:

  • как установить scipy.linalg и подготовить среду выполнения кода;
  • как работать с векторами и матрицами с помощью NumPy;
  • почему scipy.linalg лучше, чем numpy.linalg;
  • как формализовать задачи с использованием систем линейных алгебраических уравнений;
  • как решать СЛАУ с помощью scipy.linalg (на реальном примере).

Когда речь идёт о математике, изложение материала должно быть последовательным — таким, чтобы одно следовало из другого. Эта статья не исключение: сначала будет много подготовительной информации и только потом мы перейдём непосредственно к делу.

Если готовы к этому — приглашаю под кат. Хотя, честно говоря, некоторые разделы можно пропускать — например, основы работы с векторами и матрицами в NumPy (если вы хорошо знакомы с ним).

Установка scipy.linalg

SciPy — это библиотека Python с открытым исходным кодом для научных вычислений: решение СЛАУ, оптимизация, интеграция, интерполяция и обработка сигналов. Помимо linalg, она содержит несколько других пакетов — например, NumPy, Matplotlib, SymPy, IPython и pandas.

Среди прочего, scipy.linalg содержит функции для с работы с матрицами — вычисление определителя, инверсия, вычисление собственных значений и векторов, а также сингулярное разложение.

Чтобы использовать scipy.linalg, вам необходимо установить и настроить библиотеку SciPy. Это можно сделать с помощью дистрибутива Anaconda, а также системы управления пакетами и инсталлятора Conda.

Для начала подготовьте среду выполнения для библиотеки:

Установите необходимые пакеты:

Эта команда может работать долго. Не пугайтесь!

Я предлагаю использовать Jupyter Notebook для запуска кода в интерактивной среде. Это не обязательно, но лично мне он облегчает работу.

Перед открытием Jupyter Notebook вам необходимо зарегистрировать экземпляр conda linalg, чтобы использовать его в качестве ядра при создании ноутбука. Для этого выполните следующую команду:

Теперь можно открыть Jupyter Notebook:

Когда он загрузится в вашем браузере, создайте новый notebook, нажав New linalg:

Чтобы убедиться, что установка библиотеки SciPy прошла успешно, введите в ноутбуке:

NumPy для работы с векторами и матрицами (куда же без него)

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

NumPy — это наиболее популярный пакет для работы с матрицами и векторами в Python. Часто его применяют в сочетании с scipy.linalg. Чтобы начать работу с матрицами и векторами, нужно импортировать пакет NumPy:

Для представления матриц и векторов NumPy использует специальный тип, называемый ndarray. Чтобы создать объект ndarray, вы можете использовать array ().

Например, вам нужно создать следующую матрицу:

Создадим матрицу как набор вложенных списков (векторов-строк):

Заметьте, что приведённый выше вывод (Outp[3]) достаточно наглядно показывает получившуюся матрицу.

И ещё: все элементы матрицы должны и будут иметь один тип. Это можно проверить с помощью dtype.

Здесь элементы являются целыми числами, поэтому их общий тип по умолчанию — int64. Если бы среди них было хотя бы одно число с плавающей точкой, все элементы получили бы тип float64:

Чтобы вывести на экран размерность матрицы, можно использовать метод shape:

Как и ожидалось, размерность матрицы A 3×2, то есть A имеет три строки и два столбца.

При работе с матрицами часто приходится использовать операцию транспонирования, которая столбцы превращает в строки и наоборот. Чтобы транспонировать вектор или матрицу (представленную объектом типа ndarray), вы можете использовать .transpose () или .T. Например:

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

По аналогии с матрицами, используем .shape(), чтобы вывести на экран размерность вектора:

Заметьте, что она выглядит как (3,), а не как (3, 1) или (1, 3). Разработчики NumPy решили сделать отображение размерности векторов так же, как в MATLAB.

Чтобы получить на выходе размерность (1, 3), нужно было бы создать вот такой массив:

Для (3, 1) — вот такой:

Как видите, они не идентичны.

Часто возникает задача из вектора-строки сделать вектор-столбец. Как вариант, можно сначала создать вектор-строку, а потом использовать .reshape() для его преобразования в столбец:

В приведённом выше примере мы использовали .reshape() для получения вектора-столбца с размерностью (3, 1) из вектора с размерностью(3,). Стоит отметить, что .reshape() делает преобразование с учётом того, что количество элементов (100% заполненных мест) в массиве с новой размерностью должно быть равно количеству элементов в исходном массиве.

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

Заполнение массивов данными

NumPy позволяет быстро создавать и заполнять массивы. Например, чтобы создать массив, заполненный нулями, можно использовать .zeros():

В качестве аргумента .zeros() нужно указать размерность массива, упакованную в кортеж (перечислить значения через запятую и обернуть это в круглые скобки). Элементы созданного массива получат тип float64.

Точно так же, для создания массивов из единиц можно использовать .ones ():

Элементы созданного массива также получат тип float64.

Создать массив, заполненный случайными числами, поможет .random.rand():

Говоря точнее, метод .random.rand() возвращает массив с псевдослучайными значениями (от 0 до 1) из множества, сгенерированного по закону равномерного распределения. Обратите внимание, что в отличие от .zeros() и .ones(), .random.rand () на вход принимает не кортеж, а просто два значения через запятую.

Чтобы получить массив с псевдослучайными значениями, взятыми из множества, сгенерированного по закону нормального распределения с нулевым средним и единичной дисперсией, вы можете использовать .random.randn():

Почему scipy.linalg лучше, чем numpy.linalg

NumPy имеет встроенный модуль numpy.linalg для решения некоторых задач, связанных с аппаратом линейной алгебры. Обычно scipy.linalg рекомендуют использовать по следующим причинам:

    В официальной документации сказано, что scipy.linalg содержит все функции numpy.linalg, а также дополнительные функции, не входящие в numpy.linalg.

В следующем разделе мы применим scipy.linalg для работы с системами линейных алгебраических уравнений. Наконец-то практика!

Формализация и решение задач с scipy.linalg

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

В этом разделе вы узнаете, как использовать scipy.linalg.solve() для решения СЛАУ. Но прежде чем приступить к работе с кодом, займёмся формализацией задачи и далее рассмотрим простой пример.

Система линейных алгебраических уравнений — это набор из m уравнений, n переменных и вектора свободных членов. Прилагательное «линейных» означает, что все переменные имеют первую степень. Для простоты рассмотрим СЛАУ, где m и n равны 3:

Есть ещё одно требование к «линейности»: коэффициенты K₁ … K₉ и вектор b₁ … b₃ должны быть константами (в математическом смысле этого слова).

В реальных задачах СЛАУ обычно содержат большое количество переменных, что делает невозможным решение систем вручную. К счастью, такие инструменты, как scipy.linalg, могут выполнить эту тяжелую работу.

Задача 1

Мы сначала разберёмся с основами scipy.linalg.solve() на простом примере, а в следующем разделе возьмём задачу посложнее.

Перейдём к матричной записи нашей системы и введём соответствующие обозначения — A, x и b:

Заметьте: левая часть в исходной записи системы — это обычное произведение матрицы A на вектор x.

Читать:
Как разобрать ноутбук emachines

Всё, теперь можно переходить к программированию.

Пишем код, используя scipy.linalg.solve()

Входными данными для scipy.linalg.solve() будут матрица A и вектор b. Их нужно представить в виде двух массивов: A — массив 2х2 и b — массив 2х1. В этом нам как раз поможет NumPy. Таким образом, мы можем решить систему так:

Разберём приведённый выше код:

  1. Строки 1 и 2: импортируем NumPy и функцию solve() из scipy.linalg.
  2. Строки с 4 по 9: создаём матрицу коэффициентов как двумерный массив с именем A.
  3. Строка 11: создаём вектор-строку b как массив с именем b. Чтобы сделать его вектор-столбцом, вызываем .reshape ((2, 1)).
  4. Строки 13 и 14: вызываем .solve() для нашей системы, результат сохраняем в х и выводим его. Обратите внимание, что .solve() возвращает вектор из чисел с плавающей запятой, даже если все элементы исходных массивов являются целыми числами.

Далее возьмём более сложный пример из реальной практики.

Задача 2: составление плана питания

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

Ниже мы сформируем план питания, смешивая разные продукты, чтобы получить сбалансированную диету.

Нам даны нормы содержания витаминов в пище:

  • 170 единиц витамина А;
  • 180 единиц витамина B;
  • 140 единиц витамина С;
  • 180 единиц витамина D;
  • 350 единиц витамина Е.
Продукт Витамин A Витамин B Витамин C Витамин D Витамин E
1 1 10 1 2 2
2 9 1 0 1 1
3 2 2 5 1 2
4 1 1 1 2 13
5 1 1 1 9 2

Необходимо скомбинировать продукты питания так, чтобы их концентрация была оптимальной и соответствовала нормам содержания витаминов в пище.

Обозначим оптимальную концентрацию (количество единиц) для продукта 1 как x1, для продукта 2 — как x2 и так далее. Так как мы будем смешивать продукты, то для каждого витамина (столбца таблицы) можно просто просуммировать значения, по всем продуктам. Учитывая, что сбалансированная диета должна включать 170 единиц витамина А, то, используя данные из столбца «Витамин А», составим уравнение:

Аналогичные уравнения можно составить и для витаминов B, C, D, E, объединив всё в систему:

Запишем полученную СЛАУ в матричной форме:

Теперь для решения системы можно использовать scipy.linalg.solve():

Мы получили результат. Давайте его расшифруем. Сбалансированная диета должна включать:

  • 10 единиц продукта 1;
  • 10 единиц продукта 2;
  • 20 единиц продукта 3;
  • 20 единиц продукта 4;
  • 10 единиц продукта 5.

Облачные VPS-серверы с быстрыми NVMе-дисками и посуточной оплатой. Загрузка своего ISO.

Simplest way to solve mathematical equations in Python

I want to solve a set of equations, linear, or sometimes quadratic. I don’t have a specific problem, but often, I have been in this situation often.

It is simple to use wolframalpha.com, the web equivalent of Mathematica, to solve them. But that doesn’t provide the comfort and convenience of an iPython shell.

Is there a simple library to work on linear and quadratic equations from a python shell?

Personally, I find it extremely convenient to use the Casio 991 MS scientific calculator. I know how to set variables, solve equations, and do a lot. I want such a tool preferably usable from within an ipython shell. I am surprised not to have found any. I’m not impressed enough by sage; perhaps I am missing something.

bjb568's user avatar

16 Answers 16

sympy is exactly what you’re looking for.

You discount the best answer as unacceptable.

Your question is «I want a free Computer Algebra System that I can use in Python.»

The answer is «SAGE does that.»

Have you looked at maxima/macsyma? SAGE provides bindings for it, and that’s one of the more powerful free ones.

Here is how to solve your original question using Python (via Sage). This basically clarifies the remark Paul McMillan makes above.

For inexact solutions, read up on linear programming and sequential quadratic optimization, then search for Python libraries that performs such optimizations for you.

If the equations require integer solutions, you should search for Diophantine equation solvers for Python.

Just note that using a simple solver for Project Euler is missing the point. The fun, and educational part, is learning how to solve it yourself using primitive methods!

A free web-service for solving large-scale systems of nonlinear equations (1 million+) is APMonitor.com. There is a browser interface and an API to Python / MATLAB. The API to Python is a single script (apm.py) that is available for download from the apmonitor.com homepage. Once the script is loaded into a Python code, it gives the ability to solve problems of:

  • Nonlinear equations
  • Differential and algebraic equations
  • Least squares model fitting
  • Moving horizon estimation
  • Nonlinear model predictive control
  • etc.

For the new user, the APM Python software has a Google Groups forum where a user can post questions. There are bi-weekly webinars that showcase optimization problems in operations research and engineering.

Below is an example of an optimization problem (hs71.apm).

The optimization problem is solved with the following Python script:

Have you looked at SciPy?

It has an example in the tutorials on solving linear algebra:

Andre Miller's user avatar

In python, using sympy’s solver module (note that it assumes all equations are set equal to zero):

And of course, a != 1000, as a-1000 is the denominator of the two equations.

I have just started using GNU Scientific Library, which however is C library. Looks like there are Python bindings too. So, it might be worth looking at.

I’d use Octave for this but I agree, the syntax of Octave isn’t what I’d call thrilling (and the docs always confuse me more than they help, too).

SymPy symbolic Python library demo: symbolically solving math and integrals & pretty-printing the output

While I have a tendency to write some of the longest answers on Stack Overflow, that is the shortest answer I’ve seen on Stack Overflow.

Let’s add a basic demo.

References and tutorials you’ll need:

    —> click "Get started with the tutorial"

    1. Tutorial index: https://docs.sympy.org/latest/tutorial/index.html Example pages:

    Calculus demo I came up with (see here for the main tutorial I looked at to get started):

    Short version:

    Longer version:

    Note that using pprint(integral) is the same as print(pretty(integral)) .

    Output of running the above commands:

    The SymPy symbolic math library in Python can do pretty much any kind of math, solving equations, simplifying, factoring, substituting values for variables, pretty printing, converting to LaTeX format, etc. etc. It seems to be a pretty robust solver in my very limited use so far. I recommend trying it out.

    Installing it, for me (tested on Linux Ubuntu), was as simple as:

    I don’t think there is a unified way of dealing with both linear and quadratic (or generally nonlinear) equations simultaneously. With linear systems, python has bindings to linear algebra and matrix packages. Nonlinear problems tend to be solved on a case by case basis.

    It depends on your needs:

    If you want an interactive graphical interface, then sage is probably the best solution.

    If you want to avoid using a graphical interface, but you still want to do computer algebra, then sympy or maxima may cover your needs. (sympy looks very promising, but it still have a long way to go before they can replace mathematica).

    If you don’t really need symbolic algrebra, but you need a way to program with matrices, solve differential equations, and minimize functions, then scipy or octave are excelent starting points.

    Take a look at this:

    It is extremely easy to use and quite powerful

    Well, I just googled into this page by accident. I see many suggestions regarding this and that software tool, but does any tool actually provide an answer? The actual answer is:

    How did I get this? By writing a quick program in the Maxima programming language to find it via «brute force» searching. It only took about 10 minutes to write, seeing as how I’m familiar with the Maxima language. It took a few seconds for the program to run. Here is the program:

    euler_solve():= block ( [ a, b, A, B, end:1000],

    You can just cut and paste the above code into the wxMaxima user interface, which I run under Ubuntu and not MS Windows. Then you just enter the function name: euler_solve(), hit return, wait a few seconds, and out pops the answer. This particular kind of problem is so simple that you could use any general-purpose programming language to do the search.

    Основы

    Иногда дроби плохо считать в float , например, 1/3 + 2/3 это 1. Но если посчитать в виде десятичных дробей, то потеряем точность и не получим 1.

    Хочется считать точно и не терять корни.

    %TODO% Резервированные константы (e, pi) и греческие буквы

    Дальше считаем, что у нас работают функции из sympy

    Символы — symbols

    В python можно было первое использование переменной было ее созданием

    В sympy так нельзя

    В sympy нужно сначала определить переменные

    или сразу несколько переменных

    Имя переменной и символ может состоять из нескольких букв

    Имя переменной может не совпадать с ее символом.

    Нельзя делать символы Q,C,O,S,I,N и E
    Они имеют специальные значения.

    Выражения

    Можно записать несколько переменных в выражение. Можно придумать любое имя выражению, например, expr или aaa.

    Математические функции и константы

    oo
    sqrt(x) x ** 0.5
    root(8, 3) 2 = корень 3 степени из 8
    root(x, n) x ** (1.0/n)
    factorial(n) n!
    sin(x) cos(x) tan(x) cot(x) sin, cos, tangence, cotangence
    log(x) ln(x)
    log(x, b) logb(x)

    simplify — упростить выражение

    expand, factor, collect — раскрыть скобки, сгруппировать, в форме полинома

    тригонометрические функции trigsimp и expand_trig

    subs — подстановка, evalf, n, N — вычислить

    apart, together — работа с дробями

    together — привести к общему знаменателю

    Limit

    limit(функция, переменная, значение) — найти предел функции при переменной стремящейся к значению

    series Разложить в ряд

    Функция .series(переменная, точка, порядок) — разложить функцию по переменной в окрестностях точки с точностью до порядка

    summation Сумма

    diff Производная

    diff(func, var) производная функции func по переменной var

    diff(func, var, n) производная функции func по переменной var порядка n

    %?% Производная от двух переменных

    integrate Интегрирование

    Неопределенный интеграл

    Определенный интеграл

    Численное интегрирование

    Сначала делаем интеграл. Потом вычисляем его численное приближение разными способами.

    Считаем его как частичную сумму

    as_sum(n=None, method=’midpoint’, evaluate=True)

    • n — The number of subintervals to use, optional.
    • method
      • left
      • right
      • midpoint
      • trapezoid

      Когда часть функции слишком большая:

      Замена переменных transform(x, u)

      Performs a change of variables from x to u using the relationship given by x and u which will define the transformations f and F (which are inverses of each other) as follows:

      • If x is a Symbol (which is a variable of integration) then u will be interpreted as some function, f(u), with inverse F(u). This, in effect, just makes the substitution of x with f(x).
      • If u is a Symbol then x will be interpreted as some function, F(x), with inverse f(u). This is commonly referred to as u-substitution.

      Once f and F have been identified, the transformation is made as follows: ∫baxdx→∫F(b)F(a)f(x)d/dx

      where F(x) is the inverse of f(x) and the limits and integrand have been corrected so as to retain the same value after integration.

      This attempt fails because x = +/-sqrt(u + 1) and the sign does not cancel out of the integrand:

      solve — решение уравнений и систем уравнений

      Для решения уравнения вида f(x) = 0

      Сохраним корни уравнения в список (list)

      Для решения системы уравнений x + y — 3=0 и 3*x — 2*y = 0 напишем список функций в виде [f(x), g(x)]

Похожие статьи