Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие
.pdf
41
from sympy import *
from sympy.abc import *
y=exp(x**2);y1=exp(x**2).series(x,0,5).removeO()
y2=exp(x**2).series(x,0,8).removeO()
p1=plot(y,y1,(x,0,1),legend=True,
show=False)
p1[0].line_color = 'red'
p2=plot(y,y2,(x,0,1),legend=True,
show=False)
p2[0].line_color = 'red'
PlotGrid(1,2,p1,p2)
Рис. 1.4. Аппроксимация функции y = e2x рядами Тейлора с разным
количеством слагаемых
Краткий комментарий к программе. Задаем исходную функ-
цию y = e2x. Разлагаем функцию в многочлен со старшей степенью 4,
чтобы получилось три слагаемых, и убираем остаточный член ряда –
это переменная y1. В функции series третьим параметром указываем
число 5. Если параметру присвоить значение 4, то третье слагаемое
в сумму не войдет. Формируем аналогичную сумму с четырьмя слагаемыми – переменная y2. Создаем объекты класса Plot p1 и p2. Первый
(p1) для построения графиков функций y и y1. Аргументом является х,
принимающий значения от 0 до 1. В качестве легенды будут выведены
уравнения кривых. График пока не выводим (show=False). Аналогично
создаем объект p2. Задаем красный цвет у кривой y = e2x на обоих

42
графиках. Разбиваем графическое окно на два подокна и в каждом из
них строим свой график.
Еще один пример на разложение в ряд Тейлора функции
from sympy import *
from sympy.abc import *
(1/(x**2+y**2)).series(x,0,8)
1 . 8 . В ы ч и с л е н и е суммы ч л е н о в р я д а
Для вычисления суммы членов ряда используется функция summation(f, (i, a, b)). Она вычисляет сумму слагаемых f с индексом i, кото-
рый изменяется от a до b.
Пример 1.19. Вычислить сумму ряда
1
1
.
( 1)( 2)
n
n n n
=
++
Решение:
from sympy import *
from sympy.abc import *
r=summation(1/(x*(x+1)*(x+2))**(1/2),(x,1,oo))
r.n(8)
Третья строчка кода дает нам запись суммы ряда
Применив метод .n(), получаем ответ: 1.6875124.
В IDLE результат будет выглядеть скромнее:
>>> r
Sum(1/(x**0.5*(x + 1)**0.5*(x + 2)**0.5), (x, 1, oo))
Пример 1.20. Вычислить
01
.
mn
ni
i
==

43
Решение:
from sympy import *
from sympy.abc import *
summation(x,(x,1,n),(n,0,m))
Пояснение. Первое суммирование summation(x,(x,0,n)) дает
( 1)
,
2
nn+
второе –
0
( 1)
.
2
m
n
nn
=
+
Окончательно получаем
1 . 9 . Р е ш е н и е а л г е б р а и ч е с к и х у р а в н е н и й
и н е р а в е н с т в
Алгебраическим уравнением с одним неизвестным называется
уравнение, которое можно представить в виде
1
01
... 0,
nn
n
a x a x a
−
+ + + =
где n – натуральное число. Известно, что это уравнение имеет n корней,
действительных или комплексно-сопряженных. Для решения алгебраических уравнений в модуле solvers библиотеки Sympy есть функции
roots(), solveset() и solve(). Функция roots() позволяет найти все корни
такого уравнения с указанием кратности корня, если уравнение имеет
кратные корни. У этой функции несколько аргументов. Основными являются первые два: левая часть уравнения, которое необходимо решить, и переменная, относительно которой нужно решить уравнение.
Поскольку символы = и == в Python определены как символы присваивания и равенства соответственно, их нельзя использовать для создания символьных уравнений. Для этого в SymPy предназначена функ-
ция Eq(). Рассмотрим, как можно создать уравнение
23
35х х х− + =
:
from sympy import *
from sympy.abc import *
Eq(x**2-3*x+5,x**3)
Результат:

