Как написать программу для решения уравнений на python

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

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

  • Программа

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

Программа, позволяющая находить корни квадратного уравнения, – это один из примеров простых программ, которые можно написать на 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 описано в отдельной статье.
print('Решаем уравнение a•x²+b•x+c=0')
a = input('Введите значение a: ')
b = input('Введите значение b: ')
c = input('Введите значение c: ')
a = float(a)
b = float(b)
c = float(c)
discriminant = b**2 - 4*a*c
print('Дискриминант = ' + str(discriminant))
if discriminant < 0:
    print('Корней нет')
elif discriminant == 0:
    x = -b / (2 * a)
    print('x = ' + str(x))
else:
    x1 = (-b + discriminant ** 0.5) / (2 * a)
    x2 = (-b - discriminant ** 0.5) / (2 * a)
    print('x₁ = ' + str(x1))
    print('x₂ = ' + str(x2))

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

Решаем уравнение a•x²+b•x+c=0
Введите значение a: -4
Введите значение b: -231
Введите значение c: 34
Дискриминант = 53905.0
x₁ = -57.89681291718352
x₂ = 0.1468129171835173

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

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

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

if discriminant == 0:
    x = -b / (2 * a)
    print('x = ' + str(x))
else:
    x1 = (-b + discriminant ** 0.5) / (2 * a)
    x2 = (-b - discriminant ** 0.5) / (2 * a)
    print('x₁ = ' + str(x1))
    print('x₂ = ' + str(x2))

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

Решаем уравнение a•x²+b•x+c=0
Введите значение a: 4
Введите значение b: 1
Введите значение c: 2
Дискриминант = -31.0
x₁ = (-0.12499999999999996+0.6959705453537527j)
x₂ = (-0.12500000000000006-0.6959705453537527j)

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

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

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

питон

SymPy¶

SymPy — это пакет для символьных вычислений на питоне, подобный системе Mathematica. Он работает с выражениями, содержащими символы.

In [1]:

from sympy import *
init_printing()

Основными кирпичиками, из которых строятся выражения, являются символы. Символ имеет имя, которое используется при печати выражений. Объекты класса Symbol нужно создавать и присваивать переменным питона, чтобы их можно было использовать. В принципе, имя символа и имя переменной, которой мы присваиваем этот символ — две независимые вещи, и можно написать abc=Symbol('xyz'). Но тогда при вводе программы Вы будете использовать abc, а при печати результатов SymPy будет использовать xyz, что приведёт к ненужной путанице. Поэтому лучше, чтобы имя символа совпадало с именем переменной питона, которой он присваивается.

В языках, специально предназначенных для символьных вычислений, таких, как Mathematica, если Вы используете переменную, которой ничего не было присвоено, то она автоматически воспринимается как символ с тем же именем. Питон не был изначально предназначен для символьных вычислений. Если Вы используете переменную, которой ничего не было присвоено, Вы получите сообщение об ошибке. Объекты типа Symbol нужно создавать явно.

Можно определить несколько символов одновременно. Строка разбивается на имена по пробелам.

Подставим вместо $x$ выражение $y+1$.

Out[5]:

$$left(y + 1right)^{2} — 1$$

Многочлены и рациональные функции¶

SymPy не раскрывает скобки автоматически. Для этого используется функция expand.

Out[6]:

$$left(x + y — zright)^{6}$$

Out[7]:

$$x^{6} + 6 x^{5} y — 6 x^{5} z + 15 x^{4} y^{2} — 30 x^{4} y z + 15 x^{4} z^{2} + 20 x^{3} y^{3} — 60 x^{3} y^{2} z + 60 x^{3} y z^{2} — 20 x^{3} z^{3} + 15 x^{2} y^{4} — 60 x^{2} y^{3} z + 90 x^{2} y^{2} z^{2} — 60 x^{2} y z^{3} + 15 x^{2} z^{4} + 6 x y^{5} — 30 x y^{4} z + 60 x y^{3} z^{2} — 60 x y^{2} z^{3} + 30 x y z^{4} — 6 x z^{5} + y^{6} — 6 y^{5} z + 15 y^{4} z^{2} — 20 y^{3} z^{3} + 15 y^{2} z^{4} — 6 y z^{5} + z^{6}$$

Степень многочлена $a$ по $x$.

Соберём вместе члены с определёнными степенями $x$.

Out[9]:

$$x^{6} + x^{5} left(6 y — 6 zright) + x^{4} left(15 y^{2} — 30 y z + 15 z^{2}right) + x^{3} left(20 y^{3} — 60 y^{2} z + 60 y z^{2} — 20 z^{3}right) + x^{2} left(15 y^{4} — 60 y^{3} z + 90 y^{2} z^{2} — 60 y z^{3} + 15 z^{4}right) + x left(6 y^{5} — 30 y^{4} z + 60 y^{3} z^{2} — 60 y^{2} z^{3} + 30 y z^{4} — 6 z^{5}right) + y^{6} — 6 y^{5} z + 15 y^{4} z^{2} — 20 y^{3} z^{3} + 15 y^{2} z^{4} — 6 y z^{5} + z^{6}$$

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

Out[10]:

$$left(x + y — zright)^{6}$$

SymPy не сокращает отношения многочленов на их наибольший общий делитель автоматически. Для этого используется функция cancel.

In [11]:

a=(x**3-y**3)/(x**2-y**2)
a

Out[11]:

$$frac{x^{3} — y^{3}}{x^{2} — y^{2}}$$

Out[12]:

$$frac{x^{2} + x y + y^{2}}{x + y}$$

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

Out[13]:

$$frac{x}{x + y} + frac{y}{x — y}$$

Out[14]:

$$frac{x left(x — yright) + y left(x + yright)}{left(x — yright) left(x + yright)}$$

Функция simplify пытается переписать выражение в наиболее простом виде. Это понятие не имеет чёткого определения (в разных ситуациях наиболее простыми могут считаться разные формы выражения), и не существует алгоритма такого упрощения. Функция symplify работает эвристически, и невозможно заранее предугадать, какие упрощения она попытается сделать. Поэтому её удобно использовать в интерактивных сессиях, чтобы посмотреть, удастся ли ей записать выражение в каком-нибудь разумном виде, но нежелательно использовать в программах. В них лучше применять более специализированные функции, которые выполняют одно определённое преобразование выражения.

Out[15]:

$$frac{x^{2} + y^{2}}{x^{2} — y^{2}}$$

Разложение на элементарные дроби по отношению к $x$.

Out[16]:

$$- frac{y}{x + y} + frac{y}{x — y} + 1$$

Подставим конкретные численные значения вместо переменных $x$ и $y$.

Out[17]:

$$- frac{5}{3}$$

А сколько это будет численно?

