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

ОЭД на ЭВМ_УМП_ЛР

.pdf
Скачиваний:
56
Добавлен:
16.03.2016
Размер:
1.83 Mб
Скачать

101

Для того чтобы получить пример трехмерного графика, достаточно набрать в консоли 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 " )

Для получения качественных документов предпочтителен векторный формат изображений.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]