44
Конечно, можно было бы создать это уравнение и таким образом:
Eq(x**2-3*x+5-x**3,0)
Результат:
32
– 3 5 0х х х− + + =
.
Пример 1.21. С помощью функции roots() решить уравнение
5 4 3 2
24 40 16 48 0.x x x x x+ − + + − =
Решение:
from sympy import *
from sympy.abc import *
y=x**5+x**4-24*x**3+40*x**2+16*x-48
roots(y,x)
У уравнения пять корней, один из которых – кратный:
{-6: 1, -1: 1, 2: 3}
Рассмотрим на примерах работу двух остальных функций.
Пример 1.22. Решить уравнение
32
3 15 10 0x x x− − − =
с помощью
функции solveset().
Решение:
from sympy import *
from sympy.abc import *
y=Eq(x**3-3*x**2-15*x-10,0)
solveset(y, x)
Получаем три разных действительных корня
С помощью метода n() ответ можно получить в виде десятичной
дроби с заданным числом знаков после запятой: solveset(y, x).n(5). В результате имеем {−2.0,−0.8541,5.8541}. Вместо двух последних строк кода
можно было обойтись одной, записав solveset(Eq(x**3-3*x**2-15*x-10,0), x).
Пример 1.23. Решить уравнение
Решение:
from sympy import *
from sympy.abc import *
solveset(Eq(x**5+x**4-24*x**3+40*x**2+16*x,48), x)
Результат: {−6,−1,2}. На экран выведены только разные корни
уравнения без указания кратности, хотя корень х = 2 имеет кратность 3.

45
Пример 1.24. Решить уравнение
32
4 6 24 0.x x x− + − =
Решение:
from sympy import *
from sympy.abc import *
solveset(Eq(x**3-4*x**2+6*x-24,0), x)
В результате получаем три корня, из которых только один действительный. i означает
1:−
{4,−6i,6i}
Если нам нужны только действительные корни, необходимо задать параметр domain:
from sympy import *
from sympy.abc import *
y=Eq(x**3-4*x**2+6*x-24,0);solveset(y, x, Reals) # {4}
Алгебраическое уравнение можно решить и с помощью функции
solve(), имеющей схожий синтаксис. Примеры ее применения:
from sympy import *
from sympy.abc import *
y=solve(Eq(x**5+x**4-24*x**3+40*x**2+16*x,48), x)
Результат получится в виде списка [-6, -1, 2], над элементами кото-
рого можно производить различные операции, например y[2]**2 # (4),
sin(y[2]).n(2) # 0.91.
Чтобы получить ответ в виде списка словарей, можно задать
в функции solve() параметр dict=True:
solve(Eq(x**5+x**4-24*x**3+40*x**2+16*x,48), x,dict=True)
Результат: [{x: -6}, {x: -1}, {x: 2}].
С помощью функций solve() и solveset() можно решать неравенства.
Пример 1.25. Решить неравенство
3
4 6 24 0.xx+ −
Решение:
from sympy import *
from sympy.abc import *
y=4*x**3+6*x-24;solveset(y>0, x, Reals)

46
Иногда с помощью функции solve() удается решить систему алгебраических неравенств.
Пример 1.26. Решить систему неравенств
2
2
4 6 24 0
.
5
хх
xx
+ −
−
Решение:
from sympy import *
from sympy.abc import *
solve([4*x**2+6*x-24>0, x**2-x<=5])
В ответе могут быть использованы логические символы для оператора «и» или «или».
С помощью функции solve() в некоторых случаях можно решить
и систему нелинейных неравенств. Рассмотрим это на примере.
Пример 1.27. Найти интервал возрастания функции y=x-sin(x).
Решение. Интервалом возрастания функции y будет интервал, на
котором производная функции
0:y
from sympy import *
from sympy.abc import *
solve([(x-sin(2*x)).diff()>0])
Результат:
Проверим это, построив график функции y на отрезке [0, 7].
Добавляем строку кода:
plot(x-sin(2*x),(x,0,7))

Рис. 1.5. График функции y = x – sin(x)
( ) &x y x
( )&x y x
3 2 8
2 12
.
2 4 15
3 2 6 20
x y t
x y z t
x z t
x y z t
− + =
+ + + =
− + + = −
− + + =
Таким образом, мы нашли только один из интервалов возрастания.
Покажем, как решаются булевы уравнения.
Пример 1.28. Определить, при каких значениях x и y выраже-
ние
примет значение «истина».
Решение:
from sympy import *
from sympy.abc import *
satisfiable((x or y) and x )
Результат. {x: True}, т. е. выражение
значение «истина» при x=True.
1 . 1 0 . Р е ш е н и е с и с т е м л и н е й н ы х у р а в н е н и й
Систему линейных уравнений можно решить с помощью функций solve(), solveset() и linsolve().
Пример 1.29. Решить систему линейных уравнений
принимает
47