Out[18]:

$$-1.66666666666667$$

Элементарные функции¶

SymPy автоматически применяет упрощения элементарных функция (которые справедливы во всех случаях).

Out[19]:

$$- sin{left (x right )}$$

Out[20]:

$$left ( frac{sqrt{2}}{2}, quad — frac{sqrt{3}}{3}right )$$

SymPy может работать с числами с плавающей точкой, имеющими сколь угодно большую точность. Вот $pi$ с 100 значащими цифрами.

Out[21]:

$$3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068$$

E — это основание натуральных логарифмов.

Out[22]:

$$left ( 0, quad 1right )$$

Out[23]:

$$left ( x, quad log{left (e^{x} right )}right )$$

А почему не $x$? Попробуйте подставить $x=2pi i$.

Out[25]:

$$left ( x^{2}, quad sqrt{x^{4}}right )$$

А почему не $x^2$? Попробуйте подставить $x=i$.

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

In [26]:

p,q=symbols('p q',positive=True)
sqrt(p**2)

In [27]:

sqrt(12*x**2*y),sqrt(12*p**2*y)

Out[27]:

$$left ( 2 sqrt{3} sqrt{x^{2} y}, quad 2 sqrt{3} p sqrt{y}right )$$

Пусть символ $n$ будет целым (I — это мнимая единица).

In [28]:

n=Symbol('n',integer=True)
exp(2*pi*I*n)

Метод rewrite пытается переписать выражение в терминах заданной функции.

In [29]:

cos(x).rewrite(exp),exp(I*x).rewrite(cos)

Out[29]:

$$left ( frac{e^{i x}}{2} + frac{1}{2} e^{- i x}, quad i sin{left (x right )} + cos{left (x right )}right )$$

Out[30]:

$$- i log{left (i x + sqrt{- x^{2} + 1} right )}$$

Функция trigsimp пытается переписать тригонометрическое выражение в наиболее простом виде. В программах лучше использовать более специализированные функции.

In [31]:

trigsimp(2*sin(x)**2+3*cos(x)**2)

Out[31]:

$$cos^{2}{left (x right )} + 2$$

Функция expand_trig разлагает синусы и косинусы сумм и кратных углов.

In [32]:

expand_trig(sin(x-y)),expand_trig(sin(2*x))

Out[32]:

$$left ( sin{left (x right )} cos{left (y right )} — sin{left (y right )} cos{left (x right )}, quad 2 sin{left (x right )} cos{left (x right )}right )$$

Чаще нужно обратное преобразование — произведений и степеней синусов и косинусов в выражения, линейные по этим функциям. Например, пусть мы работаем с отрезком ряда Фурье.

In [33]:

a1,a2,b1,b2=symbols('a1 a2 b1 b2')
a=a1*cos(x)+a2*cos(2*x)+b1*sin(x)+b2*sin(2*x)
a

Out[33]:

$$a_{1} cos{left (x right )} + a_{2} cos{left (2 x right )} + b_{1} sin{left (x right )} + b_{2} sin{left (2 x right )}$$

Мы хотим возвести его в квадрат и опять получить отрезок ряда Фурье.

In [34]:

a=(a**2).rewrite(exp).expand().rewrite(cos).expand()
a

Out[34]:

$$frac{a_{1}^{2}}{2} cos{left (2 x right )} + frac{a_{1}^{2}}{2} + a_{1} a_{2} cos{left (x right )} + a_{1} a_{2} cos{left (3 x right )} + a_{1} b_{1} sin{left (2 x right )} + a_{1} b_{2} sin{left (x right )} + a_{1} b_{2} sin{left (3 x right )} + frac{a_{2}^{2}}{2} cos{left (4 x right )} + frac{a_{2}^{2}}{2} — a_{2} b_{1} sin{left (x right )} + a_{2} b_{1} sin{left (3 x right )} + a_{2} b_{2} sin{left (4 x right )} — frac{b_{1}^{2}}{2} cos{left (2 x right )} + frac{b_{1}^{2}}{2} + b_{1} b_{2} cos{left (x right )} — b_{1} b_{2} cos{left (3 x right )} — frac{b_{2}^{2}}{2} cos{left (4 x right )} + frac{b_{2}^{2}}{2}$$

In [35]:

a.collect([cos(x),cos(2*x),cos(3*x),sin(x),sin(2*x),sin(3*x)])

Out[35]:

$$frac{a_{1}^{2}}{2} + a_{1} b_{1} sin{left (2 x right )} + frac{a_{2}^{2}}{2} cos{left (4 x right )} + frac{a_{2}^{2}}{2} + a_{2} b_{2} sin{left (4 x right )} + frac{b_{1}^{2}}{2} — frac{b_{2}^{2}}{2} cos{left (4 x right )} + frac{b_{2}^{2}}{2} + left(frac{a_{1}^{2}}{2} — frac{b_{1}^{2}}{2}right) cos{left (2 x right )} + left(a_{1} a_{2} — b_{1} b_{2}right) cos{left (3 x right )} + left(a_{1} a_{2} + b_{1} b_{2}right) cos{left (x right )} + left(a_{1} b_{2} — a_{2} b_{1}right) sin{left (x right )} + left(a_{1} b_{2} + a_{2} b_{1}right) sin{left (3 x right )}$$

Функция expand_log преобразует логарифмы произведений и степеней в суммы логарифмов (только для положительных величин); logcombine производит обратное преобразование.

In [36]:

a=expand_log(log(p*q**2))
a

Out[36]:

$$log{left (p right )} + 2 log{left (q right )}$$

Out[37]:

$$log{left (p q^{2} right )}$$

Функция expand_power_exp переписывает степени, показатели которых — суммы, через произведения степеней.

In [38]:

expand_power_exp(x**(p+q))

Функция expand_power_base переписывает степени, основания которых — произведения, через произведения степеней.

In [39]:

expand_power_base((x*y)**n)

Функция powsimp выполняет обратные преобразования.

In [40]:

powsimp(exp(x)*exp(2*y)),powsimp(x**n*y**n)

Out[40]:

$$left ( e^{x + 2 y}, quad left(x yright)^{n}right )$$

Можно вводить функции пользователя. Они могут иметь произвольное число аргументов.

In [41]:

f=Function('f')
f(x)+f(x,y)

Out[41]:

$$f{left (x right )} + f{left (x,y right )}$$

Структура выражений¶

Внутреннее представление выражения — это дерево. Функция srepr возвращает строку, представляющую его.

Out[42]:

"Add(Symbol('x'), Integer(1))"

Out[43]:

"Add(Symbol('x'), Integer(-1))"

Out[44]:

"Add(Symbol('x'), Mul(Integer(-1), Symbol('y')))"

Out[45]:

"Mul(Rational(2, 3), Symbol('x'), Symbol('y'))"

Out[46]:

"Mul(Symbol('x'), Pow(Symbol('y'), Integer(-1)))"

Вместо бинарных операций +, *, ** и т.д. можно использовать функции Add, Mul, Pow и т.д.

Out[48]:

"Function('f')(Symbol('x'), Symbol('y'))"

Атрибут func — это функция верхнего уровня в выражении, а args — список её аргументов.

Out[50]:

$$left ( 2, quad x, quad y^{2}right )$$

In [51]:

for i in a.args:
    print(i)

Функция subs заменяет переменную на выражение.

Она можнет заменить несколько переменных. Для этого ей передаётся список кортежей или словарь.

Она может заменить не переменную, а подвыражение — функцию с аргументами.

In [55]:

a=f(x)+f(y)
a.subs(f(y),1)

Out[55]:

$$f{left (x right )} + 1$$

In [57]:

(x+x**2+x**3+x**4).subs(x**2,y)

Out[57]:

$$x^{3} + x + y^{2} + y$$

Подстановки производятся последовательно. В данном случае сначала $x$ заменился на $y$, получилось $y^3+y^2$; потом в этом результате $y$ заменилось на $x$.

In [58]:

a=x**2+y**3
a.subs([(x,y),(y,x)])

Out[58]:

$$x^{3} + x^{2}$$

Если написать эти подстановки в другом порядке, результат будет другим.

Out[59]:

$$y^{3} + y^{2}$$

Но можно передать функции subs ключевой параметр simultaneous=True, тогда подстановки будут производиться одновременно. Таким образом можно, например, поменять местами $x$ и $y$.

In [60]:

a.subs([(x,y),(y,x)],simultaneous=True)

Out[60]:

$$x^{3} + y^{2}$$

Можно заменить функцию на другую функцию.

In [61]:

g=Function('g')
a=f(x)+f(y)
a.subs(f,g)

Out[61]:

$$g{left (x right )} + g{left (y right )}$$

Метод replace ищет подвыражения, соответствующие образцу (содержащему произвольные переменные), и заменяет их на заданное выражение (оно может содержать те же произвольные переменные).

In [62]:

a=Wild('a')
(f(x)+f(x+y)).replace(f(a),a**2)

Out[62]:

$$x^{2} + left(x + yright)^{2}$$

In [63]:

(f(x,x)+f(x,y)).replace(f(a,a),a**2)

Out[63]:

$$x^{2} + f{left (x,y right )}$$

In [64]:

a=x**2+y**2
a.replace(x,x+1)

Out[64]:

$$y^{2} + left(x + 1right)^{2}$$

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

In [65]:

a=2*x*y*z
a.replace(x*y,z)

In [66]:

(x+x**2+x**3+x**4).replace(x**2,y)

Out[66]:

$$x^{4} + x^{3} + x + y$$

Решение уравнений¶

In [67]:

a,b,c,d,e,f=symbols('a b c d e f')

Уравнение записывается как функция Eq с двумя параметрами. Функция solve возврящает список решений.

Out[68]:

$$left [ frac{b}{a}right ]$$

Впрочем, можно передать функции solve просто выражение. Подразумевается уравнение, что это выражение равно 0.

Out[69]:

$$left [ — frac{b}{a}right ]$$

Квадратное уравнение имеет 2 решения.

Out[70]:

$$left [ frac{1}{2 a} left(- b + sqrt{- 4 a c + b^{2}}right), quad — frac{1}{2 a} left(b + sqrt{- 4 a c + b^{2}}right)right ]$$

Система линейных уравнений.

In [71]:

solve([a*x+b*y-e,c*x+d*y-f],[x,y])

Out[71]:

$$left { x : frac{- b f + d e}{a d — b c}, quad y : frac{a f — c e}{a d — b c}right }$$

Функция roots возвращает корни многочлена с их множественностями.

Out[72]:

$$left { -2 : 1, quad 1 : 2right }$$

Функция solve_poly_system решает систему полиномиальных уравнений, строя их базис Грёбнера.

In [73]:

p1=x**2+y**2-1
p2=4*x*y-1
solve_poly_system([p1,p2],x,y)

Out[73]:

$$left [ left ( 4 left(-1 — sqrt{- frac{sqrt{3}}{4} + frac{1}{2}}right) sqrt{- frac{sqrt{3}}{4} + frac{1}{2}} left(- sqrt{- frac{sqrt{3}}{4} + frac{1}{2}} + 1right), quad — sqrt{- frac{sqrt{3}}{4} + frac{1}{2}}right ), quad left ( — 4 left(-1 + sqrt{- frac{sqrt{3}}{4} + frac{1}{2}}right) sqrt{- frac{sqrt{3}}{4} + frac{1}{2}} left(sqrt{- frac{sqrt{3}}{4} + frac{1}{2}} + 1right), quad sqrt{- frac{sqrt{3}}{4} + frac{1}{2}}right ), quad left ( 4 left(-1 — sqrt{frac{sqrt{3}}{4} + frac{1}{2}}right) sqrt{frac{sqrt{3}}{4} + frac{1}{2}} left(- sqrt{frac{sqrt{3}}{4} + frac{1}{2}} + 1right), quad — sqrt{frac{sqrt{3}}{4} + frac{1}{2}}right ), quad left ( — 4 left(-1 + sqrt{frac{sqrt{3}}{4} + frac{1}{2}}right) sqrt{frac{sqrt{3}}{4} + frac{1}{2}} left(sqrt{frac{sqrt{3}}{4} + frac{1}{2}} + 1right), quad sqrt{frac{sqrt{3}}{4} + frac{1}{2}}right )right ]$$

Ряды¶

Out[74]:

$$1 + x + frac{x^{2}}{2} + frac{x^{3}}{6} + frac{x^{4}}{24} + mathcal{O}left(x^{5}right)$$

Ряд может начинаться с отрицательной степени.

Out[75]:

$$frac{1}{x} — frac{x}{3} — frac{x^{3}}{45} + mathcal{O}left(x^{5}right)$$

И даже идти по полуцелым степеням.

In [76]:

sqrt(x*(1-x)).series(x,n=5)

Out[76]:

$$sqrt{x} — frac{x^{frac{3}{2}}}{2} — frac{x^{frac{5}{2}}}{8} — frac{x^{frac{7}{2}}}{16} — frac{5 x^{frac{9}{2}}}{128} + mathcal{O}left(x^{5}right)$$

In [77]:

log(gamma(1+x)).series(x,n=6).rewrite(zeta)

Out[77]:

$$- gamma x + frac{pi^{2} x^{2}}{12} — frac{x^{3} zetaleft(3right)}{3} + frac{pi^{4} x^{4}}{360} — frac{x^{5} zetaleft(5right)}{5} + mathcal{O}left(x^{6}right)$$

