Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие
.pdf
51
Рис. 1.7. Графическое решение системы уравнений
2
4 27
sin 2
y
x e x
x xy
+ − =
−=
Пример 1.32. Решить систему нелинейных уравнений
2
2
2 5* 1 0
.
3lg
x xy x
x x y
− − + =
+=
Решение:
from sympy import *
x, y = symbols('x y')
nsolve([2*x**2-x*y-5*x+1,x+3*log(x,10)-y**2],[x,y],[2,2])
Результат:
Следует заметить, что попытка решить задачу при начальном
приближении, например [1, 1], приводит к следующему результату:
ValueError: Could not find root within given tolerance.
(0.496165651854599672285 > 2.16840434497100886801e-19) Try another
starting point or tweak arguments.
Проблему выбора начального приближения может решить графическое решение данной системы, полученное с помощью функции
SymPy plotimplicit().
Код для построения графиков кривых:
from sympy import *
x, y = symbols('x y')
p1 = plot_implicit(Eq(2*x**2-x*y-5*x+1,0),

52
(x, -2, 5), adaptive=False,show=False)
p2=plot_implicit(Eq(x+3*log(x,10)-y**2,0),
(x, .5, 5),adaptive=False,show=False,line_color='red')
p1.append(p2[0]);p1.show()
В результате получаем графическое решение (рис. 1.8).
Рис. 1.8. Графическое решение системы нелинейных уравнений
Графики помогли увидеть еще одно решение системы уравнений:
x = 1.5, y = -1. Это решение – приближенное. Уточним его:
from sympy import *
x, y = symbols('x y')
nsolve([2*x**2-x*y-5*x+1,x+3*log(x,10)-y**2],
[x,y],[1.5,-1])
Результат:
1.45889023015218
1.39676700918162
−
Решим теперь систему уравнений
2
4 27
:
sin 2
y
x e x
x xy
+ − =
−=
from sympy import *
x, y = symbols('x y')
nsolve([x**2 + exp(y)-4*x-27, sin(x)- x*y-2], [x, y],[-3,0])
Результат:
3.41679492271775
0.505812739361005
−
.
Вывод. Функция nsolve() гораздо лучше приспособлена для реше-
ния систем нелинейных уравнений.

53
1.12. Р е ш е н и е д и ф ф е р е н ц и а л ь н ы х у р а в н е н и й
и с и с т е м д и ф ф е р е н ц и а л ь н ы х у р а в н е н и й
Обыкновенным дифференциальным уравнением (ОДУ) по-
рядка n называется уравнение вида
()
( , ( ), ( ), ( ),..., ( )) 0,
n
F x y x y x y x y x
=
где n – порядок наивысшей производной, входящей в уравнение. Это
неявная форма записи дифференциального уравнения. В каноническом
виде дифференциальное уравнение записывается в виде
( ) ( 1)
( ) ( , ( ), ( ), ( ),..., ( )).
nn
y x f x y x y x y x y x
−
=
Под интегрированием уравне-
ния понимают нахождение функции y(x), которая удовлетворяет этому
уравнению. y(x) называется решением дифференциального уравнения.
Общее решение ОДУ n-го порядка имеет вид
12
( , , ,..., ),
n
y y x c c c=
где с1,
с
2
, … , сn – произвольные константы. Дифференциальные уравнения
имеют бесчисленное множество решений, отличающихся друг от друга
набором констант. Для того чтобы выделить среди бесчисленного множества решений единственное решение, необходимо задать начальные
и/или граничные условия. Количество таких условий должно совпадать
с порядком дифференциального уравнения. В зависимости от вида этих
дополнительных условий различают задачу Коши и краевую задачу.
Для дифференциального уравнения первого порядка задача Коши ставится следующим образом: найти решение дифференциального уравнения
( , )y f x y
=
, проходящее через точку с координатами (x0, y0), где x0
и y0 – некоторые заданные числа
00
( , )
()
y f x y
y x y
=
=
. Задача Коши для диффе-
ренциального уравнения порядка n есть задача о нахождении частного
решения, удовлетворяющего начальным условиям
0 0 0 0
( ) , ( ) ,...,y x y y x y
==
( 1) ( 1)
00
( ) .
nn
y x y
−−
=
Здесь
( 1)
0 0 0
, ,...,
n
y y y
−
– некоторые
заданные числа. Графическое изображение частного решения называют
интегральной кривой. Общее решение дифференциального уравнения
n-го порядка определяет n-параметрическое семейство интегральных
кривых.
Функция dsolve() SymPy позволяет (но далеко не всегда) получить
общее решение обыкновенного дифференциального уравнения n-го порядка. Синтаксис этой функции: dsolve(eq, func=None, hint='default',
simplify=True, ics=None, xi=None, eta=None, x0=0, n=6, **kwargs).
Рассмотрим работу с этой функцией на примерах.

