Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Символьные вычисления в Python. Основы работы с библиотекой SymPy. Учебно-методическое пособие
.pdf
3
7. ( ) ,[0,2]. 8. ( ) sin , [ , ]. 9. ( ) sin , [ , ].
32
xx
f x f x f x x
= = − = −
2
10. ( ) 2 , [ , ]. 11. ( ) 2 sin , [ , ]. 12. ( ) 1 ,[ , ].
2
x
f x x f x f x x
= − − = − − = + −
13. ( ) 2 1,[ 2,2]. 14. ( ) 2 1,[0,1]. 15. ( ) 2 ,[ 1,1].
x
f x x f x x f x= − − = + = −
16. ( ) , [ 1,1]. 17. ( ) 2 1,[0,3]. 18. ( ) 3 , [ 2,2].
xx
f x e f x x f x= − = − + = −
1
19. ( ) , [ 1,1]. 20. ( ) 2 1,[ 1,1]. 21. ( ) (1 ), [ 1,1].
2
22. ( ) sin( ),[ 1,1]. 23. ( ) 2 1,[ 1,1]. 24. ( ) sin , [ 1,1].
2
f x x f x ch x f x x x
f x x x f x sh x f x x
= − − = + − = − −
= − = + − = −
71

72
2 . П О С Т Р О Е Н И Е Г Р А Ф И К О В В S Y M P Y
Библиотека SymPy обладает весьма скромными возможностями
в области графики по сравнению с такими библиотеками, как Matplotlib
или Seaborn, однако часто и этих возможностей бывает достаточно для
несложной визуализации полученных в ней результатов.
Модуль Plotting библиотеки SymPy позволяет строить 2D- и 3D-графики, используя в качестве основы библиотеку Matplotlib. При отсутствии
Matplotlib в качестве базы можно использовать TextBackend или textplot.
Для построения графиков функций вида y = f(x) используется
функция plot(); для построения графиков функций, заданных параметрически, – функция plot_parametric(); для построения графиков функций, заданных неявно, – функция plot_implicit(); для построения трехмерных графиков – функция plot3d(); для построения линий в 3D, заданных параметрически, – функция plot_parametric_line(); для построения трехмерных фигур, уравнения которых заданы параметрически, –
plot_parametric_surface(). В качестве аргумента может быть использован объект класса Series («Ряды»).
2 . 1 . П о с т р о е н и я к р и в ы х на п л о с к о с т и
2 . 1 . 1 . Ф у н к ц и и p l o t и t e x t p l o t
Функция plot() возвращает экземпляр класса Plot. По умолчанию в качестве бэкенда используется библиотека Matplotlib, но вместо нее можно использовать texplot, pyglet или API Google Charts.
Если библиотека Matplotlib не установлена, можно воспользоваться
функцией textplot(), которая имеет простой синтаксис:
sympy.plotting.textplot.textplot(expr, a, b, W=55, H=21).
Строится график функции expr на интервале [a, b]. Выражение expr должно содержать один символ, например х. Параметры
W (width) и H (height) задают ширину и высоту графика соответственно.

Код для построения графика функции
2
y x sinx=
ке [-3, 3], когда в качестве бэкенда используется ASCII:
from sympy import Symbol, sin
from sympy.plotting import textplot
x = Symbol('x')
textplot(x**2*sin(x), -3, 3)
на отрез-
Рис. 2.1.
График функции y = x2·sinx (backend ASCII)
Гораздо больше возможностей для построения графиков функции одной переменной предоставляет функция plot. Ее синтаксис:
plot(expr, range, title=None, xlabel=None, ylabel=None, xlim=None,
ylim=None, axis_center='auto', axis=True, xscale='linear', yscale='linear',
legend=False, annotations=None, markers=None, rectangles=None,
size=None, **kwargs).
Эта функция позволяет строить графики функций, заданных с помощью символьной арифметики, используя многочисленные бэкенды
(matplotlib, textplot, старый модуль pyglet для SymPy, API диаграмм
Google и т. д.). Созданный с помощью нее рисунок может содержать
произвольное количество графиков функций, заданных в символьном
виде, списки координат точек и т. д. Plot имеет атрибут _series, содержащий ряды данных, которые необходимо нанести на график. Эти ряды
данных являются экземплярами классов, не импортированных с помощью sympy import *. Кастомизация рисунка происходит на двух уровнях. Существуют глобальные параметры, которые касаются рисунка
в целом (например, заголовок, метки по осям, масштаб и т. д.), и варианты рядов данных (например, имя) и эстетики (например, цвет, форма
точки, тип линии и т. д.).
73

