ОЭД на ЭВМ_УМП_ЛР
.pdf101
Для того чтобы получить пример трехмерного графика, достаточно набрать в консоли Scilab команду surf():
-->surf ()
При создании графиков в данном разделе используются вспомогательные функции, приведенные в табл. 7.2.
7.2 йЪУ·р‡КВМЛВ ‰‚ЫıПВрМ˚ı „р‡ЩЛНУ‚
В этом разделе мы увидим, как отобразить простой двухмерный график функции, уделяя особое внимание возможностям векторизации, позволяющим создать матрицу исходных данных одной командой. Для начала определим функцию, график которой мы собираемся строить.
Наша функция myquadratic будет возводить свой аргумент x в квадрат, используя оператор ”ˆ”:
function f = myquadratic ( x ) f = x ^ 2
endfunction
Рис. 7.1 — График функции x^2
102
При помощи функции linspace создадим вектор из 50 равноотстоящих значений на отрезке [1; 10]:
xdata = linspace ( 1 , 10 , 50 );
Вектор xdata мы передаем функции myquadratic, которая расчитывает значения в каждой точке:
ydata = myquadratic ( xdata );
Теперь в нашем распоряжении есть вектор-строка ydata, содержащий 50 элементов, который наряду с xdata мы используем в качестве параметра функции plot для отображения графика:
plot ( xdata , ydata )
Полученный график показан на рисунке 7.1. Отметим, что тот же график можно было построить без явного вычисления вектора значений ydata, передав функции plot в качестве второго параметра саму функцию
myfunction1:
plot ( xdata , myquadratic )
Использование функции в качестве параметра позволяет существенно снизить затраты памяти при построении графика в случае большого числа точек.
7.3 дУМЪЫрМ˚В „р‡ЩЛНЛ
В этом разделе рассматриваются контурные графики функций двух переменных, для построения которых используется функция contour. Контурные графики находят активное применение при оптимизации функций, позволяя отобразить рельеф функции двух переменных так, что местонахождение оптимума становится очевидным.
103
Допустим, определена функция f от n переменных f(x) = f(x1; : : : ; xn) и x Rn. Для заданного α R уравнение:
f(x) = α
определяет поверхность в (n + 1)-мерном пространстве Rn+1.
При n = 2 точки z = f(x1; x2) образуют поверхность в трехмерном пространстве (x1; x2; z) R3, что позволяет отобразить контурный график целевой функции. При n > 3 столь удобного решения не существует — в этом случае можно выбрать две наиболее значимые переменные и построить график, варьируя только их.
Функция contour, позволяющая построить контурный график, имеет следующий синтаксис:
contour ( x , y , z , nz ),
где x и y — векторы-строки значений x и y, с числом элементов n1 и n2 соответственно; z — вещественнозначная матрица размером (n1,n2), содержащая значения рассматриваемой функции, либо объект-функция Scilab, определяющая поверхность z=f(x,y), nz — значения уровней либо их количество.
В следующем фрагменте мы используем простую форму функции contour, которой в качестве параметра передается функция myquadratic. Функция myquadratic принимает два аргумента x1 и x2 и возвращает значение f(x1; x2) = x21 + x22. Для генерации значений переменных, образующих сетку, используется функция linspace:
function f = myquadratic2arg ( x1 , x2 ) f = x1 ** 2 + x2 ** 2;
endfunction
xdata = linspace ( -1 , 1 , 100 ); ydata = linspace ( -1 , 1 , 100 );
contour ( xdata , ydata , myquadratic2arg , 10)
104
Полученный в результате график представлен на рис. 7.2. На практике функция, график которой необходимо отобразить, часто принимает единственный аргумент x, представляющий собой вектор-строку, в то время как функция contour требует наличия двух аргументов. Можно предложить следующие варианты решения данной проблемы:
–определить новую функцию, которая будет вызывать исходную,
–передать функции contour массив данных вместо объектафункции.
Рис. 7.2 — Контурный график функции f(x1; x2) = x21 + x22
Оба этих подхода рассмотрены далее, так что читатель может выбирать наиболее подходящий вариант. Для начала обратимся ко второму способу, предполагающему генерацию массива значений функции. Пусть функция myquadratic1arg принимает на вход вектор из двух элементов. Для вычисления матрицы zdata, содержащей значения функции, выполняются два вложенных цикла. Для каждой комбинации (x(i); y(j)) 2 R2 при i = 1; 2; : : : ; nx и j = 1; 2; : : : ; ny, где nx и ny — это количество точек по осям x и y соответственно, в матрицу zdata заносится соответствующее значение. Наконец, для построения графика мы воспользуемся функцией
105
contour, передав ей список уровней (а не их число, как в предыдущем фрагменте). Это позволяет явно задать требуемые уровни вместо того, чтобы предоставлять Scilab их автоматическое вычисление.
function f = myquadratic1arg ( x ) f = x (1) ** 2 + x (2) ** 2; endfunction
xdata = linspace ( -1 , 1 , 100 ); ydata = linspace ( -1 , 1 , 100 );
// Внимание! Применения двух вложенных циклов следует избегать. for i = 1 : length ( xdata )
for j = 1 : length ( ydata )
x = [ xdata (i) ydata (j)]. ’;
zdata ( i , j ) = myquadratic1arg ( x ); end
end
contour ( xdata , ydata , zdata , [0.1 0.3 0.5 0.7])
Полученный график показан на рис. 7.3. Рассмотренный фрагмент выполняет поставленную задачу, однако работает неэффективно из-за использования циклов. Для повышения скорости выполнения использованию циклов следует предпочесть применение встроенных функций и векторизованных операций, рассмотренных ранее. В частности, для вычисления значений функции на сетке можно использовать функцию
feval.
Рис. 7.3 — Контурный график функции f(x1; x2) = x21 + x22 с явным указанием уровней
106
Предположим, что модифицировать функцию myquadratic1arg невозможно, поэтому определим промежуточную функцию myquadratic3, принимающую два входных аргумента и вызывающую myquadratic1arg. Теперь, используя встроенную функцию feval, можем получить матрицу значений функции
zdata:
function f = myquadratic1arg ( x ) f = x (1) ** 2 + x (2) ** 2; endfunction
function f = myquadratic3 ( x1 , x2 ) f = myquadratic1arg ( [x1 x2] ) endfunction
xdata = linspace ( -1 , 1 , 100 ); ydata = linspace ( -1 , 1 , 100 );
zdata = feval ( xdata , ydata , myquadratic3 ); contour ( xdata , ydata , zdata , [0.1 0.3 0.5 0.7])
Результатом является тот же контурный график, что и ранее (рис. 7.3). Наконец, построить график функции myquadratic3 также можно, непосредственно передав эту функцию в качестве аргумента contour:
function f = myquadratic1arg ( x ) f = x (1) ** 2 + x (2) ** 2; endfunction
function f = myquadratic3 ( x1 , x2 ) f = myquadratic1arg ( [x1 x2] ) endfunction
xdata = linspace ( -1 , 1 , 100 ); ydata = linspace ( -1 , 1 , 100 );
contour ( xdata , ydata , myquadratic3 , [0.1 0.3 0.5 0.7])
Полученный в результате график, конечно, будет в точности совпадать с предыдущими (рис. 7.2). Преимуществом же этого способа является экономия памяти, так как в данном случае нет нужды хранить матрицу значений zdata. Таким образом, мы вкратце рассмотрели построение возможности, которые Scilab предоставляет для отображения графиков. В следующем разделе мы обратимся к возможностям настройки таких элементов графика, как заголовок, названия осей и легенда.
107
7.4 èÓ‰ÔËÒË Ì‡ „ð‡ÙË͇ı
Для придания графику законченного вида необходимо отобразить название графика, подписи осей и легенду.
Вернемся к примеру построения графика функции x^2, рассмотренному в разделе 7.2:
function f = myquadratic ( x ) f = x .^ 2
endfunction
xdata = linspace ( 1 , 10 , 50 ); ydata = myquadratic ( xdata ); plot ( xdata , ydata )
Результат выполнения данного фрагмента был показан на рис. 7.1. Графические возможности Scilab основаны на использовании графических дескрипторов. Графические дескрипторы предоставляют объектноориентированный доступ к свойствам графического объекта. Каждая графическая область состоит из примитивов, таких как линии, образующие кривые, оси, название графика, его легенда и т. п. Всякому графическому примитиву соответствует определенный набор свойств, например толщина, цвет линий и т. п. Доступ к этим свойствам осуществляется так же, как и к любым другим переменным Scilab.
Управление графическими дескрипторами, таким образом, является достаточно гибким и удобным механизмом работы с графическими объектами. Простейшее оформление графиков может выполняться посредством встроенных функций Scilab без явного обращения к дескрипторам
— в данном руководстве мы ограничимся рассмотрением только этих базовых возможностей. Например, функция title используется для того, чтобы задать название графика:
title ( "Название графика" );
108
Для того чтобы отобразить на графике подписи осей, используем функцию xtitle:
xtitle ("Название графика", "Подпись оси X", "Подпись оси Y");
На рис. 7.4 представлен результат выполнения этой команды. Часто возникает необходимость отобразить совместно графики двух функций. Ниже мы определяем функции f(x) = x^2 и f(x) = 2x^2 и отображаем их на одном графике. Для того чтобы различать кривые, соответствующие каждой из функций, мы используем третий параметр функции plot. Значения "+-" и "o-" определяют способ отображения точек (в данном случае они будут отображаться символами ”+” и ”o”) и соединяющих линий на графике (сплошная линия).
Рис. 7.4 — График функции x^2 с названием и подписями осей
function f = myquadratic ( x ) f = x ^ 2
endfunction
function f = myquadratic2 ( x ) f = 2 * x ^ 2
endfunction
xdata = linspace ( 1 , 10 , 50 );
109
ydata = myquadratic ( xdata ); plot ( xdata , ydata , "+-" ) ydata2 = myquadratic2 ( xdata ); plot ( xdata , ydata2 , "o-" )
xtitle ("Название графика", "Подпись оси X", "Подпись оси Y");
Помимо этого необходимо отобразить легенду, указав, какая из кривых соответствует каждой из функций, для чего используется инструк-
ция legend:
legend ( "x^2" , "2x^2" );
Рис. 7.5 демонстрирует получившийся в итоге график.
Рис. 7.5 — График двух функций f1(x) = x^2 и f2(x) = 2x^2.
Для соотнесения кривых и функций используются стили отображения точек и линий, а также легенда
Теперь мы знаем, как создать график и настроить параметры его отображения. Если график окажется достаточно интересным, его можно сохранить в файл для последующего использования. Экспорту графиков посвящен заключительный раздел данной главы.
110
7.5 щНТФУрЪ ЛБУ·р‡КВМЛИ
В данном разделе рассматриваются способы вывода изображения в графический файл с использованием оконного меню или встроенных функций Scilab.
Экспортировать выведенное на экран изображение можно, выбрав в меню пункт Файл > Экспортировать... (File > Export to...). Появляющееся после этого диалоговое окно предложит указать имя и тип создаваемого файла.Scilab позволяет экспортировать изображения в файлы многих распространенных векторных и растровых форматов. Для того чтобы сохранить изображение, не прибегая к помощи меню, используются функции, указанные в табл. 7.1.
Таблица 7.1 — Функции экспорта изображений
Векторные |
|
Растровые |
|
|
xs2png |
|
экспорт в формат PNG |
xs2fig |
экспорт в формат FIG |
xs2pdf |
|
экспорт в формат PDF |
xs2gif |
экспорт в формат GIF |
xs2svg |
|
экспорт в формат SVG |
xs2jpg |
экспорт в формат JPG |
xs2eps |
|
экспорт в формат Encapsulated |
xs2bmp |
экспорт в формат BMP |
|
|
Postscript |
|
|
xs2ps |
|
экспорт в формат Postscript |
xs2ppm |
экспорт в формат PPM |
xs2emf |
|
экспорт в формат EMF (только |
|
|
|
|
для Windows) |
|
|
Все функции, перечисленные в табл. 7.1, принимают два параметра, первый из которых, window_number, представляет собой номер графического окна (отображается в заголовке), а второй, filename, задает желаемое имя файла, куда будет записано изображение:
xs2png ( window_number , filename )
Следующая команда, к примеру, выведет содержимое окна с номером 0 в файл foo.png:
xs2png ( 0 , " foo . png " )
Для получения качественных документов предпочтителен векторный формат изображений.