54
Пример 1.33. Найти общее решение ОДУ второго порядка
2 10 0.y y y
− + =
Решение. Первое, что нужно сделать, – это создать функцию – эк-
земпляр класса Function. Это можно сделать разными способами, например передав cls=Function в функцию symbols: symbols('f', cls=Function).
Можно это сделать и так: f=Function('f'). После набора кода
from sympy import Function
f=Function('f');type(f)
получаем sympy.core.function.UndefinedFunction, т. е. f принадлежит
к классу неопределенных функций. Далее создаем объект Eq, соответствующий нашему дифференциальному уравнению t=Eq(f(x).diff(x,2)-
-2*f(x).diff(x)+10*f(x),0). Если теперь вывести на экран значение t, получаем математическую запись нашего дифференциального уравнения:
2
2
10 ( ) 2 ( ) ( ) 0
dd
f x f x f x
dx
dx
− + =
. Теперь нужно применить функцию
dsolve() для решения сформированного дифференциального уравнения.
Результатом работы функции будет объект типа Eq. Окончательно код
выглядит таким образом:
from sympy import dsolve, symbols, Function, Eq
x= symbols('x');f=Function('f')
t=Eq(f(x).diff(x,2)-2*f(x).diff(x)+10*f(x),0);dsolve(t,f(x))
Получившееся решение дифференциального уравнения:
( )
12
( ) sin(3 ) cos(3 )
x
f x C x C x e=+
.
Можно проверить правильность полученного решения, добавив к коду
следующие строки:
t=y.rhs
z=diff(t,x,2)-2*diff(t,x)+10*t;simplify(z)
y.rhs (right hand side) возвращает правую часть нашего уравнения
( )
12
sin(3 ) cos(3 )
x
C x C x e+
в виде объекта, пригодного для
дифференцирования. Далее подставляем решение в наше
дифференциальное уравнение и приводим подобные. Результат – ноль,
что и требовалось доказать.
Покажем теперь, как можно решить задачу Коши для нашего
дифференциального уравнения, задав, например, два таких условия:
(0) 3, (0) 1.yy
==
Из всего множества решений нужно так подобрать С1
и С2, чтобы в точке х = 0 выполнялись начальные условия

55
(0) 3, (0) 1.yy
==
Сведем задачу к решению системы двух линейных
уравнений с двумя неизвестными:
(0) 3
,
(0) 1
f
f
=
=
где f(x) – полученное ре-
шение. Добавляем к коду строки:
y0=t.subs({x:0})-3 # значение функции в точке 0
y01=diff(t,x).subs({x:0})-1 # значение производной в точке 0
C1,C2=symbols(" C1,C2")
sol_const=solve([y0,y01],[C1,C2]);sol_const
Решение:{C1: -2/3, C2: 3}.
Ответ. Результатом решения задачи Коши для данного уравнения
является функция
2
sin3 3cos3 .
3
x
x x e
−+
Построим график полученной
интегральной кривой на отрезке [-3, 1]. Дописываем строки кода:
w=t.subs(sol_const)
plot(w,(x,-3,1),legend=True)
Рис. 1.9. Графическое решение задачи Коши
Покажем, как можно решить краевую задачу, когда условия заданы на концах отрезка.

56
Пример 1.34. Решить краевую задачу
5 4 8
(0) 1 .
(ln2) 7
y y y
y
y
− + =
=
=
Код программы:
from sympy import *
x= symbols('x')
f=Function('f')
t=Eq(f(x).diff(x,2)-5*f(x).diff(x)+4*f(x),8)
y=dsolve(t,f(x));t=y.rhs
y0=t.subs({x:0})-1;
y01=t.subs({x:log(2)})-7
C1,C2=symbols(" C1,C2")
sol_const=solve([y0,y01],[C1,C2])
w=t.subs(sol_const)
plot(w,(x,0,log(2)),legend=True)
Рис. 1.10. Графическое решение примера 1.34
В краевой задаче условия могут быть заданы для производных.
Рассмотрим решение краевой задачи.
Пример 1.35. Решить краевую задачу
4
34
23
(0) (0) 0.6 .
(1) (1) 4
х
y y y е
yy
y y e e
− − =
−=
+ = +

57
Решение:
from sympy import *
x= symbols('x')
f=Function('f')
t=Eq(f(x).diff(x,2)-2*f(x).diff(x)-3*f(x),exp(4*x))
y=dsolve(t,f(x))
t=y.rhs
y0=diff(t,x).subs({x:0})-t.subs({x:0})-.6
y01=diff(t,x).subs({x:1})+t.subs({x:1})-4*exp(3)-exp(4)
C1,C2=symbols(" C1,C2")
sol_const=solve([y0,y01],[C1,C2])
w=t.subs(sol_const)
plot(w,(x,0,1),legend=True)
Общее решение (переменная y):
4
3
12
()
5
x
xx
e
f x C e C e
−
= + +
. Решение
краевой задачи: (переменная w)
4
3
.
5
x
xx
e
ee
−
++
Рис. 1.11. Графическое решение примера 1.35
При решении задач мы ограничились двумя параметрами функ-
ции dsolve(). Рассмотрим некоторые другие параметры этой функции.
hint – подсказка. С помощью нее можно задать метод решения задачи.
Например, если известно, что уравнение является уравнением с разделяющимися переменными, можно указать hint='separable'. Параметр sim-
plify позволяет упростить результат. ics – набор начальных/граничных