74
Параметры функции и их назначение:
– title: str (строка) – для установки заголовка графика;
– xlabel: str (строка) – для задания метки по оси Х;
– ylabel: str (строка) – для задания метки по оси Y;
– label: str (строка) – для задания текста легенды;
– legend: bool – указывает, размещать ли легенду на графике;
– xscale: {'linear', 'log'} – для задания шкалы по оси Х;
– yscale: {'linear', 'log'} – для задания шкалы по оси Y;
– axis: bool – указывает, нужно ли прорисовывать оси координат
на графике;
– axis_center – кортеж из двух значений типа float или значения
{'center', 'auto'} для задания точки пересечения осей координат;
– xlim – кортеж из двух значений типа float для задания границ
отображения оси Х;
– ylim – кортеж из двух значений типа float для задания границ
отображения оси Y;
– size – кортеж из двух значений типа float для задания размеров
графика (width, height), по умолчанию None;
– markers (маркеры) – cписок словарей, указывающих тип требуемых маркеров. Ключи в словаре должны быть эквивалентны аргументам функции plot() matplotlib вместе с ключевыми словами, связанными
с маркером;
– annotations – список словарей, указывающих тип требуемой аннотации. Ключи в словаре должны быть эквивалентны аргументам
функции annotate() matplotlib.
Рассмотрим аргументы функции plot на примерах. Сначала построим график с использованием одного параметра функции plot:
plot(expr).
Пример 2.1. Построить график функции
2
.y x sinх=
Решение:
from sympy import symbols,sin
from sympy.plotting import plot
x = symbols('x');plot(x**2*sin(x))
График, полученный в результате работы программы, представлен на рис. 2.2.
Комментарий к программе. Импортируем нужные нам функции (symbols,sin) из библиотеки SymPy. Из модуля sympy.plotting им-
портируем функцию plot. В приведенном примере использован только

один аргумент функции plot – выражение, задающее функцию, график
2
y x sinх=
которой нужно построить. Вместо последней строки кода можно
было записать y=x**2*sin(x);plot(y). Поскольку пределы изменения
аргумента (х в нашем случае) не заданы, они устанавливаются по умолчанию (от –10 до 10). Цвет графика – синий (по умолчанию).
Рис. 2.2. График функции
Можно задать другие пределы изменения аргумента, воспользовавшись конструкцией plot(expr,range), здесь параметр range – кортеж,
задающий интервал построения графика. Можно самим задать количество точек, по которым будет строиться график, присвоив nb_of_points
соответствующее значение (при этом значение параметра adaptive
нужно установить следующим образом: adaptive = False). Цвет кривой
можно изменить с помощью глобального параметра line_color. Построим график рассмотренной ранее функции на интервале [-3, 3] по
10 точкам линией красного цвета:
from sympy import symbols,sin
from sympy.plotting import plot
x = symbols('x')
plot(x**2*sin(x),(x,-3,3),line_color='r',
adaptive = False,nb_of_points =10)
Цвет линии можно задать числом от 0 до 1, тем самым указав оттенок серого цвета, например line_color="0.9". В соответствии с цветовой
моделью RGB можно задавать цвет кортежем, указав интенсивность
(в диапазоне от 0 до 1) соответственно красной, зеленой и синей состав-
ляющих определяемого цвета (например, line_color=(1,0,0) – красный или
line_color=(0,1,0,.4) – последнее число регулирует насыщенность цвета).
75

76
Рис. 2.3. График функции y = x2sinx, построенный по 10 точкам
Рассмотрим некоторые другие аргументы функции plot на примере построения графика функции
с
на отрезке [-5, 6]. Код
программы с использованием нескольких параметров функции plot:
from sympy import symbols,sin
from sympy.plotting import plot
x = symbols('x')
plot(x**2/(cos(x)+3),(x,-5,6),line_color='tomato',
title='График функции',
xlabel="Ось Х", ylabel="Ось Y",
xlim=(-4,4), ylim=(-1,8), axis_center=(2,1),
axis=True, legend=True,
label=r'$y=\frac{x^2}{cos(x)+3}$',size=(7,3))
Рис. 2.4. График функции
2
cos 3
x
yx=
+

77
Краткий комментарий к программе. Параметры используемой
в коде функции plot. Первый параметр – функция, график которой мы
строим. Второй параметр – кортеж (x,-5,6). С его помощью задаем пределы изменения аргумента х. Далее задаем цвет кривой, устанавливаем
текст заголовка, подписей по осям. С помощью параметров xlim=(-4,4),
ylim=(-1,8) меняем пределы отображения графика. Пересечение осей
координат переносим в точку с координатами (2, 1). Если параметр
axis=False, то оси не отображаются. С помощью переменной label задаем текст легенды, записанный с помощью LaTex. Поскольку значение параметра legend=True, легенда отобразится на графике. При отсутствии переменной label и значения параметра legend=True текст легенды соответствует первому параметру функции plot. В нашем случае
текст легенды выглядит следующим образом: x**2/(cos(x)+3). Параметр size задает размеры графика в дюймах (width, height) – кортеж со
значениями ширины и высоты графика.
Пример 2.2. Построить график полинома Лежандра 7-й степени
на отрезке [0, 1]. Нанести на график легенду. Легенда должна содержать
поясняющий текст и уравнение полинома. При выводе уравнения полинома использовать LaTeX. Отметить первую и последнюю точки графика маркерами.
Решение. LaTeX представляет собой инструмент для создания
профессиональных документов. Верстка документа в LaTeX занимает
длительное время и достаточно сложна. Python предоставляет простой
санных с использованием синтаксиса языка, в LaTeX. Код программы,
в котором реализована эта возможность:
from sympy import *
y=legendre_poly(7,x)
x = symbols('x'); y=legendre_poly(7,x)
t='Полином Лежандра 7 степени\n'
h=latex(y,mode='inline',fold_short_frac=False)
y1=y.subs(x,0)
y2=y.subs(x,1)
plot(y,(x,0,1),line_color='tomato',label=t+h,
markers=[{'args':[[0,1],[y1,y2],'o']}],legend=True)