In [78]:

sinx=series(sin(x),x,0,8)
sinx

Out[78]:

$$x — frac{x^{3}}{6} + frac{x^{5}}{120} — frac{x^{7}}{5040} + mathcal{O}left(x^{8}right)$$

In [79]:

cosx=series(cos(x),x,n=8)
cosx

Out[79]:

$$1 — frac{x^{2}}{2} + frac{x^{4}}{24} — frac{x^{6}}{720} + mathcal{O}left(x^{8}right)$$

In [80]:

tanx=series(tan(x),x,n=8)
tanx

Out[80]:

$$x + frac{x^{3}}{3} + frac{2 x^{5}}{15} + frac{17 x^{7}}{315} + mathcal{O}left(x^{8}right)$$

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

Out[81]:

$$x — frac{x^{3}}{6} + frac{x^{5}}{120} — frac{x^{7}}{5040} + mathcal{O}left(x^{8}right)$$

Out[82]:

$$x + frac{x^{3}}{3} + frac{2 x^{5}}{15} + frac{17 x^{7}}{315} + mathcal{O}left(x^{8}right)$$

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

In [83]:

series(sinx**2+cosx**2,n=8)

Out[83]:

$$1 + mathcal{O}left(x^{8}right)$$

Здесь первые члены сократились, и ответ можно получить лишь с меньшей точностью.

In [84]:

series((1-cosx)/x**2,n=6)

Out[84]:

$$frac{1}{2} — frac{x^{2}}{24} + frac{x^{4}}{720} + mathcal{O}left(x^{6}right)$$

Ряды можно дифференцировать и интегрировать.

Out[85]:

$$1 — frac{x^{2}}{2} + frac{x^{4}}{24} — frac{x^{6}}{720} + mathcal{O}left(x^{7}right)$$

Out[86]:

$$x — frac{x^{3}}{6} + frac{x^{5}}{120} — frac{x^{7}}{5040} + mathcal{O}left(x^{9}right)$$

Можно подставить ряд (если он начинается с малого члена) вместо переменной разложения в другой ряд. Вот ряды для $sin(tan(x))$ и $tan(sin(x))$.

In [87]:

st=series(sinx.subs(x,tanx),n=8)
st

Out[87]:

$$x + frac{x^{3}}{6} — frac{x^{5}}{40} — frac{55 x^{7}}{1008} + mathcal{O}left(x^{8}right)$$

In [88]:

ts=series(tanx.subs(x,sinx),n=8)
ts

Out[88]:

$$x + frac{x^{3}}{6} — frac{x^{5}}{40} — frac{107 x^{7}}{5040} + mathcal{O}left(x^{8}right)$$

Out[89]:

$$frac{x^{7}}{30} + mathcal{O}left(x^{8}right)$$

В ряд нельзя подставлять численное значение переменной разложения (а значит, нельзя и строить график). Для этого нужно сначала убрать $mathcal{O}$ член, превратив отрезок ряда в многочлен.

Out[90]:

$$- frac{x^{7}}{5040} + frac{x^{5}}{120} — frac{x^{3}}{6} + x$$

Производные¶

Out[91]:

$$x cos{left (x + y right )} + sin{left (x + y right )}$$

Out[92]:

$$x cos{left (x + y right )}$$

Вторая производная по $x$ и первая по $y$.

Out[93]:

$$- x cos{left (x + y right )} + 2 sin{left (x + y right )}$$

Можно дифференцировать выражения, содержащие неопределённые функции.

In [94]:

a=x*f(x**2)
b=diff(a,x)
b

Out[94]:

$$2 x^{2} left. frac{d}{d xi_{1}} f{left (xi_{1} right )} right|_{substack{ xi_{1}=x^{2} }} + f{left (x^{2} right )}$$

Что это за зверь такой получился?

2*x**2*Subs(Derivative(f(_xi_1), _xi_1), (_xi_1,), (x**2,)) + f(x**2)

Функция Derivative представляет невычисленную производную. Её можно вычислить методом doit.

In [96]:

a=Derivative(sin(x),x)
Eq(a,a.doit())

Out[96]:

$$frac{d}{d x} sin{left (x right )} = cos{left (x right )}$$

Интегралы¶

In [97]:

integrate(1/(x*(x**2-2)**2),x)

Out[97]:

$$frac{1}{4} log{left (x right )} — frac{1}{8} log{left (x^{2} — 2 right )} — frac{1}{4 x^{2} — 8}$$

In [98]:

integrate(1/(exp(x)+1),x)

Out[98]:

$$x — log{left (e^{x} + 1 right )}$$

Out[99]:

$$x log{left (x right )} — x$$

Out[100]:

$$- x cos{left (x right )} + sin{left (x right )}$$

In [101]:

integrate(x*exp(-x**2),x)

Out[101]:

$$- frac{e^{- x^{2}}}{2}$$

Out[102]:

$$int x^{x}, dx$$

Получился невычисленный интеграл.

In [104]:

a=Integral(sin(x),x)
Eq(a,a.doit())

Out[104]:

$$int sin{left (x right )}, dx = — cos{left (x right )}$$

In [105]:

integrate(sin(x),(x,0,pi))

In [106]:

integrate(exp(-x**2),(x,0,oo))

Out[106]:

$$frac{sqrt{pi}}{2}$$

In [107]:

integrate(log(x)/(1-x),(x,0,1))

Out[107]:

$$- frac{pi^{2}}{6}$$

Суммирование рядов¶

In [108]:

summation(1/n**2,(n,1,oo))

Out[108]:

$$frac{pi^{2}}{6}$$

In [109]:

summation((-1)**n/n**2,(n,1,oo))

Out[109]:

$$- frac{pi^{2}}{12}$$

In [110]:

summation(1/n**4,(n,1,oo))

Out[110]:

$$frac{pi^{4}}{90}$$

Невычисленная сумма обозначается Sum.

In [111]:

a=Sum(x**n/factorial(n),(n,0,oo))
Eq(a,a.doit())

Out[111]:

$$sum_{n=0}^{infty} frac{x^{n}}{n!} = e^{x}$$

Пределы¶

In [112]:

limit((tan(sin(x))-sin(tan(x)))/x**7,x,0)

Out[112]:

$$frac{1}{30}$$

Ну это простой предел, считается разложением числителя и знаменателя в ряды. А вот если в $x=0$ существенно особая точка, дело сложнее. Посчитаем односторонние пределы.

In [113]:

limit((tan(sin(x))-sin(tan(x)))/(x**7+exp(-1/x)),x,0,'+')

Out[113]:

$$frac{1}{30}$$

In [114]:

limit((tan(sin(x))-sin(tan(x)))/(x**7+exp(-1/x)),x,0,'-')

Дифференциальные уравнения¶

In [115]:

t=Symbol('t')
x=Function('x')
p=Function('p')

In [116]:

dsolve(diff(x(t),t)+x(t),x(t))

Out[116]:

$$x{left (t right )} = C_{1} e^{- t}$$

In [117]:

dsolve(diff(x(t),t,2)+x(t),x(t))

Out[117]:

$$x{left (t right )} = C_{1} sin{left (t right )} + C_{2} cos{left (t right )}$$

Система уравнений первого порядка.

In [118]:

dsolve((diff(x(t),t)-p(t),diff(p(t),t)+x(t)))

Out[118]:

$$left [ x{left (t right )} = C_{1} sin{left (t right )} + C_{2} cos{left (t right )}, quad p{left (t right )} = C_{1} cos{left (t right )} — C_{2} sin{left (t right )}right ]$$

Линейная алгебра¶

In [119]:

a,b,c,d,e,f=symbols('a b c d e f')

Матрицу можно построить из списка списков.

In [120]:

M=Matrix([[a,b,c],[d,e,f]])
M

Out[120]:

$$left[begin{matrix}a & b & c\d & e & fend{matrix}right]$$

Out[121]:

$$left ( 2, quad 3right )$$

Out[122]:

$$left[begin{matrix}1 & 2 & 3end{matrix}right]$$

Out[123]:

$$left[begin{matrix}1\2\3end{matrix}right]$$

Можно построить матрицу из функции.

In [124]:

def g(i,j):
    return Rational(1,i+j+1)
Matrix(3,3,g)

Out[124]:

$$left[begin{matrix}1 & frac{1}{2} & frac{1}{3}\frac{1}{2} & frac{1}{3} & frac{1}{4}\frac{1}{3} & frac{1}{4} & frac{1}{5}end{matrix}right]$$

Или из неопределённой функции.

In [125]:

g=Function('g')
M=Matrix(3,3,g)
M

Out[125]:

$$left[begin{matrix}g{left (0,0 right )} & g{left (0,1 right )} & g{left (0,2 right )}\g{left (1,0 right )} & g{left (1,1 right )} & g{left (1,2 right )}\g{left (2,0 right )} & g{left (2,1 right )} & g{left (2,2 right )}end{matrix}right]$$

Out[126]:

$$g{left (1,2 right )}$$

Out[127]:

$$left[begin{matrix}g{left (0,0 right )} & g{left (0,1 right )} & g{left (0,2 right )}\g{left (1,0 right )} & g{left (1,1 right )} & 0\g{left (2,0 right )} & g{left (2,1 right )} & g{left (2,2 right )}end{matrix}right]$$

Out[128]:

$$left[begin{matrix}g{left (2,0 right )} & g{left (2,1 right )} & g{left (2,2 right )}end{matrix}right]$$

Out[129]:

$$left[begin{matrix}g{left (0,1 right )}\g{left (1,1 right )}\g{left (2,1 right )}end{matrix}right]$$

Out[130]:

$$left[begin{matrix}g{left (0,1 right )} & g{left (0,2 right )}\g{left (1,1 right )} & 0end{matrix}right]$$

Out[131]:

$$left[begin{matrix}1 & 0 & 0\0 & 1 & 0\0 & 0 & 1end{matrix}right]$$

Out[132]:

$$left[begin{matrix}0 & 0 & 0\0 & 0 & 0\0 & 0 & 0end{matrix}right]$$

Out[133]:

$$left[begin{matrix}0 & 0 & 0\0 & 0 & 0end{matrix}right]$$

Out[134]:

$$left[begin{matrix}1 & 0 & 0\0 & 2 & 0\0 & 0 & 3end{matrix}right]$$

In [135]:

M=Matrix([[a,1],[0,a]])
diag(1,M,2)

Out[135]:

$$left[begin{matrix}1 & 0 & 0 & 0\0 & a & 1 & 0\0 & 0 & a & 0\0 & 0 & 0 & 2end{matrix}right]$$

In [136]:

A=Matrix([[a,b],[c,d]])
B=Matrix([[1,2],[3,4]])
A+B

Out[136]:

$$left[begin{matrix}a + 1 & b + 2\c + 3 & d + 4end{matrix}right]$$

Out[137]:

$$left ( left[begin{matrix}a + 3 b & 2 a + 4 b\c + 3 d & 2 c + 4 dend{matrix}right], quad left[begin{matrix}a + 2 c & b + 2 d\3 a + 4 c & 3 b + 4 dend{matrix}right]right )$$

Out[138]:

$$left[begin{matrix}3 b — 2 c & 2 a + 3 b — 2 d\- 3 a — 3 c + 3 d & — 3 b + 2 cend{matrix}right]$$

Out[139]:

$$left[begin{matrix}frac{d}{a d — b c} & — frac{b}{a d — b c}\- frac{c}{a d — b c} & frac{a}{a d — b c}end{matrix}right]$$

Собственные значения и векторы¶

In [142]:

M=Matrix([[(1-x)**3*(3+x),4*x*(1-x**2),-2*(1-x**2)*(3-x)],
          [4*x*(1-x**2),-(1+x)**3*(3-x),2*(1-x**2)*(3+x)],
          [-2*(1-x**2)*(3-x),2*(1-x**2)*(3+x),16*x]])
M

Out[142]:

$$left[begin{matrix}left(- x + 1right)^{3} left(x + 3right) & 4 x left(- x^{2} + 1right) & left(- x + 3right) left(2 x^{2} — 2right)\4 x left(- x^{2} + 1right) & — left(- x + 3right) left(x + 1right)^{3} & left(x + 3right) left(- 2 x^{2} + 2right)\left(- x + 3right) left(2 x^{2} — 2right) & left(x + 3right) left(- 2 x^{2} + 2right) & 16 xend{matrix}right]$$

Значит, у этой матрицы есть нулевое подпространство (она обращает векторы из этого подпространства в 0). Базис этого подпространства.

Out[145]:

$$left[begin{matrix}- frac{2}{x — 1}\frac{2}{x + 1}\1end{matrix}right]$$

Out[146]:

$$left[begin{matrix}0\0\0end{matrix}right]$$

Собственные значения и их кратности.

Out[147]:

$$left { 0 : 1, quad — left(x^{2} + 3right)^{2} : 1, quad left(x^{2} + 3right)^{2} : 1right }$$

Если нужны не только собственные значения, но и собственные векторы, то нужно использовать метод eigenvects. Он возвращает список кортежей. В каждом из них нулевой элемент — собственное значение, первый — его кратность, и последний — список собственных векторов, образующих базис (их столько, какова кратность).

In [149]:

for i in range(len(v)):
    v[i][2][0]=simplify(v[i][2][0])
v

Out[149]:

$$left [ left ( 0, quad 1, quad left [ left[begin{matrix}- frac{2}{x — 1}\frac{2}{x + 1}\1end{matrix}right]right ]right ), quad left ( — left(x^{2} + 3right)^{2}, quad 1, quad left [ left[begin{matrix}frac{x}{2} + frac{1}{2}\frac{x + 1}{x — 1}\1end{matrix}right]right ]right ), quad left ( left(x^{2} + 3right)^{2}, quad 1, quad left [ left[begin{matrix}frac{x — 1}{x + 1}\- frac{x}{2} + frac{1}{2}\1end{matrix}right]right ]right )right ]$$

In [150]:

for i in range(len(v)):
    z=M*v[i][2][0]-v[i][0]*v[i][2][0]
    pprint(simplify(z))
⎡0⎤
⎢ ⎥
⎢0⎥
⎢ ⎥
⎣0⎦
⎡0⎤
⎢ ⎥
⎢0⎥
⎢ ⎥
⎣0⎦
⎡0⎤
⎢ ⎥
⎢0⎥
⎢ ⎥
⎣0⎦

Жорданова нормальная форма¶

In [151]:

M=Matrix([[Rational(13,9),-Rational(2,9),Rational(1,3),Rational(4,9),Rational(2,3)],
          [-Rational(2,9),Rational(10,9),Rational(2,15),-Rational(2,9),-Rational(11,15)],
          [Rational(1,5),-Rational(2,5),Rational(41,25),-Rational(2,5),Rational(12,25)],
          [Rational(4,9),-Rational(2,9),Rational(14,15),Rational(13,9),-Rational(2,15)],
          [-Rational(4,15),Rational(8,15),Rational(12,25),Rational(8,15),Rational(34,25)]])
M

Out[151]:

$$left[begin{matrix}frac{13}{9} & — frac{2}{9} & frac{1}{3} & frac{4}{9} & frac{2}{3}\- frac{2}{9} & frac{10}{9} & frac{2}{15} & — frac{2}{9} & — frac{11}{15}\frac{1}{5} & — frac{2}{5} & frac{41}{25} & — frac{2}{5} & frac{12}{25}\frac{4}{9} & — frac{2}{9} & frac{14}{15} & frac{13}{9} & — frac{2}{15}\- frac{4}{15} & frac{8}{15} & frac{12}{25} & frac{8}{15} & frac{34}{25}end{matrix}right]$$

Метод M.jordan_form() возвращает пару матриц, матрицу преобразования $P$ и собственно жорданову форму $J$: $M = P J P^{-1}$.

Out[152]:

$$left[begin{matrix}1 & 0 & 0 & 0 & 0\0 & 2 & 1 & 0 & 0\0 & 0 & 2 & 0 & 0\0 & 0 & 0 & 1 — i & 0\0 & 0 & 0 & 0 & 1 + iend{matrix}right]$$

Out[153]:

$$left[begin{matrix}-2 & frac{10}{9} & 0 & frac{5 i}{12} & — frac{5 i}{12}\-2 & — frac{5}{9} & 0 & — frac{5 i}{6} & frac{5 i}{6}\0 & 0 & frac{4}{3} & — frac{3}{4} & — frac{3}{4}\1 & frac{10}{9} & 0 & — frac{5 i}{6} & frac{5 i}{6}\0 & 0 & 1 & 1 & 1end{matrix}right]$$

In [154]:

Z=P*J*P**(-1)-M
simplify(Z)

Out[154]:

$$left[begin{matrix}0 & 0 & 0 & 0 & 0\0 & 0 & 0 & 0 & 0\0 & 0 & 0 & 0 & 0\0 & 0 & 0 & 0 & 0\0 & 0 & 0 & 0 & 0end{matrix}right]$$

Графики¶

SymPy использует matplotlib. Однако он распределяет точки по $x$ адаптивно, а не равномерно.

In [156]:

plot(sin(x)/x,(x,-10,10))

Out[156]:

<sympy.plotting.plot.Plot at 0xaf83218c>

In [157]:

plot(x,x**2,x**3,(x,0,2))

Out[157]:

<sympy.plotting.plot.Plot at 0xb14ab02c>

Другие функции надо импортировать из пакета sympy.plotting.

In [158]:

from sympy.plotting import (plot_parametric,plot_implicit,
                            plot3d,plot3d_parametric_line,
                            plot3d_parametric_surface)

Параметрический график — фигура Лиссажу.

In [159]:

t=Symbol('t')
plot_parametric(sin(2*t),cos(3*t),(t,0,2*pi),
                title='Lissajous',xlabel='x',ylabel='y')

Out[159]:

<sympy.plotting.plot.Plot at 0xaf6a188c>

Неявный график — окружность.

In [160]:

plot_implicit(x**2+y**2-1,(x,-1,1),(y,-1,1))

Out[160]:

<sympy.plotting.plot.Plot at 0xaf71c9cc>

Поверхность. Если она строится не inline, а в отдельном окне, то её можно вертеть мышкой.

In [161]:

plot3d(x*y,(x,-2,2),(y,-2,2))

Out[161]:

<sympy.plotting.plot.Plot at 0xaf6bea8c>

In [162]:

plot3d(x**2+y**2,x*y,(x,-2,2),(y,-2,2))

Out[162]:

<sympy.plotting.plot.Plot at 0xaf64c36c>

Параметрическая пространственная линия — спираль.

In [163]:

a=0.1
plot3d_parametric_line(cos(t),sin(t),a*t,(t,0,4*pi))

Out[163]:

<sympy.plotting.plot.Plot at 0xaf714c0c>

Параметрическая поверхность — тор.

In [164]:

u,v=symbols('u v')
a=0.3
plot3d_parametric_surface((1+a*cos(u))*cos(v),
                          (1+a*cos(u))*sin(v),a*sin(u),
                          (u,0,2*pi),(v,0,2*pi))

Out[164]:

<sympy.plotting.plot.Plot at 0xaf646cac>

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

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

ах2+bх+с=0

Здесь «x» неизвестное, которое вы должны найти, «a», «b», «c» задает числа, такие что «a» не равно 0. Если a = 0, то уравнение становится линейным, а не квадратным. В уравнении a, b и c называются коэффициентами.

Возьмем пример решения квадратного уравнения 8x2 + 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 {0} and {1}'.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() мы вычислили два решения и распечатали результат.

Второй метод

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

Вышеприведенная формула состоит из следующих случаев.

  • Если b2 < 4ac, то корни комплексные (не вещественные). Например – x2 + x + 1, корни -0,5 + i1,73205 и +0,5 – i1,73205.
  • Если b2 == 4ac, то оба корня одинаковы. Например – x2 + x + 1, корни равны -0,5 + i1,73205 и +0,5 – i1,73205.
  • Если b2 > 4ac, то корни действительны и различны. Например – х2 – 7 х – 12, корни 3 и 4.