58
условий для дифференциального уравнения. Он должен быть задан
в виде ''{f(x0): x1, f(x).diff(x).subs(x, x2): x3}'' и т. д.
Покажем, как можно решить задачу Коши для системы двух диф-
ференциальных уравнений первого порядка на примере.
Пример 1.36. Решить задачу Коши
2 ( ) 4 ( )
( ) 3 ( )
.
(0) 3
(0) 0
dx
x t y t
dt
dy
x t y t
dt
x
y
= − +
= − +
=
=
Код программы:
from sympy import *
t=symbols('t')
y1=Function('y1')
y2=Function('y2')
eqs=(Eq(y1(t).diff(t),-2*y1(t)+4*y2(t)), Eq(y2(t).diff(t),-
y1(t)+3*y2(t)))
s=dsolve(eqs) # Общее решение
display(s)
y1g=s[0].args[1]
y2g=s[1].args[1]
# Находим C1 и C2
sol=solve([y1g.subs(t,0)-3,y2g.subs(t,0)-0])
display(sol)
y1=y1g.subs(sol)
y2=y2g.subs(sol)
y11=simplify(y1)
y12=simplify(y2)
display(y11)
display(y12)
Комментарий к программе. Объявляем переменную t символь-
ной, а переменные y1 (x(t)) и y2 (y(t)) – функциями. Определяем два
уравнения. Eq(y1(t).diff(t),-2*y1(t)+4*y2(t) эквивалентно первому урав-
нению
2 ( ) 4 ( )
dx
x t y t
dt
= − +
, Eq(y2(t).diff(t),-y1(t)+3*y2(t)) эквивалентно
второму уравнению
( ) 3 ( )
dy
x t y t
dt
= − +
. Переменная eqs задает систему
уравнений, которую решаем с помощью функции dsolve(). Если

59
вывести на экран s, получим общее решение системы дифференциальных уравнений:
[Eq(y1(t), 4*C1*exp(-t) + C2*exp(2*t)), Eq(y2(t), C1*exp(-t) +
+ C2*exp(2*t))]. s[0] – это найденное значение y1(t):
2
1 1 2
( ) 4
tt
y t C e C e
−
=+
Переменная y1g – это правая часть этого уравне-
ния, а именно
2
12
4.
tt
C e C e
−
+
Если вывести на экран s[0].args[0], то по-
лучим левую часть уравнения:
1
( ).yt
Аналогично s[1] – это найденное
значение y2(t):
2
2 1 2
()
tt
y t C e C e
−
=+
, y2g – это правая часть уравнения
2
12
tt
C e C e
−
+
. Решение задачи Коши находим из решения системы урав-
нений
1 (0) 3
.
2 (0) 0
yg
yg
=
=
Вывод на экран решения системы (переменная sol)
дает значения С1 и С2: {C1: 1, C2: -1}. Вывод y11 и y12 дает решение
задачи Коши:
3
(4 )
tt
ee
−
−
– это x(t), а
3
(1 )
tt
ee
−
−
– y(t).
Приведем графическое решение задачи на интервале [-1,3]:
p1=plot(y11,y12,(t,-1,.7),
legend=True,show=False)
p1[0].line_color = 'red'
p1[1].line_color = 'g'
p1.show()
Рис. 1.12. Графическое решение задачи Коши для системы двух
дифференциальных уравнений первого порядка

60
Систему дифференциальных уравнений можно решить и с помощью функции dsolve_system().
1 . 1 3 . Р а з л о ж е н и е ф у н к ц и и в р я д Ф у р ь е
Разложение функции f(х) в тригонометрический ряд Фурье предполагает представление функции на отрезке [a, b] в виде
∞
где L=b – a,
0
2 2 2 2 2
( ) , ( )cos , ( )sin .
b b b
nn
a a a
nx nx
a f x dx a f x dx b f x dx
L L L L L
= = =
Для разложения функции в ряд Фурье используют функцию
fourier_series(). Ее синтаксис: fourier_series(f, limits=None, finite=True).
Здесь f – функция, которую необходимо разложить в ряд Фурье; limits –
кортеж (sym, start, end), где sym – символьная переменная, по которой
производится разложение; [start, end] – отрезок, на котором функция
разлагается в ряд. По умолчанию предполагается отрезок [-π, π]. Можно
задать сдвиг (метод scalex()) и масштаб (метод shift()).
Пример 1.37. Разложить в ряд Фурье функцию y = x2 на отрезке [-π, π]. Вывести на экран 5 членов получившегося ряда.
Решение:
from sympy import *
from sympy.abc import x
from sympy.plotting import *
f = x**2
s = fourier_series(f, (x, -pi, pi))
s2 = s.truncate(n=5) # Задаем количество слагаемых
s2
Результат:
Получить значение свободного члена и остальные слагаемые
в виде списка можно таким образом: s.a0 дает
2
,
3
s.an –
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