48
Приведем решение этой системы несколькими способами.
Во всех случаях нужно преобразовать каждое уравнение так, чтобы
в правой части уравнения стоял ноль.
Решение с помощью функции solve():
from sympy import solve, symbols
x, y, z, t = symbols('x,y,z,t')
solve([3*x-y+2*t-8, x+2*y+z+t-12,
-2*x+z+4*t+15, 3*x-2*y+z+6*t-20], [x, y, z, t])
Результат получаем в виде словаря
{t: -214/17, x: 105/17, y: -249/17, z: 811/17}
Решение с помощью функции linsolve():
from sympy import *
x, y, z, t = symbols('x,y,z,t')
linsolve([3*x-y+2*t-8, x+2*y+z+t-12,
-2*x+z+4*t+15, 3*x-2*y+z+6*t-20], [x, y, z, t])
Результат получаем в виде кортежа
Решение с помощью функции linsolve() с аргументами-матрицами:
from sympy import *
a = Matrix([[3, -1, 0, 2], [1, 2, 1 ,1],[-2,0,1,4],[3,-2,1,6]])
b = Matrix([8, 12, -15, 20]);linsolve([a, b])
Результат тот же, что и в предыдущем способе.
Решение матричного уравнения Ax=b:
Решением уравнения будет вектор-столбец x=bA-1:
from sympy import *
a = Matrix([[3, -1, 0, 2], [1, 2, 1 ,1],[-2,0,1,4],[3,-2,1,6]])
b = Matrix([8, 12, -15, 20]);
inv_quick(a)*b
Решение можно найти и таким образом: a**(-1)*b. В обоих слу-
чаях результатом будет массив
105
17
249
17
811
17
214
17
−
−
.

Можно получить в ответе строку (inv_quick(a)*b).T.
4
5 17.
x
x e x− + =
4
5 17:
x
y x e x= − + −
4
5 17
x
y x e x= − + −
В этом методе решения ответ можно получить в виде вектора,
т. е. в виде матрицы с одной строкой и четырьмя столбцами, состоящего
из десятичных чисел:
u=(inv_quick(a)*b).T.n(5) # [6.1765−14.64747.706−12.588].
1.11. Р е ш е н и е н е л и н е й н ы х у р а в н е н и й и с и с т е м
н е л и н е й н ы х у р а в н е н и й
Для решения нелинейных уравнений предназначена функция
nsolve(). В ней в качестве одного из параметров нужно задать начальное
приближение.
Пример 1.30. Найти корни уравнения
Решение:
from sympy import *
x = symbols('x')
nsolve(x**4-exp(x)+5*x-17,x,1)
Начальное приближение (1) было выбрано произвольно.
Результат: 1.94344404526151.
Для выбора начального приближения можно построить график
функции
from sympy import *
x = symbols('x');
plot(x**4-exp(x)+5*x-17,(x,-3,3),legend=True)
Рис. 1.6. График функции
49

Из графика видно, что уравнение на данном отрезке имеет два
2
4
.
2
x xy
x xy
+=
−=
2
4 27
,
sin 2
y
x e x
x xy
+ − =
−=
( )
,
корня. Найдем второй корень уравнения, взяв другое начальное приближение, например число -2:
from sympy import *
x = symbols('x');nsolve(x**4-exp(x)+5*x-17,x,-2)
Результат: −2.31393655644989.
Для решения системы нелинейных уравнений предназначена
функция nonlinsolve(). К сожалению, с ее помощью можно решить
очень немногие системы уравнений, что и подтверждают примеры,
приведенные в справке по этой функции.
Пример 1.31. Решить систему нелинейных уравнений
Решение:
from sympy import *
x, y = symbols('x y')
nonlinsolve([x**2 + x*y-4, x – x*y-2], [x, y])
Попытка решить с помощью этой функции более сложную си-
стему уравнений, например,
зультата:
from sympy import *
x, y = symbols('x y',real=True)
nonlinsolve([x**2 + exp(y)-4*x-27], [sin(x)- x*y-2], [x, y])
Результат:
А между тем система имеет решения, которые можно увидеть на
.
не дает желаемого ре-
графике (рис. 1.7).
щью функции nsolve(), однако тут многое будет зависеть от удачно подобранного начального приближения (последний параметр функции
nsolve() в приведенном коде).
Решить систему нелинейных уравнений в SymPy можно с помо-
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
