Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
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 –
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]