Рис. 2.5. График полинома Лежандра 7-й степени
2
sin( )ln( ) и 1.5 co ()s
x
y x x x z x==
[2, 7].x
Комментарий к программе. Строим полином Лежандра 7-й сте-
пени. Наличие второго параметра в функции legendre_poly() обязательно.
Формируем поясняющий текст («Уравнение полинома»). Знак \n означает переход на новую строку. Записываем уравнение полинома в LaTeX.
Первый параметр функции latex – это полученное уравнение полинома.
Второй параметр добавляет знаки $ в начало и конец выражения, что
необходимо для вывода его на график. Без третьего параметра в полученном выражении знак деления выведется как /. Если вывести значение переменной h на экран, получим: '$\\frac{429 x^{7}}{16} – \\frac{693
x^{5}}{16} + \\frac{315 x^{3}}{16} – \\frac{35 x}{16}$'. Так выглядит
уравнение полинома, набранное в LaTeX. Тип полученного выражения –
str (строка). Вычисляем значения полинома в точках 0 (y1) и 1 (y2).
Строим график полинома на отрезке [0, 1] линией цвета tomato. Формируем текст легенды: добавляем к поясняющему тексту уравнение полинома. В параметре markers задаем координаты точек по оси Х ([0,1])
и Y ([y1,y2]) и вид маркеров (о). Объединенный текст включаем в легенду,
которую выводим на график (legend=True).
В одном графическом окне можно построить несколько графиков. Покажем, как это можно сделать.
Пример 2.3. В одном графическом окне построить графики функ-
ций
Нанести на график легенду.
Решение:
from sympy import *
from sympy.plotting import plot
линиями разного цвета.
78

x = symbols('x')
p1=plot(x*sin(x)*log(x),1.5**x*cos(x)**2,(x,2,7),
legend=True,show=False)
p1[0].line_color = 'red';
p1[1].line_color = 'g';
p1.show()
Комментарий к программе. Создаем объект р1 класса Plot. За-
даем две функции: x*sin(x)*log(x) и 1.5**x*cos(x)**2, графики которых
хотим построить. Поскольку пределы изменения аргумента х у графиков одинаковые, задаем их одним кортежем – (x,2,7). Добавляем к графикам легенду (legend=True). Если установить show=True, то цвет кривых будет одинаковым (синим в нашем случае). Не поможет и вариант
line_color='red' (или любой другой цвет): параметр line_color – глобальный, поэтому все кривые будут этого (красного) цвета. Повременим
с выводом графика (show=False) и сначала изменим цвет у кривых объекта p1 (p1[0] – это первая кривая, p1[1] – вторая кривая):
p1[0].line_color = 'red'; p1[1].line_color = 'g'. Только после этого выводим
на кран содержимое графического окна. Если в приведенной программе
опустить параметр show (или show=True), то на экран выведутся два
графических окна. В первом из них графики будут одного (синего)
цвета, во втором – красного и зеленого.
Рис. 2.6. Два графика в одном графическом окне
Возможен и другой вариант решения примера 2.3. Можно исполь-
зовать функцию append(arg), чтобы добавить второй график к первому:
from sympy import *
from sympy.plotting import plot
x = symbols('x')
79

p1=plot(x*sin(x)*log(x),(x,2,7),
legend=True,line_color='r',show=False)
p2 = plot(1.5**x*cos(x)**2,(x,2,7),
show=False,line_color='g',legend=True)
p1.append(p2[0]);p1.show()
Добавить один график к другому можно с использованием ме-
тода extend: p1.extend(p2).
Пример 2.4. Построить график первой и второй производных
функции w = xlog(x) + sin2(x) на интервале [1, 7].
Решение. Как находить производные от функций, было показано
в подразд. 1.3. В далее приведенном коде переменные c и d – первая
и вторая производные исходной функции:
from sympy import diff, sin,log
from sympy.abc import x
from sympy.plotting import plot
w = x*log(x) + sin(x)**2;
c=diff(w,x);
d=diff(w,x,2)
p1=plot(c,(x,1,7),label='График первой производной',
legend=True,line_color = 'red',show=False)
p2=plot(d,(x,1,7),label='График второй производной',
legend=True,line_color = 'g',show=False)
p1.extend(p2);
p1.show()
Рис. 2.7. Графики первой и второй производных
функции w = xlog(x) + sin2(x)
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