Пример:

 
# 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.

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.

Библиотека Sympy: символьные вычисления в Python

Что такое SymPy ? Это библиотека символьной математики языка Python. Она является реальной альтернативой таким математическим пакетам как Mathematica или Maple и обладает очень простым и легко расширяемым кодом. SymPy написана исключительно на языке Python и не требует никаких сторонних библиотек.

Документацию и исходный код этой библиотеки можно найти на ее официальной странице.

Первые шаги с SymPy

Используем SymPy как обычный калькулятор

В библиотеке SymPy есть три встроенных численных типа данных: Real , Rational и Integer . С Real и Integer все понятно, а класс Rational представляет рациональное число как пару чисел: числитель и знаменатель рациональной дроби. Таким образом, Rational(1, 2) представляет собой 1/2 , а, например, Rational(5, 2) — соответственно 5/2 .

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

Как можно заметить, функция evalf() дает на выходе число с плавающей точкой.

В SymPy есть также класс, представляющий такое понятие в математике, как бесконечность. Он обозначается следующим образом: oo .

Символы

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

После их задания, с ними можно производить различные манипуляции.

С символами можно производить преобразования с использованием некоторых операторов языка Python. А именно, арифметических ( + , -` , «* , ** ) и логических ( & , | ,

Библиотека SymPy позволяет задавать форму вывода результатов на экран. Обычно мы используем формат такого вида:

Алгебраические преобразования

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

Раскрытие скобок

Чтобы раскрыть скобки в алгебраических выражениях, используйте следующий синтаксис:

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

Упрощение выражений

Если вы хотите привести выражение к более простому виду (возможно, сократить какие-то члены), то используйте функцию simplify .

Также надо сказать, что для определенных видов математических функций существуют альтернативные, более конкретные функции для упрощения выражений. Так, для упрощения степенных функций есть функция powsimp , для тригонометрических — trigsimp , а для логарифмических — logcombine , radsimp .

Вычисления

Вычисления пределов

Для вычисления пределов в SymPy предусмотрен очень простой синтаксис, а именно limit(function, variable, point) . Например, если вы хотите вычислить предел функции f(x) , где x -> 0 , то надо написать limit(f(x), x, 0) .

Также можно вычислять пределы, которые стремятся к бесконечности.

Дифференцирование

Для дифференцирования выражений в SymPy есть функция diff(func, var) . Ниже даны примеры ее работы.

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

tan 2 (?)+1 Результат тот же.

Также при помощи этой же функции могут быть вычислены производные более высоких порядков. Синтаксис функции будет следующим: diff(func, var, n) . Ниже приведено несколько примеров.

Разложение в ряд

Для разложения выражения в ряд Тейлора используется следующий синтаксис: series(expr, var) .

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

В SymPy реализована поддержка определенных и неопределенных интегралов при помощи функции integrate() . Интегрировать можно элементарные, трансцендентные и специальные функции. Интегрирование осуществляется с помощью расширенного алгоритма Риша-Нормана. Также используются различные эвристики и шаблоны. Вот примеры интегрирования элементарных функций:

Также несложно посчитать интеграл и от специальных функций. Возьмем, например, функцию Гаусса:

Результат вычисления можете посмотреть сами. Вот примеры вычисления определенных интегралов.

Также можно вычислять определенные интегралы с бесконечными пределами интегрирования (несобственные интегралы).

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

При помощи SymPy можно решать алгебраические уравнения с одной или несколькими переменными. Для этого используется функция solveset() .

Как можно заметить, первое выражение функции solveset() приравнивается к 0 и решается относительно х . Также возможно решать некоторые уравнения с трансцендентными функциями.

Системы линейных уравнений

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

Факторизация

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

Булевы уравнения

Также в SymPy реализована возможность решения булевых уравнений, что по сути означает проверку булевого выражения на истинность. Для этого используется функция satisfiable() .

Данный результат говорит нам о том, что выражение (x & y) будет истинным тогда и только тогда, когда x и y истинны. Если выражение не может быть истинным ни при каких значениях переменных, то функция вернет результат False .

Линейная алгебра

Матрицы

Матрицы в SymPy создаются как экземпляры класса Matrix :

В отличие от NumPy , мы можем использовать в матрицах символьные переменные:

И производить с ними разные манипуляции:

Дифференциальные уравнения

При помощи библиотеки SymPy можно решать некоторые обыкновенные дифференциальные уравнения. Для этого используется функция dsolve() . Для начала нам надо задать неопределенную функцию. Это можно сделать, передав параметр cls=Function в функцию symbols() .

Теперь f и g заданы как неопределенные функции. мы можем в этом убедиться, просто вызвав f(x) .

Теперь решим следующее дифференциальное уравнение:

Чтобы улучшить решаемость и помочь этой функции в поиске решения, можно передавать в нее определенные ключевые аргументы. Например, если мы видим, что это уравнение с разделяемыми переменными, то мы можем передать в функцию аргумент hint=’separable’ .

Английский для программистов

Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас

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

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

Найти корни квадратного уравнения

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

При его решении сначала вычисляют дискриминант по формуле

Если D > 0, то квадратное уравнение имеет два корня; если D = 0, то 1 корень; и если D

Примеры выполнения кода:

Обратим внимание, что для данной программы коэффициент a не должен быть равен нулю. Иначе в первой ветке условного оператора будет происходить попытка деления на 0.

Если a = 0 , то квадратное уравнение превращается в линейное, которое решается иным способом. Оно всегда имеет один корень.

источники:

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

http://younglinux.info/python/task/quadratic

Рассмотрим пример создания графического интерфейса (GUI) на Python. В качестве «жертвы» напишем простенькую программу — решатель квадратных уравнений. Наше задание мы разобъем на несколько частей.

Часть первая: функция решения квадратного уравнения.

Напомним, что квадратным является уравнение вида:

 ax2 + bx + c = 0

Есть несколько способов решить квадратное уравнение, мы выберем решение через дискриминант.

Формула дискриминанта:

D = b2 4ac.

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

x1,2 = (-b ± √D) ÷ (2a)

Если же дискриминант меньше нуля, то уравнение не имеет решений.

Превратим данные формулы в код:

def solver(a,b,c):
    """ Решает квадратное уравнение и выводит отформатированный ответ """
    # находим дискриминант
    D = b*b - 4*a*c
    if D >= 0:
        x1 = (-b + sqrt(D)) / (2*a)
        x2 = (-b - sqrt(D)) / (2*a)
        text = "The discriminant is: %s n X1 is: %s n X2 is: %s n" % (D, x1, x2)        
    else:
        text = "The discriminant is: %s n This equation has no solutions" % D 
    return text

Чтобы все работало не забудьте импортировать функцию sqrt из модуля math.

from math import sqrt

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

Теперь пора переходить к созданию графической оболочки для нашего приложения.

Часть вторая: создаем GUI для программы

Для простоты будем создавать GUI встроенными средствами Python, поэтому импортируем все из библиотеки Tkinter:

from Tkinter import *

В Python версии 3.х название модуля следует писать с маленькой буквы — tkinter.

Далее создаем само окно и размещаем на нем необходимые виджеты:

# родительский элемент
root = Tk()
# устанавливаем название окна
root.title("Quadratic calculator")
# устанавливаем минимальный размер окна 
root.minsize(325,230)
# выключаем возможность изменять окно
root.resizable(width=False, height=False)

# создаем рабочую область
frame = Frame(root)
frame.grid()

# поле для ввода первого аргумента уравнения (a)
a = Entry(frame, width=3)
a.grid(row=1,column=1,padx=(10,0))

# текст после первого аргумента
a_lab = Label(frame, text="x**2+").grid(row=1,column=2)

# поле для ввода второго аргумента уравнения (b)
b = Entry(frame, width=3)
b.grid(row=1,column=3)
# текст после второго аргумента
b_lab = Label(frame, text="x+").grid(row=1, column=4)

# поле для ввода третьего аргумента уравнения (с)
c = Entry(frame, width=3)
c.grid(row=1, column=5)
# текст после третьего аргумента
c_lab = Label(frame, text="= 0").grid(row=1, column=6)

# кнопка решить
but = Button(frame, text="Solve").grid(row=1, column=7, padx=(10,0))

# место для вывода решения уравнения
output = Text(frame, bg="lightblue", font="Arial 12", width=35, height=10)
output.grid(row=2, columnspan=8)

# запускаем главное окно
root.mainloop()

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

окно калькулятора квадратных уравнений с Python и Tkinter

Отлично, программа работает. Осталось объяснить Python как связать эти две части.

Часть третья: объединяем все воедино

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

Функция вставки информации:

def inserter(value):
    """ Inserts specified value into text widget """
    output.delete("0.0","end")
    output.insert("0.0",value) 

Функция inserter предельно проста: очищает поле для ввода и вставляет туда переданный ей аргумент value.

Напишем функцию обработки введенной информации. Назовем ее handler:

def handler():
    """ Get the content of entries and passes result to the output area """
    try:
        # make sure that we entered correct values
        a_val = float(a.get())
        b_val = float(b.get())
        c_val = float(c.get())
        inserter(solver(a_val, b_val, c_val))
    except ValueError:
        inserter("Make sure you entered 3 numbers")

В зависимости от данных введенных в поля для ввода передает функции inserter либо результат решения уравнения, либо сообщение о неверно введенных данных.

Чтобы все работало, следует изменить строку создания виджета Button следующим образом:

but = Button(frame, text="Solve", command=handler).grid(row=1, column=7, padx=(10,0))

Теперь можно спокойно пользоваться нашей программой:

Часть четвертая: необязательная

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

def clear(event):
    """ Clears entry form """
    caller = event.widget
    caller.delete("0", "end")

Таким образом мы очищаем виджет, вызвавший данную функцию. Чтобы все работало, добавьте следующие строки после создания виджетов, но до размещения. Например, после строки a = Entry(… , но до строки a.grid(…

a.bind("<FocusIn>", clear)
b.bind("<FocusIn>", clear)
c.bind("<FocusIn>", clear)

Готово. Программа работает, Вы великолепны!

Исходный код калькулятора квадратных уравнений с GUI на GitHub

Перейти к содержанию

На чтение 2 мин Просмотров 51 Опубликовано 28.02.2023

Содержание

  1. Введение
  2. Решение квадратных уравнений в Python
  3. Заключение

Введение

В ходе статьи научимся решать квадратные уравнения при помощи языка программирования Python.

Решение квадратных уравнений в Python

Для написания кода нам понадобится метод sqrt() из модуля math, который возвращает квадратный корень числа. Импортируем его:

Теперь дадим пользователю возможность ввести коэффициенты a, b и c:

from math import sqrt

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

Вычислим дискриминант по формуле:

from math import sqrt

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

d = b**2 - 4 * a * c

Перейдём к нахождению корней. Зададим условие, что если дискриминант больше нуля, то x1 и x2 будут высчитаны по формуле:

x1, x2 = frac{-bpmsqrt{D}}{2a}
from math import sqrt

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

d = b**2 - 4 * a * c

if d > 0:
    x1 = (-b + sqrt(d) / (2 * a))
    x2 = (-b - sqrt(d) / (2 * a))
    print(f'x1 = {x1:.2f}; x2 = {x2:.2f}')

Если же дискриминант равен нулю, то будет всего один корень по формуле:

from math import sqrt

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

d = b**2 - 4 * a * c

if d > 0:
    x1 = (-b + sqrt(d) / (2 * a))
    x2 = (-b - sqrt(d) / (2 * a))
    print(f'x1 = {x1:.2f}; x2 = {x2:.2f}')
elif d == 0:
    x1 = -b / (2 * a)
    print(f'x1 = {x1:.2f}')

Если же дискриминант оказался отрицательным, это означает что корней нет:

from math import sqrt

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

d = b**2 - 4 * a * c

if d > 0:
    x1 = (-b + sqrt(d) / (2 * a))
    x2 = (-b - sqrt(d) / (2 * a))
    print(f'x1 = {x1:.2f}; x2 = {x2:.2f}')
elif d == 0:
    x1 = -b / (2 * a)
    print(f'x1 = {x1:.2f}')
else:
    print('Нет корней')

Заключение

В ходе статьи мы с Вами написали небольшую программку на языке программирования Python, которая умеет решать квадратные уравнения. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin

Найти корни квадратного уравнения

Вычислить корни квадратного уравнения,
коэффициенты a, b, c которого вводятся с клавиатуры.

Решение задачи на языке программирования Python

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

ax2 + bx + c = 0

При его решении сначала вычисляют дискриминант по формуле

D = b2 - 4ac

Если D > 0, то квадратное уравнение имеет два корня; если D = 0, то 1 корень; и если D < 0, то делают вывод, что корней нет.

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

Функция 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, то квадратное уравнение превращается в линейное, которое решается иным способом. Оно всегда имеет один корень.

Больше задач в PDF

Понравилась статья? Поделить с друзьями:
  • Как написать программу для распознавания речи
  • Как написать программу на пайтон
  • Как написать программу для проекта
  • Как написать программу на ноутбуке
  • Как написать программу для подборов паролей