КулЛиб - Классная библиотека! Скачать книги бесплатно 

Scilab. Решение инженерных и математических задач: учебное издание [Евгений Ростиславович Алексеев] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Библиотека ALT

Е. Р. Алексеев, К. В. Дога, О. В. Чеснокова

Scilab
Решение инженерных
и математических задач

Москва, 2024

УДК 004.67
ББК 22.1
А47

А47

Алексеев Е. Р., Дога К. В., Чеснокова О. В.
Scilab: Решение инженерных и математических задач: учеб. издание /
отв. ред. В. Л. Чёрный. – М.: Базальт СПО; ДМК Пресс, 2024. – 440 с.: ил. –
(Библиотека ALT)
ISBN 978-5-93700-271-6
Книга посвящена свободно распространяемому математическому пакету Scilab.
Описан язык программирования Scilab. Особое внимание уделено визуальным
средствам программирования. Описаны графические возможности пакета. Подробно рассмотрено решение математических задач (нелинейные уравнения
и системы, задачи линейной алгебры, задачи оптимизации, дифференцирование
и интегрирование, задачи обработки экспериментальных данных, обыкновенные
дифференциальные уравнения и системы, уравнения в частных производных).
Книга адресована студентам и преподавателям математических и инженерных
специальностей и научным сотрудникам.

УДК 004.67
ББК 22.1

Материалы, составляющие данную книгу, распространяются на условиях лицензии GNU
FDL. Книга содержит следующий текст, помещаемый на первую страницу обложки: «В серии “Библиотека ALT”». Название: «Scilab: Решение инженерных и математических задач».
Книга не содержит неизменяемых разделов. Linux – торговая марка Линуса Торвальдса.
Прочие встречающиеся названия могут являться торговыми марками соответствующих
владельцев.

ISBN 978-5-93700-271-6

© Алексеев Е. Р., Дога К. В., Чеснокова О. В., 2024
© Basealt, 2024
© Оформление, издание, ДМК Пресс, 2024

Содержание
От издательства.........................................................................................................8
Сведения об авторах...............................................................................................9
Введение....................................................................................................................10
Глава 1. Пакет Scilab. Начало работы...............................................................13
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8

1.9

Установка Scilab на ПК......................................................................................14
Первое знакомство со Scilab............................................................................14
Редактирование и отладка файлов-сценариев.............................................16
Текстовые комментарии..................................................................................18
Элементарные математические выражения. ...............................................18
Переменные в Scilab.........................................................................................19
Системные переменные Scilab........................................................................21
Числовые типы данных и представление результатов вычислений
в Scilab.................................................................................................................22
1.8.1 Целые числа в Scilab..............................................................................22
1.8.2 Представление вещественных чисел в Scilab....................................22
1.8.3 Представление комплексных чисел в Scilab......................................23
Функции в Scilab................................................................................................24
1.9.1 Элементарные математические функции.........................................25
1.9.2 Функции, определённые пользователем...........................................25

Глава 2. Программирование в Scilab................................................................30
2.1

2.2

Основные операторы sci-языка......................................................................31
2.1.1 Функции ввода-вывода в Scilab. .........................................................31
2.1.2 Форматированный вывод....................................................................32
2.1.3 Оператор присваивания.......................................................................35
2.1.4 Условный оператор...............................................................................35
2.1.5 Оператор альтернативного выбора....................................................41
2.1.6 Оператор цикла while...........................................................................43
2.1.7 Оператор for...........................................................................................45
2.1.8 Операторы передачи управления.......................................................46
Обработка массивов и матриц в Scilab..........................................................47
2.2.1 Ввод-вывод массивов и матриц..........................................................47
2.2.2 Вычисление суммы и произведения элементов массива
(матрицы)...............................................................................................48
2.2.3 Поиск максимального (минимального) элемента массива
(матрицы)...............................................................................................49

4

2.3

2.4

Содержание

2.2.4 Сортировка элементов массива..........................................................50
2.2.5 Удаление элемента из массива............................................................51
2.2.6 Примеры задач. .....................................................................................52
Работа с файлами в Scilab................................................................................56
2.3.1 Функция открытия файла mopen........................................................56
2.3.2 Функция записи в текстовый файл mfprintf. ....................................57
2.3.3 Функция чтения данных из текстового файла mfscanf...................57
2.3.4 Функция закрытия файла mclose........................................................58
2.3.5 Примеры решения задач......................................................................59
Пользовательские функции в Scilab...............................................................63

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной
алгебры.......................................................................................................................70
3.1
3.2
3.3
3.4
3.5

3.6
3.7
3.8
3.9

Ввод и формирование векторов и матриц....................................................70
Действия над векторами..................................................................................74
Действия над матрицами.................................................................................79
Символьные матрицы и операции над ними...............................................87
Функции для работы с матрицами и векторами..........................................88
3.5.1 Функции для работы с векторами. .....................................................88
3.5.2 Функции для работы c матрицами.....................................................91
3.5.3 Функции, реализующие численные алгоритмы решения
задач линейной алгебры....................................................................108
Решение некоторых задач алгебры матриц................................................115
Решение систем линейных уравнений........................................................119
Собственные значения и собственные векторы. .......................................131
Норма и число обусловленности матрицы. ................................................134

Глава 4. Построение графиков в Scilab.........................................................137
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13

Построение графиков в декартовой системе координат..........................137
Особенности работы функции plot. .............................................................139
Построение нескольких графиков в одной системе координат. .............146
Построение нескольких графиков в одном графическом окне...............149
Оформление графиков при помощи функции plot........................................151
Функция plot2d................................................................................................156
Оформление графиков при помощи функции plot2d...............................158
4.7.1 Построение точечных графиков. ......................................................164
4.7.2 Построение графиков в виде ступенчатой линии..........................164
Построение графиков в полярной системе координат.............................166
Построение графиков функций, заданных в параметрической
форме................................................................................................................169
Примеры решения некоторых задач. ..........................................................174
Режим форматирования графика.................................................................182
4.11.1 Форматирование объекта Figure.......................................................184
4.11.2 Форматирование объекта Polyline....................................................198
Функции plot3d и plot3d1...............................................................................202
Функции meshgrid, surf и mesh. ....................................................................208

Содержание

4.14
4.15
4.16
4.17
4.18
4.19
4.20

5

4.13.1 Построение графиков поверхностей, заданных
параметрически...................................................................................214
Функции plot3d2 и plot3d3.............................................................................214
Функции param3d и param3d1.......................................................................217
Функция contour..............................................................................................224
Функция contourf. ...........................................................................................229
Функция hist3d. ...............................................................................................232
Примеры построения некоторых трёхмерных графиков в Scilab...........233
Анимация.........................................................................................................239

Глава 5. Создание графических приложений в среде Scilab.................241
5.1
5.2

Работа с графическим окном........................................................................241
Динамическое создание интерфейсных элементов. Описание
основных функций..........................................................................................247
5.2.1 Командная кнопка...............................................................................251
5.2.2 Метка.....................................................................................................254
5.2.3 Переключатель и флажок...................................................................256
5.2.4 Окно редактирования.........................................................................259
5.2.5 Списки...................................................................................................262
5.2.6 Таблицы. ...............................................................................................263

Глава 6. Нелинейные уравнения и системы в Scilab................................267
6.1
6.2
6.3

Методы решения нелинейных уравнений..................................................267
6.1.1 Решение нелинейных и трансцендентных уравнений. ................267
6.1.2 Особенности решения алгебраических уравнений. ......................275
Встроенные функции Scilab для решения нелинейных уравнений........283
6.2.1 Решение алгебраических уравнений. ..............................................283
6.2.2 Решение трансцендентных уравнений............................................287
Решение систем нелинейных уравнений в Scilab......................................290

Глава 7. Численное интегрирование и дифференцирование. ..............292
7.1

7.2
7.3
7.4

Основные методы численного интегрирования........................................292
7.1.1 Интегрирование по методу трапеций..............................................293
7.1.2 Интегрирование по методу Симпсона.............................................293
7.1.3 Правило Рунге оценки точности интегрирования.........................295
7.1.4 Квадратурные формулы Гаусса и Чебышёва...................................295
Встроенные функции интегрирования Scilab. ...........................................299
Численное дифференцирование в Scilab.....................................................301
Примеры решения некоторых задач. ..........................................................305

Глава 8. Решение обыкновенных дифференциальных
уравнений и систем..............................................................................................309
8.1
8.2

Общие сведения о дифференциальных уравнениях.................................309
Численные методы решения дифференциальных уравнений. ...............310
8.2.1 Решение дифференциальных уравнений методом Эйлера..........311

6

8.3
8.4

Содержание

8.2.2 Решение дифференциальных уравнений при помощи
модифицированного метода Эйлера. ..............................................312
8.2.3 Решение дифференциальных уравнений методами
Рунге–Кутта..........................................................................................313
8.2.4 Решение дифференциальных уравнений методом
прогноза-коррекции Адамса.............................................................314
8.2.5 Решение дифференциальных уравнений методом Милна. .........315
Решение систем дифференциальных уравнений......................................325
Возможности Scilab для решения дифференциальных уравнений
и систем............................................................................................................326

Глава 9. Обработка экспериментальных данных......................................333
9.1

Метод наименьших квадратов......................................................................333
9.1.1 Постановка задачи..............................................................................333
9.1.2 Подбор параметров экспериментальной зависимости
методом наименьших квадратов......................................................334
9.1.3 Точность подбора параметров. .........................................................338
9.1.4 Уравнение регрессии и коэффициент корреляции........................339
9.1.5 Нелинейная корреляция. ...................................................................339
9.2 Решение задач аппроксимации в Scilab......................................................341
9.3 Интерполяция функций.................................................................................351
9.3.1 Канонический полином. ....................................................................352
9.3.2 Полином Ньютона...............................................................................353
9.3.3 Полином Лагранжа..............................................................................355
9.3.4 Интерполяция сплайнами. ................................................................356
9.4 Встроенные функции Scilab для решения задачи интерполяции...........361

Глава 10. Решение дифференциальных уравнений в частных
производных. .........................................................................................................365
10.1 Общие сведения о дифференциальных уравнениях в частных
производных....................................................................................................365
10.2 Использование метода сеток для решения параболических
уравнений в частных производных. ............................................................367
10.3 Использование метода сеток для решения гиперболических
уравнений.........................................................................................................379
10.4 Использование метода сеток для решения эллиптических
уравнений.........................................................................................................381

Глава 11. Решение задач оптимизации.........................................................385
11.1 Поиск минимума функции............................................................................385
11.1.1 Поиск минимума функции одной переменной..............................387
11.1.2 Поиск минимума функции многих переменных...........................389
11.2 Решение задач линейного программирования..........................................391
11.3 Решение задач квадратичного программирования..................................396

Содержание

7

Глава 12. Использование Scilab для создания интерактивных
документов..............................................................................................................401
12.1 Инструментальные средства разработки интерактивных
документов.......................................................................................................401
12.2 Установка Jupyter Notebook. ..........................................................................402
12.3 Создание документов с помощью Jupyter Notebook и Scilab....................403
12.4 Решение практических задач с помощью Jupyter Notebook и Scilab. .....405

Глава 13. Задания для самостоятельной работы в Scilab......................409
13.1 Программирование в Scilab...........................................................................409
13.1.1 Программирование циклических вычислительных процессов
в Scilab...................................................................................................409
13.1.2 Программирование задач обработки массивов в Scilab. ..............418
13.1.3 Программирование задач обработки матриц в Scilab...................420
13.2 Задания по теме «Решение задач линейной алгебры»..............................422
13.3 Задания по теме «Построение двумерных графиков». .............................425
13.4 Задания по теме «Построение трёхмерных графиков».............................427
13.5 Задания по теме «Нелинейные уравнения и системы».............................428
13.6 Задания по теме «Численное интегрирование».........................................429
13.7 Задания по теме «Обработка экспериментальных данных»....................430
13.8 Задания по теме «Решение задач оптимизации». .....................................433

Литература. .............................................................................................................435
Предметный указатель. ......................................................................................436

От издательства
Отзывы и пожелания
Мы всегда рады отзывам наших читателей. Расскажите нам, что вы ду­маете
об этой книге – что понравилось или, может быть, не понравилось. Отзывы
важны для нас, чтобы выпускать книги, которые будут для вас максимально
полезны.
Вы можете написать отзыв на нашем сайте www.dmkpress.com, зайдя на
страницу книги и оставив комментарий в разделе «Отзывы и рецензии».
Также можно послать письмо главному редактору по адресу dmkpress@gmail.
com; при этом укажите название книги в теме письма.
Если вы являетесь экспертом в какой-либо области и заинтересованы в написании новой книги, заполните форму на нашем сайте по адресу http://
dmkpress.com/authors/publish_book/ или напишите в издательство по адресу
dmkpress@gmail.com.

Список опечаток
Хотя мы приняли все возможные меры для того, чтобы обеспечить высокое качество наших текстов, ошибки все равно случаются. Если вы найдете
ошибку в одной из наших книг, мы будем очень благодарны, если вы сообщите о ней главному редактору по адресу dmkpress@gmail.com. Сделав это,
вы избавите других читателей от недопонимания и поможете нам улучшить
последующие издания этой книги.

Нарушение авторских прав
Пиратство в интернете по-прежнему остается насущной проблемой. Издательство «ДМК Пресс» очень серьезно относится к вопросам защиты авторских прав
и лицензирования. Если вы столкнетесь в интернете с незаконной публикацией
какой-либо из наших книг, пожалуйста, пришлите нам ссылку на интернет-ресурс, чтобы мы могли применить санкции.
Ссылку на подозрительные материалы можно прислать по адресу элект­
ронной почты dmkpress@gmail.com.
Мы высоко ценим любую помощь по защите наших авторов, благодаря
которой мы можем предоставлять вам качественные материалы.

Сведения об авторах
Алексеев Евгений Ростиславович, кандидат технических наук, доцент, доцент кафедры информационных образовательных технологий Кубанского
государственного университета, автор 15 книг и более 120 научных и методических работ.
Чеснокова Оксана Витальевна, кандидат технических наук, доцент кафед­
ры общематематических и естественно-научных дисциплин Московского
финансово-юридического университета, автор 10 книг и более 80 научных
и методических работ.
Дога Кристина Вячеславовна, студент факультета математики и компьютерных наук Кубанского государственного университета, педагог дополнительного образования центра детского творчества «Прикубанский».
Рецензенты
Д. А. Тархов – доктор технических наук, профессор кафедры высшей математики Санкт-Петербургского политехнического университета.
В. И. Родионов – кандидат физико-математических наук, доцент, заведующий кафедрой информатики и математики Удмуртского государственного
университета.

Введение
Первая наша книга, посвящённая Scilab – системе компьютерной математики, вышла в свет в 2008 году [2]. Она была благожелательно принята читателями. Возможно, потому, что это была одна из первых книг по Scilab (наши
коллеги утверждают, что это было первое издание на русском языке), а может
быть, и потому, что получилась неплохая книга. Авторы многие годы использовали эту книгу при обучении студентов в университетах России и Украины
(Донецкий национальный технический университет, Вятский государственный университет, Кубанский государственный университет). Также книгу
использовали коллеги из Москвы, Санкт-Петербурга, Новосибирска, Львова,
Ижевска и других городов. Авторы получили много отзывов из всей России.
Книга познакомила нас со многими учёными и преподавателями (профессор С. П. Шарый из Новосибирска, профессора А. Н. Васильев, Д. А. Тархов
из Санкт-Петербурга, доценты В. Р. Кристалинский, В. И. Мунерман из Смо­
ленска и многие другие).
Однако авторы отдавали себе отчёт, что книга неидеальна, в ней есть моменты, которые хотелось бы поправить. Кроме того, за 17 лет, прошедших
с момента написания книги, значительно изменился сам пакет Scilab, расширились его возможности. Scilab за эти годы стал достаточно популярен.
Теперь нет необходимости сравнивать его с проприетарными математическими пакетами. Изменился и пользователь пакета. Свободное программное
обеспечение шагнуло далеко за пределы узкого круга «хакеров-линуксоидов». Уровень информационных технологий сделал доступным знакомство
с наукой в очень молодом возрасте.
За последнее десятилетие появилось достаточное количество литературы
по Scilab, в частности русскоязычной [4, 7, 10, 11, 12, 14]. Особое внимание
хотелось бы обратить на книги Б. И. Квасова [10] и А. Н. Титова, Р. Ф. Тазиевой
[12]. В обеих работах авторы рассматривают Scilab как инструмент для решения математических задач. Много ссылок на литературу на разных языках
можно найти на странице официального сайта Scilab https://www.scilab.org/
about/community/books.
В предлагаемой читателю книге значительно расширены разделы, посвящённые графическому отображению информации, созданию визуальных приложений в Scilab и решению математических задач. В книге можно

Введение

11

прочесть об использовании функций Scilab для решения математических,
инженерных и экономических задач, об алгоритмах решения подобных задач. Авторы сочли возможным написать свои функции, реализующие описанные алгоритмы вычислительной математики. Хотим сразу извиниться
перед специалистами по численным методам, которым наше описание алгоритмов решения вычислительных задач покажется кратким и неполным.
Были описаны только проверенные вычислительные схемы решения задач.
Авторы отсылают читателя к классическим и современным учебникам по
численным методам [5, 6, 10, 15].
Существуют версии Scilab для различных операционных систем: для ОС
семейства Linux, ОС Windows и даже для macOS. При написании книги авторы использовали ОС «Альт Образование». На момент написания книги последней была версия пакета Scilab 2023.1.0. Последнюю версию пакета можно
скачать на официальном сайте www.scilab.org.
В первых главах книги описан входной язык системы Scilab, что позволит
читателю на самых первых этапах при решении математических и инженерных задач не только использовать встроенные команды пакета, но и разрабатывать собственные программы.
Книга состоит из тринадцати глав.
Первая глава является своеобразным введением в Scilab. В ней описаны
основные возможности пакета, уделено внимание особенностям установки
на компьютер.
Во второй главе описан язык программирования Scilab.
Третья глава посвящена работе с массивами и матрицами в Scilab, в ней
рассматриваются возможности Scilab при решении задач линейной алгебры.
В четвёртой главе речь идет о графических возможностях Scilab. Подробно описаны возможности пакета для построения двумерных и трёхмерных
графиков. Рассмотрены возможности форматирования графиков. Глава значительно расширена.
Пятая глава знакомит читателя с разработкой оконных приложений
в Scilab.
Шестая глава знакомит читателя с различными способами решения нелинейных уравнений и систем в Scilab. Авторы добавили сюда описание
методов решения нелинейных уравнений. Отдельный параграф посвящён
алгоритмам нахождения корней полинома.
В седьмой главе внимание уделено вычислительным методам интегрирования и дифференцирования, а в восьмой главе рассмотрено решение обыкновенных дифференциальных уравнений в Scilab. Добавлено краткое описание
основных численных методов решения обыкновенных дифференциальных
уравнений и систем.
В девятой главе описаны задачи обработки результатов эксперимента
и методы их решения.
В десятой главе речь идет о дифференциальных уравнениях в частных
производных. Описан метод сеток численного решения дифференциальных
уравнений в частных производных и представлена его реализация в Scilab.
В одиннадцатой главе вниманию читателя представлены задачи оптимизации функций одной и многих переменных, а также задачи линейного прог­

12

Введение

раммирования. Добавлен раздел, посвящённый решению задач квадратичного программирования.
Двенадцатая глава посвящена использованию Scilab в качестве вычислительного ядра для создания интерактивных документов в формате Jupyter
Notebook.
В тринадцатой главе приведено большое количество заданий для самостоятельного решения или проведения лабораторных (практических) занятий,
что позволит использовать книгу в учебном процессе. Кроме того, читатель
всегда сможет воспользоваться книгой как справочником по решению математических задач в среде Scilab.
Авторы благодарят компанию «Базальт СПО» за возможность издания книги, посвященной пакету Scilab.
Е. Р. Алексеев, К. В. Дога, О. В. Чеснокова
Краснодар, Москва, 2024

Глава 1

Пакет Scilab. Начало работы
Scilab – это свободная система компьютерной математики, которая предназначена для выполнения математических, инженерных и научных вычислений.
Основные характеристики пакета Scilab:
1) кросс-платформенность. Существуют версии пакета Scilab для операционных систем Linux и Windows. Интерфейсы этих версий несколько
различаются, но все команды идентичны;
2) пакет оснащен интерфейсом и системой помощи;
3) содержит функции, реализующие основные алгоритмы базовой математики;
4) имеет достаточно мощный собственный язык программирования высокого уровня;
5) содержит большое количество встроенных функций для решения различных математических задач;
6) обладает широкими возможностями построения и редактирования
графиков и поверхностей.
В Scilab есть большое количество встроенных функций, предназначенных
для решения:
z z нелинейных уравнений и систем;
z z задач линейной алгебры;
z z задач оптимизации.
Кроме того, можно выполнять операции дифференцирования и интегрирования, решать дифференциальные уравнения и задачи обработки экспериментальных данных и множество других задач.
Несмотря на то что система Scilab содержит достаточное количество встроенных команд, операторов и функций, отличительная её черта – это гибкость. Пользователь может создать любую новую команду или функцию,
а затем использовать её наравне со встроенными. К тому же система имеет
достаточно мощный собственный язык программирования высокого уровня,
что говорит о возможности решения новых задач.

14

Глава 1. Пакет Scilab. Начало работы

1.1

Установка Scilab на ПК

Свободно распространяемую версию пакета вместе с полной документацией можно получить на сайте программы www.scilab.org. Онлайн-справка на
русском языке доступна по адресу https://help.scilab.org/docs/2023.1.0/ru_ RU/
index.html. Здесь 2023.1.0 – последняя на момент написания книги версия.
Вместо неё можно указать любую интересующую версию. Доступна справка
по всем версиям.
Кроме того, в любой момент времени пользователь может получить справку по любому объекту Scilab, набрав в командном окне Scilab
help name
Здесь name – служебное слово или встроенная функция Scilab.
Scilab может быть установлен на этапе инсталляции операционной системы «Альт Образование». Пакет находится в репозиториях большинства
современных дистрибутивов: операционные системы семейства «Альт», ОС
Debian, ОС семейства Ubuntu, ОС Linux Mint и др.
В дистрибутивах семейства «Альт» установка Scilab осуществляется командой apt-get от имени администратора.
#apt-get install scilab
Аналогично Scilab устанавливается и в дистрибутивах семейства Debian
и Ubuntu.
#apt install scilab
Также можно скачать одну из последних стабильных двоичных версий
Scilab по адресу https://www.scilab.org/download.
Имя файла архива имеет вид scilab-m.n.k.bin.x86_64-linux-gnu.tar.xz. Адрес
для скачивания обычно такой: https://www.scilab.org/download/m. n.k/scilabm.n.k.bin.x86_64-linux-gnu.tar.xz. Здесь m.n.k – номер версии. После этого архив
надо развернуть. В процессе разархивирования будет создан каталог scilabm.n.k, внутри которого существует каталог bin c исполняемыми файлами программ. Для запуска Scilab необходимо запустить файл scilab1 из каталога bin2.

1.2

Первое знакомство со Scilab

После запуска Scilab на экране появится основное окно приложения. Окно содержит меню, панель инструментов, рабочую область, обозреватель файлов,
обозреватель переменных, журнал команд и окно подачи новостей. Признаком
того, что система готова к выполнению команды, является наличие знака
1
2

Убедитесь, что у вас есть право запуска исполняемого файла Scilab.
Авторы сталкивались с тем, что после запуска Scilab иногда не отображаются
графики. В этом случае имеет смысл попробовать запускать исполняемый файл
так: LIBGL_ALWAYS_SOFTWARE=1 scilab-m.n.k/bin/scilab.

1.2. Первое знакомство со Scilab

15

приглашения -->, после которого расположен активный (мигающий) курсор.
Рабочую область со знаком приглашения обычно называют командной строкой. Ввод команд в Scilab осуществляется с клавиатуры. Нажатие клавиши
Enter заставляет систему выполнить команду и вывести результат (рис. 1.1).

Рис. 1.1. Выполнение элементарной команды в Scilab

Понятно, что все выполняемые команды не могут одновременно находиться в поле зрения пользователя. Поэтому просмотреть ту информацию,
которая покинула видимую часть окна, можно, если воспользоваться стандартными средствами просмотра, например полосами прокрутки или клавишами перемещения курсора Page Up, Page Down.
Клавиши  и  также управляют курсором, однако в Scilab они имеют
другое назначение. Эти клавиши позволяют вернуть в командную строку
ранее введённые команды или другую входную информацию, так как вся эта
информация сохраняется в специальной области памяти. Так, если в пус­той
активной командной строке нажать клавишу , то появится последняя вводимая команда, повторное нажатие вызовет предпоследнюю и т. д. Клавиша
 выводит команды в обратном порядке. Таким образом, можно сказать, что
вся информация в рабочей области находится или в зоне просмотра, или
в зоне редактирования.
Важно знать, что в зоне просмотра нельзя ничего исправить или ввести.
Единственная допустимая операция, кроме просмотра, – это выделение информации с помощью мыши и копирование её в буфер обмена, например
для дальнейшего помещения в командную строку.
Зона редактирования – это фактически командная строка. В ней действуют
элементарные приемы редактирования:  – перемещение курсора вправо
на один символ;  – перемещение курсора влево на один символ; Home –

16

Глава 1. Пакет Scilab. Начало работы

перемещение курсора в начало строки; End – перемещение курсора в конец
строки; Del – удаление символа после курсора; Backspace – удаление символа перед курсором.
Кроме того, существуют особенности ввода команд. Если команда заканчивается точкой с запятой «;», то результат её действия не отображается
в командной строке. В противном случае, при отсутствии знака «;», результат
действия команды сразу же выводится в рабочую область (листинг 1.1).
Листинг 1.1. Использование «точки с запятой» в Scilab
-->2.7*3+3.14/2
ans =
9.67
-->2.7*3+3.14/2;
-->

Текущий документ, отражающий работу пользователя с системой Scilab,
содержащий строки ввода, вывода и сообщения об ошибках, принято называть сессией. Значения всех переменных, вычисленные в течение текущей сессии, сохраняются в специально зарезервированной области памяти,
называемой рабочим пространством системы. При желании определения
всех переменных и функций, входящих в текущую сессию, можно сохранить
в виде файла, саму сессию сохранить нельзя.
Главное меню системы содержит команды, предназначенные для работы
с файлами, настройки среды, редактирования команд текущей сессии и получения справочной информации. Кроме того, с помощью главного меню
можно создавать, редактировать, выполнять отладку и запускать на выполнение так называемые файлы-сценарии Scilab, а также работать с графическими приложениями пакета.

1.3

Редактирование и отладка файлов-сценариев

Файл-сценарий – это список команд Scilab, сохраненный на диске. Для подготовки, редактирования и отладки файлов-сценариев служит специальный
редактор SciNotes, который можно вызвать, выполнив команду главного
меню Файл ⇒ Новый. В результате работы этой команды будет создан новый файл-сценарий. По умолчанию он имеет имя Безымянный документ 1.sce.
Современный текстовый редактор SciNotes выглядит стандартно, имеет
заголовок, меню, панели инструментов, строку состояния, но вместе с тем
имеет достаточно много возможностей, рекомендуем с ним ознакомиться.
Его интерфейс полностью переведён на русский язык.
Ввод текста в окно редактора файла-сценария осуществляется по правилам, принятым для команд Scilab. Рисунок 1.2 содержит пример ввода команд для решения квадратного уравнения 3x2 - 4x - 5 = 0. Точка с запятой
«;» ставится после тех команд, которые не требуют вывода значений.
Для сохранения введённой информации необходимо выполнить команду
Файл ⇒ Сохранить. Если информация сохраняется впервые, то появится

1.3. Редактирование и отладка файлов-сценариев

17

окно Сохранить как…. Ввод имени в поле File Name и щелчок по кнопке OK
приведет к сохранению информации, находящейся в окне редактора. Файлысценарии сохраняют с расширением .sce. Открывает ранее созданный файл
команда главного меню Файл ⇒ Открыть.

Рис. 1.2. Выполнение файла-сценария Scilab

На рис. 1.2 кроме фрагмента рабочей области и окна редактора показано
окно обозревателя переменных. В этом окне пользователь может в любой момент посмотреть значение любой используемой в данной сессии переменной.
Запустить файл-сценарий можно из пункта меню Выполнить:
z z ...файла без отображения команд (Ctrl+Shift+E), команда запускает
файл-сценарий без отображения команд в командном окне Scilab;
z z ...файла с отображением команд (Ctrl+L), команда запускает файлсценарий c отображением команд, команды без «;» выводят результат
в командном окне Scilab;
z z ...до курсора с отображением команд (Ctrl+E), файл-сценарий выполняется до курсора, после приостановки программы в окне обозревателя переменных можно посмотреть значения любой переменной, этот
режим, по существу, является отладочным;

18

Глава 1. Пакет Scilab. Начало работы
zz

сохранить и выполнить (F5);

zz

сохранить и выполнить все файлы (Ctrl+F5).

Отметим, что редактор SciNotes имеет возможность работы со множеством
окон (пункт меню Окно), обладает принятыми для текстовых редакторов
приемами редактирования и поиска (пункт меню Правка). Кроме того, можно выполнить настройку среды редактора SciNotes (пункт меню Настройки),
вызвать справочную информацию (пункт меню Справка).
Выйти из режима редактирования можно, просто закрыв окно SciNotes или
выполнив команду Файл ⇒ Выйти из SciNotes (Ctrl+Q).

1.4 Текстовые комментарии
Текстовый комментарий в Scilab – это строка, начинающаяся с символов
//. Использовать текстовые комментарии можно как в рабочей области, так
и в тексте файла-сценария. Строка после символов // не воспринимается
как команда, и нажатие клавиши Enter приводит к активизации следующей
командной строки.
Листинг 1.2. Пример использования комментария
-->//6+8
-->

При написании кода в редакторе SciNotes можно использовать следующий
синтаксис:
/*Это комментарий, который
может занимать несколько строк*/

1.5

Элементарные математические выражения

Для выполнения простейших арифметических операций в Scilab применяют
следующие операторы: + сложение, - вычитание, * умножение, / деление
слева направо, \ деление справа налево, ^ возведение в степень.
Вычислить значение арифметического выражения можно, если ввести его
в командную строку и нажать клавишу Enter. В рабочей области появится
результат.
Листинг 1.3. Пример арифметического выражения
--> 2.35*(1.8-0.25)+1.34^2/3.12
ans =
4.2180

Если вычисляемое выражение слишком длинное, то перед нажатием клавиши Enter следует набрать три или более точек. Это будет означать продолжение командной строки.

1.6. Переменные в Scilab

19

Листинг 1.4. Выражение, расположенное на нескольких строках
--> 1+2+3+4+5+6....
7+8+9+10+....
+11+12+13+14+15
ans =
120

Если символ «;» указан в конце выражения, то результат вычислений не
выводится, а активизируется следующая командная строка.
Листинг 1.5. Использование «;»
--> 1+2;
--> 1+2
ans =
3

1.6

Переменные в Scilab

В рабочей области Scilab можно определять переменные, а затем использовать
их в выражениях. Любая переменная до использования в формулах и выражениях должна быть определена. Для определения переменной необходимо
набрать имя переменной, символ «=» и значение переменной. Здесь знак
равенства – это оператор присваивания, действие которого не отличается от
аналогичных операторов языков программирования. Таким образом, если
в общем виде оператор присваивания записать как
имя_переменной = значение_выражения
то в переменную, имя которой указано слева, будет записано значение выражения, указанного справа.
Имя переменной не должно совпадать с именами встроенных процедур,
функций и встроенных переменных. Система различает большие и малые буквы в именах переменных. ABC, abc, Abc, aBc – это разные имена. Выражение
в правой части оператора присваивания может быть числом, арифметическим
выражением, строкой символов или символьным выражением. Если речь идет
о символьной или строковой переменной, то выражение в правой части оператора присваивания следует брать в одинарные или двойные кавычки.
Если символ «;» в конце выражения отсутствует, то в качестве результата
выводится имя переменной и её значение. Наличие символа «;» передает
управление следующей командной строке. Это позволяет использовать имена
переменных для записи промежуточных результатов в память компьютера.
Листинг 1.6. Примеры определения переменных
-->//------------------------------------------------->//Присваивание значений переменным а и b
--> a=2.3
a =
2.3000

20

Глава 1. Пакет Scilab. Начало работы

--> b=-34.7
b =
-34.7000
-->//Присваивание значений переменным x и y,
-->//вычисление значения переменной z
--> x=1;y=2; z=(x+y)-a/b
z =
3.0663
-->//Сообщение об ошибке - переменная с не определена
--> c+3/2
Неопределённая переменная: c
-->//------------------------------------------------->//Определение символьной переменной
--> c='a'
c =
a
-->//Определение строковой переменной
--> h='мама мыла раму'
h =мама мыла раму

Для очистки значения переменной можно применить команду
clear;
которая отменяет определения всех переменных данной сессии. Для отмены
определения конкретной переменной используют команду
clear имя_переменной;
Далее приведены примеры применения этой команды.
Листинг 1.7. Пример использования команды clear
-->//Определение переменных x и y
--> x=3; y=-1;
-->//Отмена определения переменной x
--> clear x
-->//Переменная x не определена
--> x
Неопределённая переменная: x
-->//Переменная y определена
--> y
y =
-1
-->//Определение переменных a и b
-->a=1;b=2;
-->//Отмена определения переменных
-->clear;
-->//Переменные a и b не определены
-->a
Неопределённая переменная: a
-->b
Неопределённая переменная: b

a

и

b

1.7. Системные переменные Scilab

21

1.7 Системные переменные Scilab
Если команда не содержит знака присваивания, то по умолчанию вычисленное значение присваивается специальной системной переменной ans. Причём полученное значение можно использовать в последующих вычислениях, но важно помнить, что значение ans изменяется после каждого вызова
коман­ды без оператора присваивания.
Листинг 1.8. Пример работы с переменной ans
--> 25.7-3.14
ans =
22.56
--> //Значение системной переменной равно 22.5600
--> 2*ans
ans =
45.12
--> //Значение системной переменной увеличено вдвое
--> x=ans^0.3
x =
3.1355283
--> ans
ans =
45.12
--> //После использования в выражении значение
--> //системной переменной не изменилось и равно 45.12

Результат последней операции без знака присваивания хранится в переменной ans. Другие системные переменные в Scilab начинаются с символа %:
z z %i – мнимая единица ( -1);
z z %pi – число π = 3.141592653589793;
z z %e – число e = 2.7182818;
z z %inf – машинный символ бесконечности (¥);
z z %NaN – неопределённый результат (0/0, ¥/¥ и т. п.);
z z %eps – условный ноль %eps=2.220Е-16.
Все перечисленные переменные можно использовать в математических
выражениях.
Листинг 1.9. Использование встроенных переменных
-->a=5.4;b=0.1;
-->F=cos(%pi/3)+(a-b)*%e^2
F =
39.661997

Далее показан пример неверного обращения к системной переменной.
Листинг 1.10. Неправильное обращение к переменной %pi
-->sin(pi/2)
Неопределённая переменная: pi

22

Глава 1. Пакет Scilab. Начало работы

1.8 Числовые типы данных и представление
результатов вычислений в Scilab
1.8.1 Целые числа в Scilab
Современный Scilab поддерживает работу с одно-, двух-, четырёх- и восьмибайтными целыми числами.
Для преобразования данных числового типа в определённый целочисленный предусмотрены следующие функции:
z z y=int8(x) – преобразование в однобайтное представление целого числа, диапазон чисел -128…127;
z z y=uint8(x) – преобразование в однобайтное представление беззнакового целого числа, диапазон чисел 0…255;
z z y=int16(x) – преобразование в двухбайтное представление целого числа, диапазон чисел -32 768 (-215)…32 767 (215 - 1);
z z y=uint16(x) – преобразование в двухбайтное представление беззнакового целого числа, диапазон чисел 0…65 535 (216 - 1);
z z y=int32(x) – преобразование в четырёхбайтное представление целого
числа, диапазон чисел -2 147 483 648 (-231)…-2 147 483 647 (231 - 1);
z z y=uint32(x) – преобразование в четырёхбайтное представление беззнакового целого числа, диапазон чисел 0…4 294 967 295 (232 - 1);
z z y=int64(x) – преобразование в восьмибайтное представление целого
числа, диапазон чисел
-9 223 372 036 854 775 808 (-263)…-9 223 372 036 854 775 807 (263 - 1);
z z y=uint64(x) – преобразование в восьмибайтное представление беззнакового целого числа, диапазон чисел 0…18 446 744 073 709 551 615
(264 - 1).
Здесь x – мат­ри­ца любого числового типа, y – мат­ри­ца соответствующего
целочисленного типа.

1.8.2 Представление вещественных чисел в Scilab
Числовые результаты могут быть представлены с плавающей (например,
-3.2Е-6, -6.42Е+2) или с фиксированной (например, 4.12, 6.05, -17.5489)
точкой. Числа в формате с плавающей точкой представлены в экспоненциальной форме mE±p, где m – мантисса (целое или дробное число с десятичной
точкой); p – порядок (целое число). Чтобы привести число в экспоненциальной форме к обычному представлению с фиксированной точкой, необходимо
мантиссу умножить на десять в степени порядок.
Например:
-6.42Е+2 = -6.42 · 102 = -642,

3.2E-6 = 3.2 · 10-6 = 0.0000032.

При вводе вещественных чисел для отделения дробной части используется
точка. Примеры ввода и вывода вещественных чисел.

1.8. Числовые типы данных и представление результатов вычислений в Scilab

23

Листинг 1.11. Примеры определения вещественных чисел
-->0.123
ans =
0.123
-->-6.42e+2
ans =
- 642.
-->3.2e-6
ans =
0.0000032

Рассмотрим пример вывода значения системной переменной π и некоторой переменной q, определённой пользователем.
Листинг 1.12. Вывод вещественных чисел
-->%pi
%pi =
3.1415927
-->q=0123.4567890123456
q =
123.45679

Нетрудно заметить, что Scilab в качестве результата выводит только восемь значащих цифр. Это формат вывода вещественного числа по умолчанию. Для того чтобы контролировать количество выводимых на печать
разрядов, применяют команду printf с заданным форматом, который соответствует правилам, принятым для этой команды в языке С.
Листинг 1.13. Вывод вещественных чисел с использованием функции printf
-->printf("%1.12f",%pi) 3.141592653590
-->printf("%1.15f",%pi) 3.141592653589793
-->printf("%1.2f",q) 123.46
-->printf("%1.10f",q)
123.4567890123
-->//По умолчанию 6 знаков после запятой
-->printf("%f",q)
1123.456789

Для преобразования к вещественному типу используется функция
y=double(x)
Здесь x – мат­ри­ца любого числового типа, y – мат­ри­ца вещественного типа
double1.

1.8.3 Представление комплексных чисел в Scilab
Комплексные числа в Scilab представляются в виде пары вещественных чисел. Предопределённая константа %i представляет собой мнимую единицу.
Элементарные функции работают с комплексными числами. В этом случае
возвращаемое значение также будет комплексным. Ниже приведены наиболее часто используемые функции:
1

Совпадает с типом double стандартов языков C(C++).

24

Глава 1. Пакет Scilab. Начало работы

complex – создаёт комплексное число;
z z real – возвращает действительную часть комплексного числа;
z z imag – возвращает мнимую частькомплексного числа;
z z imult – умножает число на мнимую единицу;
z z isreal – проверяет отсутствие мнимой части.
Для примера присвоим переменной х значение 1+i и выполним над этой
переменной несколько простых операций.
zz

// Создание комплексного числа с помощью %i
-->х = 1 + %i
x = 1. + i
//Вывод сопряженного числа
-->х'
ans = 1. - i
//Вывод вещественной части числа
-->real(x)
ans = 1.
//Вывод мнимой части сопряженного числа
-->imag(x')
ans = - 1.
// Проверка равенства (1 + i)(1 - i) = 1 - i^2 = 2
-->х * x'
ans = 2.
// Создание комплексного числа с помощью функции
--> complex(2,3)
ans = 2. + 3.i
// Создание комплексного числа без мнимой части
--> m=complex(2)
m = 2.
//Проверка, является ли число комплексным
--> isreal(m)
ans = F

1.9

Функции в Scilab

Все функции, используемые в Scilab, можно разделить на два класса:
z z встроенные;
z z определённые пользователем.
В общем виде обращение к функции в Scilab имеет вид:
имя_переменной = имя_функции(переменная1 [,переменная2, ...])
где имя_переменной – переменная, в которую будут записаны результаты
работы функции (этот параметр может отсутствовать, тогда значение, вычисленное функцией, будет присвоено системной переменной ans); имя_
функции – имя встроенной или ранее созданной пользователем функции;
переменная1, переменная2, ... – список аргументов функции.

25

1.9. Функции в Scilab

1.9.1 Элементарные математические функции
Пакет Scilab снабжен достаточным количеством всевозможных встроенных
функций, знакомство с которыми будет происходить в следующих разделах.
Здесь приведём только элементарные математические функции, используе­
мые чаще всего (табл. 1.1).
Таблица 1.1. Элементарные математические функции
Функция

Описание функции

Тригонометрические
sin(x)
cos(x)
tan(x)
cotg(x)
asin(x)
acos(x)
atan(x)

Синус числа x
Косинус числа x
Тангенс числа x
Котангенс числа x
Арксинус числа x
Арккосинус числа x
Арктангенс числа x

Экспоненциальные
exp(x)
log(x)

Экспонента числа x
Натуральный логарифм числа x

Другие
sqrt(x)
abs(x)
log10(x)
log2(x)
round(x)
nthroot(x,n)
factorial(x)

Корень квадратный из числа x
Модуль числа x
Десятичный логарифм от числа x
Логарифм по основанию два от числа x
Округление числа x
Корень степени n числа x
Факториал числа x

Задача 1.1
Вычислить значение выражения

Листинг 1.14. Вычисление математического выражения
-->x=1.2;y=0.3;
-->z=sqrt(abs(sin(x/y)))*exp(x^y)
z =
2.5015073

1.9.2 Функции, определённые пользователем
Функция, как правило, предназначена для неоднократного использования,
она имеет входные параметры и не выполняется без их предварительного
определения. Рассмотрим несколько способов создания функций в Scilab.

26

Глава 1. Пакет Scilab. Начало работы

Первый способ – это применение оператора deff, который в общем виде
можно записать так:
deff('[имя1,...,имяN] = имя_функции(переменная_1,...,переменная_M)',
'имя1=выражение1;...;имяN=выражениеN')
где имя1,...,имяN – список выходных параметров, которым будет присвоен конечный результат вычислений; имя_функции – имя, с которым эта
функция будет вызываться; переменная_1,...,переменная_M – входные параметры.
Далее приведен самый простой способ применения оператора deff. Здесь
показано, как создать и применить функцию для вычисления выражения

(значение этого выражения уже вычислено в листинге 1.15).
Листинг 1.15. Пример определения функции с помощью оператора deff
-->deff('z=fun1(x,y)','z=sqrt(abs(sin(x/y)))*exp(x^y)');
-->x=1.2;y=0.3;z=fun1(x,y)
z = 2.5015073

Рассмотрим пример создания и применения функции, вычисляющей площадь треугольника со сторонами a, b и c по формуле Герона
где

Листинг 1.16. Функция вычисления площади треугольника
-->deff('S=G(a,b,c)','p=(a+b+c)/2;S=sqrt(p*(p-a)*(p-b)*(p-c))');
-->G(2,3,3)
ans = 2.8284271;

В следующем листинге приведен пример создания и применения функции, с помощью которой можно найти корни квадратного уравнения вида
ax2 + bx + c = 0 по формулам D = b2 - 4ac;
Листинг 1.17. Функция решения квадратного уравнения
//Функция должна быть объявлена в одной строке
-->deff('[x1,x2]=korni(a,b,c)','d=b^2-4*a*c;
x1=(-b+sqrt(d))/2/a;x2=(-b-sqrt(d))/2/a');
-->[x1,x2]=korni(-2,-3,5)
x2 = 1.
x1 = -2.5

27

1.9. Функции в Scilab

Второй способ создания функции – это применение конструкции вида:
function[имя1,...,имяN]=имя_функции(переменная_1,...,переменная_M)
тело функции
endfunction
или
function[имя1,...,имяN]=имя_функции(переменная_1,...,переменная_M)
тело функции
end
где имя1,...,имяN – список выходных переменных, которым будет присвоен
конечный результат вычислений; имя_функции – имя, с которым эта функция
будет вызываться; переменная_1,...,переменная_M – входные параметры.
Все имена переменных внутри функции, а также имена из списка входных
и выходных параметров воспринимаются системой как локальные, т. е. считаются определёнными только внутри функции.
Вообще говоря, функции в Scilab играют роль подпрограмм. Поэтому целесообразно набирать их тексты в редакторе и сохранять в виде отдельных
файлов. Причём имя файла должно обязательно совпадать с именем функции. Расширение файлам-функциям обычно присваивают sci или sce.
Обращение к функции осуществляется так же, как и к любой другой встроенной функции системы, т. е. из командной строки. Однако функции, хранящие­
ся в отдельных файлах, должны быть предварительно загружены в систему,
например при помощи оператора exec(имя_файла) или командой главного
меню File ⇒ Exec….
Задача 1.2.
Решить кубическое уравнение.
Кубическое уравнение
ax3 + bx2 + cx + d = 0

(1.1)

после деления на a принимает канонический вид:
x3 + rx2 + sx + t = 0,
где

В уравнении (1.2) сделаем замену

(1.2)

28

Глава 1. Пакет Scilab. Начало работы

и получим следующее приведённое уравнение:
y3 + py + q = 0,

(1.3)

где

Число действительных корней приведённого уравнения (1.3) зависит от
знака дискриминанта

(табл. 1.2).

Таблица 1.2. Количество корней кубического уравнения
Количество
Дискриминант действительных корней

Количество
комплексных корней

D³0
Dexec('./cub.sce');
-->[x1,x2,x3]=cub(3,-20,-3,4)
x3 =
0.3880206
x2 =
- 0.5064407
x1 =
6.7850868

29

Глава 2

Программирование в Scilab
В Scilab встроен мощный язык программирования с поддержкой объектов.
В этой главе будут описаны возможности структурного программирования.
Как уже отмечалось ранее, работа в Scilab может осуществляться не только
в режиме командной строки, но и в так называемом программном режиме.
Напомним, что для создания программы (программу в Scilab иногда называют сценарием) необходимо:
1) выполнить команду меню Инструменты ⇒ Текстовый редактор
sciNotes;
2) в окне редактора sciNotes набрать текст программы (см. рис. 2.1);
3) сохранить текст программы с помощью команды Файл ⇒ Сохранить
в виде файла с расширением sce, например file.sce;

Рис. 2.1. Окно SciNotes с программой решения кубического уравнения

2.1. Основные операторы sci-языка

31

4) после этого программу можно будет вызвать, набрав в командной строке exec, например exec("file.sce"). Другие способы вызова – воспользоваться командой меню Файл ⇒ Выполнить… или, находясь в окне
SciNotes, выполнить команду Сохранить и выполнить (F5).
Программный режим достаточно удобен, так как позволяет сохранить разработанный алгоритм в виде файла и повторять его при других исходных
данных в иных сессиях. В программных файлах можно использовать операторы языка программирования Scilab (язык программирования Scilab будем
называть sci-языком).

2.1

Основные операторы sci-языка

Изучение sci-языка начнем с функций ввода-вывода.

2.1.1 Функции ввода-вывода в Scilab
Даже при разработке простейших программ возникает необходимость ввода
исходных данных и вывода результатов. Для ввода исходных данных следует
использовать функцию
имя_переменной = input('подсказка');
Если в тексте программы встречается оператор input, то выполнение программы приостанавливается, Scilab выводит в командную строку текст подсказки и переходит в режим ожидания ввода. Пользователь вводит с клавиатуры
значение и нажимает клавишу Enter. Введённое пользователем значение будет
присвоено переменной, имя которой указано слева от знака присваивания.
Для вывода результатов можно использовать функцию следующей структуры: disp('строка_символов') или disp(имя_переменной).
Задача 2.1
Создать программу для вычисления значения y по формуле y = sin(x) при
заданном значении x.
Текст программы и результаты её работы приведены далее.
Листинг 2.1. Решение задачи 2.1
x=input('Введите значение x = ');
y=sin(x);
disp('Значение y = ');
disp(y);
//Результат работы программы
Значение y = -0.5440211

Для организации простейшего ввода в Scilab можно также воспользоваться
функцией
x=x_dialog('title', 'stroka');

32

Глава 2. Программирование в Scilab

x_dialog выводит на экран диалоговое окно с именем title и значением
по умолчанию stroka. После этого пользователь может нажать OK, и тогда
stroka вернется в качестве результата в переменную x. Или можно ввести
новое значение вместо stroka, которое и вернется в качестве результата
в переменную x. На рис. 2.2 представлено диалоговое окно, которое формируется строкой x=x_dialog('Input X', '5').

Рис. 2.2. Окно ввода

Функция x_dialog возвращает строковое значение. Для получения числового значения следует полученную строку преобразовать в число. Для этого
используется функция evstr. Пример использования функции x_dialog для
получения числовых значений:
x=evstr(x_dialog('title','stroka'));

2.1.2 Форматированный вывод
Форматированный ввод-вывод данных в Scilab осуществляется с помощью
функций printf и scanf. Функция
printf(строка_форматов, список_выводимых_переменных);
выполняет форматированный вывод переменных, указанных в списке, в соответствии со строкой форматов.
Функция
переменная = scanf(строка_форматов);
выполняет ввод переменных, адреса которых указаны в списке, в соответствии
со строкой форматов. Строка форматов содержит символы, которые будут
выводиться на экран или запрашиваться с клавиатуры, и так называемые
спецификации.
Спецификации – это строки, которые начинаются символом % и выполняют
управление форматированием: % флаг ширина . точность модификатор тип.
Параметры флаг, ширина, точность и модификатор в спецификациях могут
отсутствовать.
Значения параметров строки преобразования приведены в табл. 2.1.
В строке вывода могут использоваться некоторые специальные символы,
приведённые в табл. 2.2.

33

2.1. Основные операторы sci-языка

Таблица 2.1. Значение параметров строки преобразования
Параметр Назначение
Флаг
+
Пробел
#

Выравнивание числа влево. Правая сторона дополняется пробелами.
По умолчанию выравнивание вправо
Перед числом выводится знак «+» или «–»
Перед положительным числом выводится пробел, перед
отрицательным – «–»
Выводится код системы счисления: 0 – перед восьмеричным,
0х (0Х) – перед шестнадцатеричным числом
Ширина

0n

Ширина поля вывода. Если n позиций недостаточно, то поле вывода
расширяется до минимально необходимого. Незаполненные позиции
заполняются пробелами
То же, что и n, но незаполненные позиции заполняются нулями

ничего
n

Точность по умолчанию
Для типов e, E, f выводить n знаков после десятичной точки

n

Точность

Тип
с
d, i
o
u
x, X
f
e
E
g
G
s

При вводе символьный тип char, при выводе один байт
Десятичное со знаком
Восьмеричное int unsigned
Десятичное без знака
Шестнадцатеричное int unsigned, при х используются символы a-f,
при Х – A-F
Значение со знаком вида [-]dddd.dddd
Значение со знаком вида [-]d.dddde[+|-]ddd
Значение со знаком вида [-]d.ddddE[+|-]ddd
Значение со знаком типа e или f в зависимости от значения и точности
Значение со знаком типа E или F в зависимости от значения и точности
Строка символов
Модификатор (типа)

h
l

Для d, i, o, u, x, X короткое целое
Для d, i, o, u, x, X длинное целое

Таблица 2.2. Некоторые специальные символы
Символ

Назначение

\b
\n
\r
\t
\'
\”
\?

Сдвиг текущей позиции влево
Перевод строки
Перевод в начало строки без перехода на новую строку
Горизонтальная табуляция
Символ одинарной кавычки
Символ двойной кавычки
Символ «?»

34

Глава 2. Программирование в Scilab

Рассмотрим работу функций на примере следующей задачи.
Задача 2.2
Зная a, b, c – длины сторон треугольника, вычислить площадь S и периметр P
этого треугольника.
Входные данные: a, b, c. Выходные данные: S, P. Для вычисления площади
применим формулу Герона:

где

– полупериметр.

Листинг 2.2. Решение задачи 2.2
//Вывод на экран символов 'Введите значение а:'.
mprintf("Введите значение а: ");
//Запись в переменную а значения, введённого с клавиатуры.
a = mscanf("%f");
//Вывод на экран символов 'Введите значение b:'.
mprintf("Введите значение b: ");
//Запись в переменную b значения, введённого с клавиатуры.
b = mscanf("%f");
//Вывод на экран символов 'Введите значение c:'.
mprintf("Введите значение c: ");
//Запись в переменную c значения, введённого с клавиатуры.
c = mscanf("%f");
//Вычисление полупериметра.
r=(a+b+c)/2;
//Вычисление площади треугольника.
S=sqrt(r*(r-a)*(r-b)*(r-c));
//Вывод символов 'S=', значения S и символа табуляции \t.
//Спецификация %5.2f означает, что будет выведено вещественное
//число из пяти знаков, два из которых после точки.
mprintf("S=%5.2f \t",S);
//Вывод символов 'p=', значения выражения 2*r
//и символа окончания строки.
mprintf("p=%5.2f \n",2*r);
//Результат работы:
Введите значение а:
--> 3
Введите значение b:
--> 4
Введите значение c:
--> 5
S= 6.00
p=12.00

2.1. Основные операторы sci-языка

35

2.1.3 Оператор присваивания
Оператор присваивания служит как для определения новой переменной, так
и для перезаписи значения уже существующей переменной. Для того чтобы
определить новую переменную, достаточно присвоить ей значение:
имя_переменной = значение_выражения
Чтобы присвоить новое значение уже существующей переменной, используется тот же синтаксис:
имя_переменной = значение_выражения
Любую переменную Scilab воспринимает как мат­ри­цу. В простейшем случае мат­ри­ца может состоять из одной строки и одного столбца. Работа с массивами и мат­ри­цами будет рассмотрена подробнее в следующих разделах.
Примеры работы с переменной:
--> m=pi
m = 3.1416
--> m
m = 3.1416
--> m(1)
ans = 3.1416
--> m(1,1)
ans = 3.1416
--> m(1,2)
Недопустимый индекс.
--> m(3)
Недопустимый индекс.
--> M=e; M(3,3)=e/2;
--> M
M =
2.71828
0.00000
0.00000
0.00000
0.00000
0.00000
0.00000
0.00000
1.35914

2.1.4 Условный оператор
Одним из основных операторов, реализующих ветвление в большинстве
языков программирования, является условный оператор. Существуют обычная, сокращённая и расширенная формы этого оператора в языке программирования Scilab.
Сокращённый условный оператор записывают так:
if условие
операторы
end

Работает этот оператор следующим образом. Если условие истинно, то выполняются операторы, в противном случае управление передаётся оператору,
следующему за оператором if.

36

Глава 2. Программирование в Scilab

Листинг 2.3. Пример работы условного оператора
x=input('x=');
y=input('y=');
z=0;
if (x=-1) & (x=-2) & (y (больше), =
(равно), ˜=, (не равно), = (больше или равно).
Задача 2.5
Создать программу для решения биквадратного уравнения ax4 + bx2 + c
= 0.
Для решения биквадратного уравнения необходимо заменой y = x2 привести его к квадратному и решить это уравнение. После этого для нахождения
корней биквадратного уравнения необходимо будет извлечь корни из найденных значений y. Входными данными этой задачи являются коэффициенты биквадратного уравнения a, b, c. Выходными данными являются корни
уравнения x1, x2, x3, x4 или сообщение о том, что действительных корней нет.
Алгоритм состоит из следующих этапов:
1) ввод коэффициентов уравнения a, b и c;
2) вычисление дискриминанта уравнения d;
3) если d < 0, определяются y1 и y2, в противном случае выводится сообщение «Корней нет»;
4) если y1 < 0 и y2 < 0, то вывод сообщения «Корней нет»;
5) если y1 ³ 0 и y2 ³ 0, то вычисляются четыре корня по формулам ± y1,
± y2 и выводятся значения корней;
6) если условия 4 и 5 не выполняются, то необходимо проверить знак y1;
7) если y1 неотрицательно, то вычисляются два корня по формуле ± y1,
иначе оба корня вычисляются по формуле ± y2.
Программа решения биквадратного уравнения на sci-языке приведена
в листинге 2.6, её вызов и результаты – в листинге 2.7.
Листинг 2.6. Программа решения биквадратного уравнения
//Ввод значений коэффициентов биквадратного уравнения.
a=input('a=');
b=input('b=');

40

Глава 2. Программирование в Scilab

c=input('c=');
//Вычисляем дискриминант.
d=b*b-4*a*c;
//Если дискриминант отрицателен,
if d=0
//Если y1 положителен, то
//вычисление двух корней биквадратного
//уравнения извлечением корня из y1,
x1=sqrt(y1);
x2=-x1;
disp(x1);
disp(x2);
//иначе (остался один вариант - y2 положителен)
//вычисление двух корней биквадратного уравнения
//извлечением корня из y2.
else
x1=sqrt(y2);
x2=-x1;
disp(x1);
disp(x2);
end
end
end

2.1. Основные операторы sci-языка

41

Листинг 2.7. Решение биквадратного уравнения
-->exec("l1.sci");
a=-->-6
b=-->9
c=-->-1
Четыре действительных корня
0.3476307
1.1743734
- 0.3476307
0.3476307

Найти корни биквадратного уравнения можно и без оператора if, воспользовавшись тем, что в Scilab определены операции над комплексными
числами (см. листинг 2.8).
Листинг 2.8. Решение биквадратного уравнения
a=input('a=');
b=input('b=');
c=input('c=');
d=b*b-4*a*c;
y1=(-b+sqrt(d))/2/a;
y2=(-b-sqrt(d))/2/a;
x1=sqrt(y1);
x2=-x1;
x3=sqrt(y2);
x4=-x3;
disp(x1,x2,x3,x4);

Листинг 2.9. Результат работы программы
-->a=3
-->b=8
-->c=-1
-1.6692213i
1.6692213i
-0.3458800
0.3458800

2.1.5 Оператор альтернативного выбора
Ещё одним способом организации разветвлений является оператор альтернативного выбора select:
select параметр
case значение1 then операторы1
case значение2 then операторы2
...
else операторы
end

42

Глава 2. Программирование в Scilab

Оператор select работает следующим образом: если значение парамет­
ра равно значению1, то выполняются операторы1, иначе, если параметр равен значению2, выполняются операторы2. В противном случае, если значение параметра совпадает со значением3, выполняются операторы3 и т. д. Если
значение параметра не совпадает ни с одним из значений в группах case, то
выполняются операторы, которые идут после служебного слова else.
Конечно, любой алгоритм можно запрограммировать без использования
оператора select, применяя только if, но использование оператора альтернативного выбора select делает программу более компактной.
Рассмотрим применение оператора select на примере решения следующей задачи.
Задача 2.6
Вывести на печать название дня недели, соответствующее заданному числу D, при условии что в месяце 31 день и 1-е число – понедельник.
Для решения задачи воспользуемся условием, что 1-е число – понедельник.
Если в результате остаток от деления заданного числа D на семь будет равен
единице, то это понедельник, двойке – вторник, тройке – среда и т. д. Вычислить остаток от деления числа x на k можно c помощью функции pmodulo.
pmodulo(x,k);
Эта функция в качестве результата возвращает остаток от деления числа x
на число k.
При построении алгоритма необходимо использовать семь условных операторов.
Решение задачи станет значительно проще, если при написании программы воспользоваться оператором варианта (см. листинг 2.10). Вызов программы представлен в листинге 2.11.
Листинг 2.10. Решение задачи 2.6
D=input('Введите число от 1 до 31: ');
//Вычисление остатка от деления D на 7, сравнение его с числами
//от 0 до 6.
select pmodulo(D,7)
case 1 then disp('Понедельник');
case 2 then disp('Вторник');
case 3 then disp('Среда');
case 4 then disp('Четверг');
case 5 then disp('Пятница');
case 6 then disp('Суббота');
else
disp('Воскресенье');
end

2.1. Основные операторы sci-языка

43

Листинг 2.11. Вызов функции для решения задачи
-->exec('l2.sci');
Введите число от 1 до 31
-->19
Пятница

Оператор альтернативного выбора также может иметь следующую структуру:
switch параметр
case значение1
операторы1
case значение2
операторы2
case значение3
операторы3
...
otherwise
операторы
end

Оператор switch работает аналогично оператору select. Различие только
в синтаксисе.
Листинг 2.12. Решение задачи 2.6 с помощью switch
D=input('Введите число от 1 до 31: ');
//Вычисление остатка от деления D на 7, сравнение его с числами
//от 0 до 6.
switch pmodulo(D,7)
case 1 then disp('Понедельник');
case 2 then disp('Вторник');
case 3 then disp('Среда');
case 4 then disp('Четверг');
case 5 then disp('Пятница');
case 6 then disp('Суббота');
otherwise
disp('Воскресенье');
end

2.1.6 Оператор цикла while
Оператор цикла с предусловием в языке программирования Scilab имеет
вид:
while выражение
операторы
end

44

Глава 2. Программирование в Scilab

Работает цикл с предусловием следующим образом. Вычисляется значение
условия выражение. Если оно истинно, выполняются операторы. В противном
случае цикл заканчивается, и управление передаётся оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла.
Если при первой проверке выражение ложно, цикл не выполнится ни разу.
Выражение должно быть переменной или логическим выражением.
Задача 2.7
Дано натуральное число N. Определить количество цифр в числе.
Для того чтобы подсчитать количество цифр в числе, необходимо определить, сколько раз заданное число можно разделить на десять нацело. Например, пусть N = 12345, тогда количество цифр kol = 5. Результаты вычислений
сведены в табл. 2.3.
Таблица 2.3. Определение количества цифр числа
kol

N

1
2
3
4
5
5

12345
12345/10=1234
1234/10=123
123/10=12
12/10=1
1/10=0

Текст программы, реализующей данную задачу, можно записать так.
Листинг 2.13. Решение задачи 2.7
N = input('N=');
// Сохранить значение переменной N.
M = N;
// Число содержит хотя бы одну цифру.
kol=1;
// Выполнять тело цикла, пока частное от деления
// M на 10, округлённое до целого, больше 0.
while round(M/10) > 0
// Счётчик количества цифр
kol = kol + 1;
// Изменение числа.
M = round(M/10);
end
disp('kol=');
disp(kol);
// Результат работы программы
N= 12345678
kol= 8

2.1. Основные операторы sci-языка

45

2.1.7 Оператор for
Цикл с известным числом повторений реализован с помощью оператора for:
for параметр = начальное_значение:шаг:конечное_значение
операторы
end

Выполнение цикла начинается с присвоения параметру цикла начального_
значения. Затем следует проверка, не превосходит ли параметр цикла
конечное_значение. Если результат проверки утвердительный, цикл считается завершённым и управление передаётся следующему за телом цикла оператору. В противном случае выполняются операторы в цикле. Далее
параметр увеличивает своё значение на значение шага и снова производится
проверка – не превзошло ли значение параметра цикла конечное_значение.
В случае положительного ответа алгоритм повторяется, в противном – цикл
завершается.
Если шаг цикла равен 1, то оператор записывают так:
for параметр = начальное_значение:конечное_значение
операторы
end

Задача 2.8
Дано натуральное число N. Определить K – количество делителей этого
числа, которые меньше его. Например, для N = 12 делители 1, 2, 3, 4, 6.
Количество делителей K = 5.
Для решения поставленной задачи нужно реализовать следующий алгоритм: в переменную K, предназначенную для подсчёта количества делителей
заданного числа, поместить значение, которое не влияло бы на результат,
т. е. ноль. Далее организовать цикл, в котором изменяющийся параметр i
выполняет роль возможных делителей числа N. Если заданное число делится нацело на параметр цикла, это означает, что i является делителем N
и значение переменной K следует увеличить на единицу. Цикл необходимо
повторить только N/2 раз1.
Листинг 2.14. Количество делителей числа (к примеру 2.8)
N = input('N = ');
// Количество делителей числа
K = 0;
for i = 1 : N / 2
// Если N делится нацело на i, то
if pmodulo(N, i) == 0
// увеличить счётчик на единицу.
1

Если делитель числа меньше самого числа, значит, он не превосходит его половины. – Прим. ред.

46

Глава 2. Программирование в Scilab

K=K+1;
end
end
disp('K = ');
disp(K);
// Результат работы программы
N = 12
K = 5

2.1.8 Операторы передачи управления
Операторы передачи управления принудительно изменяют порядок выполнения команд. В языке программирования Scilab таких операторов два.
Операторы break и continue используют только внутри циклов. Так, оператор
break осуществляет немедленный выход из циклов while, for, и управление
передаётся оператору, находящемуся непосредственно за циклом. Оператор
continue начинает новую итерацию цикла, даже если предыдущая не была
завершена.
Задача 2.9
Дано натуральное число N. Определить, является ли оно простым. Натуральное число N называется простым, если оно делится нацело без остатка
только на единицу и N. Число 13 – простое, так как делится только на 1 и 13,
12 не является простым, так как делится на 1, 2, 3, 4, 6 и 12.
Алгоритм решения этой задачи заключается в том, что число N делится на
параметр цикла i, изменяющийся в диапазоне от 2 до корня из числа N. Если
среди значений параметра не найдётся ни одного числа, делящего заданное
число нацело, то N – простое число, иначе оно таковым не является. Разумно
предусмотреть в программе два выхода из цикла. Первый – естественный,
при исчерпании всех значений параметра, а второй – досрочный, с помощью
оператора break. Нет смысла продолжать цикл, если будет найден хотя бы
один делитель из указанной области изменения параметра.
Текст программы приведён в листинге 2.15.
Листинг 2.15. Является ли число простым (к задаче 2.9)
N=input('Введите число ');
// Предполагаем, что число N является простым (pr=1).
pr=1;
// Перебираем все возможные делители числа N от 2 до N/2.
for i=2:sqrt(N)
// Если N делится на i,
if pmodulo(N,i)==0
// то число N не является простым (pr=0)
pr=0;
// и прерывается выполнение цикла.
break;

2.2. Обработка массивов и матриц в Scilab

47

end
end
// Если pr равно 1, то N --- простое число.
if pr==1
disp('ПРОСТОЕ ЧИСЛО')
// Если pr равно 0, то N --- не является простым.
else
disp('НЕ ЯВЛЯЕТСЯ ПРОСТЫМ ЧИСЛОМ')
end
// Результаты работы программы
// Вводим сначала число 12, затем 13
Введите число 12
НЕ ЯВЛЯЕТСЯ ПРОСТЫМ ЧИСЛОМ
//---------------------------Введите число 13
ПРОСТОЕ ЧИСЛО

2.2

Обработка массивов и матриц в Scilab

Для работы со множеством данных удобно использовать массивы. Например, можно создать массив для хранения числовых или символьных данных.
В этом случае вместо создания переменной для хранения каждого данного
достаточно создать один массив, где каждому элементу будет присвоен порядковый номер. Таким образом, массив – множественный тип данных, состоящий из фиксированного числа элементов. Как и любой другой переменной, массиву должно быть присвоено имя. Переменную, представляющую
собой просто список данных, называют одномерным массивом, или вектором.
Для доступа к данным, хранящимся в определённом элементе массива, необходимо указать имя массива и порядковый номер этого элемента, называемый
индексом.
Если возникает необходимость хранения данных в виде таблиц, в формате
строк и столбцов, то необходимо использовать двумерные массивы (мат­ри­цы).
Для доступа к данным, хранящимся в таком массиве, необходимо указать
имя массива и два индекса: первый должен соответствовать номеру строки,
а второй – номеру столбца, на пересечении которых находится необходимый
элемент.
Значение нижней границы индексации в Scilab равно единице. Индексы
могут быть только целыми положительными числами.
Для работы с массивами в Scilab предусмотрено большое количество
встроенных функций, подробно будем говорить о них позже. В этой главе
рассмотрим основные алгоритмы поэлементной обработки массивов и мат­
ри­ц и их реализацию на sci-языке.

2.2.1 Ввод-вывод массивов и матриц
Ввод массивов и мат­ри­ц следует организовывать поэлементно. В листингах 2.16 и 2.17 приведены программы ввода элементов массивов и мат­ри­ц
на sci-языке.

48

Глава 2. Программирование в Scilab

Листинг 2.16. Ввод элементов массива
N=input('N=');
disp('Ввод массива x');
for i=1:N
x(i)=input('X=');
end
disp(x);

Листинг 2.17. Ввод элементов матрицы
N=input('N=');
M=input('M=');
disp('Ввод матрицы');
for i=1:N
for j=1:M
a(i,j)=input('');
end
end
disp(a);

Вывод массива (мат­ри­цы) можно организовать аналогичным образом
в цикле или воспользоваться оператором disp для вывода массива (мат­ри­
цы) целиком1.

2.2.2 Вычисление суммы и произведения элементов массива
(матрицы)
В sci-языке существует функция
length(x)
Данная функция позволяет узнать размер массива x, т. е. количество элементов в нём.
Аналогично для мат­ри­ц существует функция
size(A)
которая позволяет узнать размеры мат­ри­цы А.
Теперь рассмотрим алгоритм нахождения суммы элементов массива. Изначально сумма равна 0 (s = 0). Затем к s добавляем первый элемент массива
и результат записываем в переменную s. Далее к переменной s добавляем
второй элемент массива и результат записываем в s и потом аналогично добавляем к s остальные элементы массива.
Листинг 2.18. Вычисление суммы элементов массива
//Записываем в переменную s число 0.
s=0;
//Перебираем все элементы массива
1

Напоминаем читателю, что если после имени массива (мат­ри­цы) не поставить
точку с запятой, то массив (мат­ри­ца) будет выведен в окне Scilab.

2.2. Обработка массивов и матриц в Scilab

49

for i=1:length(x)
//накопление суммы
s=s+x(i);
end

При нахождении суммы элементов мат­ри­цы последовательно суммируем
элементы всех строк.
Листинг 2.19. Вычисление суммы элементов матрицы
s=0;
//Вычисляем количество строк N и столбцов M матрицы A.
[N,M]=size(A);
for i=1:N
for j=1:M
s=s+a(i,j);
end
end
disp(s);

Алгоритм нахождения произведения элементов следующий: на первом
этапе начальное значение произведения равно 1 (p = 1). Затем p последовательно умножается на очередной элемент, результат записывается в p и т. д.
В листингах 2.20–2.21 представлены элементы программ, реализующие эти
алгоритмы.
Листинг 2.20. Вычисление произведения элементов массива
p=1;
for i=1:length(x)
p=p*x(i);
end

Листинг 2.21. Вычисление произведения элементов матрицы
//Начальное значение произведения p равно 1.
p=1;
//Вычисляем количество строк N и столбцов M матрицы A.
[N,M]=size(A);
//Перебираем все строки матрицы.
for i=1:N
//Перебираем все столбцы матрицы.
for j=1:M
//Умножаем значение p на текущий элемент матрицы.
p=p*a(i,j);
end
end

2.2.3 Поиск максимального (минимального) элемента массива
(матрицы)
Алгоритм решения задачи поиска максимума и его номера в массиве следую­
щий. Пусть в переменной с именем Nmax хранится номер максимального эле-

50

Глава 2. Программирование в Scilab

мента массива. Предположим, что первый элемент является максимальным,
и запишем его номер в переменную Nmax. Затем все элементы, начиная со
второго, сравниваем в цикле с максимальным. Если текущий элемент массива оказывается больше максимального, то записываем текущее значение
индекса i в переменную Nmax. В листинге 2.22 представлен фрагмент программы поиска максимума.
Листинг 2.22. Поиск максимума
//Записываем в Nmax номер максимального элемента
//массива, сейчас это число 1.
Nmax=1;
//Перебираем все элементы массива, начиная со второго.
for i=2:N
//Если текущий элемент массива больше элемента с номером Nmax,
if x(i)>x(Nmax)
//то в Nmax записываем номер текущего элемента как нового максимального
Nmax=i;
end;
end;

Алгоритм поиска минимального элемента в массиве будет отличаться от
приведённого выше лишь тем, что в операторе if знак поменяется с «>» на
«0
//значение переменной k увеличиваем на 1,
k=k+1;
//а элемент массива y переписываем в x.
x(k)=y(i);
end;
end;
//вывод массива x.
disp(x);
//В переменной s будем хранить сумму элементов массива x, в
//переменной min1 - минимальное значение в массиве x, в Nmin //номер минимального элемента в массиве x.
s=x(1);
min1=x(1);
Nmin=1;
//Цикл для поиска минимума и суммы среди элементов массива x.
for i=2:k
//Накапливание суммы.
s=s+x(i);
//Поиск минимума.
if x(i)maximum
maximum=A(i,j);
kolichestvo=1;
//Если текущий элемент равен максимальному, то количество
//максимумов увеличиваем на 1.
elseif A(i,j)==maximum
kolichestvo=kolichestvo+1;
end
end
end
end

Текст функции, предназначенной для чтения мат­ри­цы из файла и вызова
функции matrica_A, приведен в листинге 2.39, результаты – в листинге 2.40.
Листинг 2.39. Вызов функции matrica_A
f=mopen('primer.txt','r');
N=mfscanf(f,'%d');
for i=1:N
for j=1:N

2.4. Пользовательские функции в Scilab
B(i,j)=mfscanf(f,'%g');
end
end
mclose(f);
[s,m,k]=matrica_A(B,N);

Листинг 2.40. Результаты работы программы
-->exec("matrica_2.sce");
-->s
s = 21.
-->m
m = 67.
-->k
k = 4.

69

Глава 3

Массивы и матрицы в Scilab.
Решение задач линейной
алгебры

Познакомимся с инструментами Scilab, предназначенными для работы с векторами и мат­ри­цами, а также с возможностями, которые предоставляет пакет
при решении задач линейной алгебры.

3.1

Ввод и формирование векторов и матриц

Задать одномерный массив в Scilab можно следующим образом:
name=Xn:dX:Xk
где name – имя переменной, в которую будет записан сформированный массив; Xn – значение первого элемента массива; Xk – значение последнего
элемента массива; dX – шаг, с помощью которого формируется каждый следующий элемент массива, т. е. значение второго элемента составит Xn+dX,
третьего – Xn+dX+dX и т. д. до Xk.
Если параметр dX в конструкции отсутствует, это означает, что по умолчанию он принимает значение, равное единице, т. е. каждый следующий
элемент массива равен значению предыдущего плюс один:
name=Xn:Xk
Переменную, заданную как массив, можно использовать в арифметических выражениях и в качестве аргумента математических функций. Результатом работы таких операторов являются массивы:

3.1. Ввод и формирование векторов и матриц

71

Листинг 3.1. Примеры работы с массивами
--> Xn=-3.5;dX=1.5;Xk=4.5;
--> X=Xn:dX:Xk X =
-3.5 -2. -0.5
1.
2.5
4.
--> Y=sin(X/2)
Y =
-0.9840
-0.8415 -0.2474
0.4794
0.9490
0.9093
--> A=0:5
A =
0 1 2 3 4 5
--> 0:5
ans =
0 1 2 3 4 5
--> ans/2+%pi
ans =
3.1416
3.6416
4.1416
4.6416
5.1416
5.6416

Ещё один способ задания векторов и мат­ри­ц в Scilab – это их поэлементный ввод.
Так, для определения вектора-строки следует ввести имя массива, а затем
после знака присваивания в квадратных скобках через пробел или запятую
перечислить элементы массива:
name=[x1 x2 ... xn]

или

name=[x1, x2, ..., xn]

Пример ввода вектора-строки показан ниже.
Листинг 3.2. Определение вектора-строки
--> V=[1 2 3 4 5]
V =
1 2 3 4 5
--> W=[1.1,2.3,-0.1,5.88]
W =
1.1
2.3 -0.1
5.88

Элементы вектора-столбца вводятся через точку с запятой:
name=[x1; x2; ...; xn]
Пример ввода вектора-столбца приведён ниже.
Листинг 3.3. Определение вектора-столбца
--> X=[1;2;3]
X =
1
2
3

Обратиться к элементу вектора можно, указав имя массива и порядковый
номер элемента в круглых скобках:
name(индекс)

72

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Например:
Листинг 3.4. Пример обращения к элементу массива
--> W=[1.1,2.3,-0.1,5.88];
--> W(1)+2*W(3)
ans = 0.9

Ввод элементов матрицы также осуществляется в квадратных скобках,
при этом элементы строки отделяются друг от друга пробелом или запятой,
а строки разделяются между собой точкой с запятой:
name=[x11, x12, ..., x1n; x21, x22, ..., x2n; ...; xm1, xm2, ..., xmn;]
Обратиться к элементу мат­ри­цы можно, указав после имени мат­ри­цы
в круглых скобках через запятую номер строки и номер столбца, на пересечении которых элемент расположен:
name(индекс1, индекс2)
Далее приведен пример задания мат­ри­цы и обращения к её элементам.
Листинг 3.5. Пример обращения к элементам матрицы
--> A=[1 2 3;4 5 6;7 8 9]
A =
1
2
3
4
5
6
7
8
9
--> A(1,2)^A(2,2)/A(3,3)
ans = 3.5555556

Листинг 3.6. Форматированный вывод матрицы с помощью функции mprintf
//Вариант 1
A = [3.1416 1.0000 2.0000 3.0000; 4.0000 5.0000 6.0000 -3.1416];
mprintf('Матрица А:\n');
//Указывается формат вывода каждого столбца матрицы
mprintf("%4.2f\t%4.2f\t%4.2f\t%4.2f\n", A);
//Результат работы программы Матрица А:
3.14
1.00
2.00
3.00
4.00
5.00
6.00
-3.14
//Вариант 2
D=[5 2 -1;1 -3 2; 4 5 -3];
[N M]=size(D);
for i=1:N
for j=1:M
mprintf('%2.1f\t',D(i,j));
end
mprintf('\n');
end

73

3.1. Ввод и формирование векторов и матриц
//Результат работы программы
5.0
2.0
-1.0
1.0
-3.0
2.0
4.0
5.0
-3.0

Матрицы и векторы можно формировать, составляя их из ранее заданных
мат­ри­ц и векторов:
Листинг 3.7. Пример конкатенации матриц
--> v1=[1 2 3]; v2=[4 5 6]; v3=[7 8 9];
--> //Горизонтальная конкатенация векторов-строк:
--> V=[v1 v2 v3]
V = 1 2 3 4 5 6 7 8 9
-->//Вертикальная конкатенация векторов-строк,
-->//результат - матрица:
--> V=[v1; v2; v3] V =
1 2 3
4 5 6
7 8 9
-->//Горизонтальная конкатенация матриц:
--> M=[V V V]
M =
1
2
3
1
2
3
1
4
5
6
4
5
6
4
7
8
9
7
8
9
7
-->//Вертикальная конкатенация матриц:
--> M=[V;V]
M =
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9

2
5
8

3
6
9

Важную роль при работе с мат­ри­цами играет знак двоеточия «:». Указывая
его вместо индекса при обращении к массиву, можно получать доступ к группам его элементов (листинг 3.8).
Листинг 3.8. Примеры использования операции «:»
-->//Пусть задана
--> A=[5 7 6 5; 7
--> //Выделить из
--> A(:,2)
ans =
7
10
8
7
--> //Выделить из
--> A(3,:)

матрица А
10 8 7;6 8 10 9;5 7 9 10];
матрицы А второй столбец

матрицы А третью строку

74

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

ans = 6

8

10

9

--> //Выделить из матрицы А подматрицу М
--> M=A(3:4,2:3)
M =
8
10
7
9
--> //Удалить из матрицы А второй столбец
--> A(:,2)=[]
A =
5 6 5
7 8 7
6 10 9
5 9 10
--> //Удалить из матрицы А третью строку
--> A(3,:)=[]
A =
5 6 5
7 8 7
5 9 10
--> //Представить матрицу М в виде вектора-столбца
--> v=M(:)
v =
8
7
10
9
--> //Выделить из вектора v элементы со второго по четвертый
--> b=v(2:4)
b =
7
10
9
--> //Удалить из массива b второй элемент
--> b(2)=[];
b =
7
9

3.2

Действия над векторами

Рассмотрим действия над векторами, предусмотренные в Scilab.
Операция сложения определена только для векторов одного типа, т. е. суммировать можно либо векторы-столбцы, либо векторы-строки одинаковой
длины. Элементы вектора, являющегося суммой двух векторов, представляют собой сумму соответствующих элементов слагаемых. Для записи операции сложения векторов используют знак «+».
Листинг 3.9. Пример сложения векторов
a=[2 4 6];
b=[1 3 5];

3.2. Действия над векторами

75

c=a+b
//Результат работы программы
c =
3.
7.
11.

Вычитание векторов определено аналогично сложению: из элементов вектора-уменьшаемого вычитаются соответствующие элементы второго вектора. Запись операции вычитания выполняется с помощью знака «-».
Листинг 3.10. Пример вычитания векторов
a=[2 4 6];
b=[1 3 5];
c=a-b
//Результат работы программы
c =
1.
1.
1.

Операция транспонирования вектора – это замена вектора-столбца вектором-строкой и наоборот. Знак апострофа «'» применяют для записи операции транспонирования вектора.
Листинг 3.11. Пример транспонирования векторов
a = [2 4 6];
b = [1; 3; 5];
mprintf('Вектор а:\n')
disp(a);
mprintf('Транспонированный вектор а:\n')
disp(a');
mprintf('Вектор b:\n')
disp(b);
mprintf('Транспонированный вектор b:\n')
disp(b');
c = (a+b');
mprintf('Вектор c:\n')
disp(c);
mprintf('Транспонированный вектор с:\n')
disp(c');
//Результат работы программы
Вектор а:
2.
4.
6.
Транспонированный вектор а:
2.
4.
6.
Вектор b:
1.

76

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

3.
5.
Транспонированный вектор b:
1.
3.
5.
Вектор c:
3.
7.
11.
Транспонированный вектор с:
3.
7.
11.

Умножение вектора на число есть умножение каждого элемента вектора
на это число. Запись операции умножения вектора на число осуществляется
с помощью знака «*».
Листинг 3.12. Пример умножения векторов
a=[2 4 6];
b=[1 3 5];
z=2*a+0.5*b
//Результат работы программы
z =
4.5
9.5
14.5

Деление вектора на число определяется аналогично умножению: как деление каждого элемента вектора на это число1. Знак деления «/» применяют
для записи операции деления вектора на число.
Листинг 3.13. Пример деления вектора на число
z=2*a+b/2
//Результат работы программы
z =
4.5
9.5
14.5

Умножение векторов определено только для векторов одинакового размера, причём один из них должен быть вектором-столбцом, а второй – вектором-строкой. Если вектор-строку a умножать на вектор-столбец b, получится
скалярное произведение векторов
а если умножать вектор-стол­
бец b на вектор-строку a, то получится мат­ри­ца C, у которой каждая строка
представляет собой исходную вектор-строку, умноженную на соответствующие элементы вектора-столбца. Операция умножения вектора на вектор записывается с помощью знака «*», так же как и операция умножения вектора
на число. Примеры умножения векторов приведены ниже.
1

Если делитель будет равен нулю, то в ответе будет Inf или NaN и предупреждение
warning: division by zero. – Прим. ред.

77

3.2. Действия над векторами

Листинг 3.14. Пример умножения векторов
a=[2 4 6];
b=[1 3 5];
// В результате умножения вектора-строки на вектор-столбец получится число
с=a*b';
// Результат умножения вектора-столбца на вектор-строку - матрица
D=a'*b;
mprintf('число с:\n');
disp(c);
mprintf("матрица D:\n");
disp(D);
//Результат работы программы
число с:
44.
матрица D:
2.
6.
10.
4.
12.
20.
6.
18.
30.

Листинг 3.15. Некорректное умножение векторов
w1=a*b;
w2=a'*b';
//Результат работы программы
Несогласованные размеры по строкам/столбцам.
Несогласованные размеры по строкам/столбцам.

Все перечисленные действия над векторами определены в математике
и относятся к так называемым векторным вычислениям. Но Scilab допускает
и поэлементное преобразование векторов. Существуют операции, которые
работают с вектором не как с математическим объектом, а как с обычным
одномерным массивом. Например, если к некоторому заданному вектору
применить математическую функцию, то результатом будет новый вектор
того же размера и структуры, но элементы его будут преобразованы в соответствии с заданной функцией.
Листинг 3.16. Применение математической функции к вектору
x=[-%pi/2,-%pi/3,-%pi/4,0,%pi/4,%pi/3,%pi/2]
y=sin(2*x)+cos(2*x);
z=2*exp(x/5);
mprintf('вектор у:\n');
disp(y);
mprintf("вектор z:\n");
disp(z);
//Результат работы программы
вектор у:
-1. -1.3660254 -1.
1.
1.
вектор z:
1.4608054

1.6220774

1.709272

0.3660254
2.

-1.

2.3401776

2.4659736

2.7382155

78

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Рассмотрим ещё несколько операций поэлементного преобразования вектора. К каждому элементу вектора можно добавить (вычесть) число, используя арифметическую операцию «+» («-»)1.
Листинг 3.17. Пример поэлементного сложения векторов
--> x=[-%pi/2,-%pi/3,-%pi/4,0,%pi/4,%pi/3,%pi/2];
--> y=x-1.2+%e/3;
--> mprintf("%1.2f\t",y')
-1.86
-1.34
-1.08
-0.29
0.49
0.75
1.28

Поэлементное умножение векторов выполняется при помощи оператора
«.*», результатом такого умножения является вектор, каждый элемент которого равен произведению соответствующих элементовзаданных векторов.
Листинг 3.18. Пример поэлементного умножения векторов
-->
-->
-->
ans
-->
ans

a=[2 4 6];
b=[1 3 5];
a.*b
= 2
12
30
b.*a
= 2
12
30

Поэлементное деление одного вектора на другой осуществляется при помощи оператора «./». В результате получается вектор, каждый элемент которого – частное от деления соответствующего элемента первого вектора на
соответствующий элемент второго.
Совокупность знаков «.\» применяют для деления векторов в обратном
направлении (поэлементное деление второго вектора на первый).
Листинг 3.19. Пример поэлементного деления векторов
a=[2 4 6];
b=[1 3 5];
c=a./b;
mprintf("%1.2f\t",c')
//Результат работы программы
2.00
1.33
1.20
//поэлементное деление второго вектора на первый
a=[2 4 6];
b=[1 3 5];
d=a.\b
mprintf("%1.2f\t",d')
//Результат работы программы
0.50
0.75
0.83
1

Вдумчивый читатель сразу заметит, что это частный случай предыдущего примера – применение к вектору линейного преобразования. – Прим. ред.

3.3. Действия над матрицами

79

Поэлементное возведение в степень. Осуществляется с помощью оператора
«.^». Результатом является вектор, каждый элемент которого – это соответствующий элемент заданного вектора, возведённый в указанную степень.
Листинг 3.20. Пример поэлементного возведения в степень
--> a=[2 4 6]; b=[1 3 5];
--> a.^2// Каждый элемент вектора возвести в квадрат
ans = 4
16
36
--> b.^(1/2)// Извлечь корень квадратный из каждого элемента вектора
ans = 1.
1.7320508
2.236068
--> b.^a// Каждый элемент вектора b возвести в степень a
ans = 1
81
15625
--> a.^(1./b)// Извлечь корень b-й степени из каждого элемента вектора a
ans = 2.
1.5874011
1.4309691

3.3

Действия над матрицами

Напомним основные определения алгебры мат­ри­ц. Если m×n выражений
расставлены в прямоугольной таблице из m строк и n столбцов, то говорят
о мат­ри­це размера m×n.

(3.1)

Выражения aij называют элементами мат­ри­цы. Элементы aii (i = 1…n), стоя­
щие в таблице на линии, проходящей из левого верхнего угла в правый нижний угол квадрата n×n, образуют главную диагональ мат­ри­цы.

(3.2)

Матрица размером m×n (где m ≠ n) называется прямоугольной. В случае
если m = n, мат­ри­цу называют квадратной мат­ри­цей порядка n.

80

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

(3.3)

В частности, мат­ри­ца типа 1×n – это вектор-строка: (a11 a12 … a1n). Матрица
размером m×1 является вектором-столбцом:
Число (скаляр) можно рассматривать как мат­ри­цу типа 1×1 – a11. Квадратная мат­ри­ца A = {aij} размером n×n называется:

zz

нулевой, если все её элементы равны нулю:

zz

верхней треугольной, если все элементы, расположенные ниже главной
диагонали, равны нулю:

zz

нижней треугольной, если все элементы, расположенные выше главной
диагонали, равны нулю:

zz

диагональной, если все элементы, кроме элементов главной диагонали,
равны нулю:

zz

единичной, если элементы главной диагонали равны единице, а все
остальные – нулю:

Определителем (детерминантом) мат­ри­цы A является число detA или ∆,
где сумма распределена
вычисляемое по правилу:

3.3. Действия над матрицами

81

на всевозможные перестановки (i1, i2, …, in) элементов 1, 2, …, n и, следовательно, содержит n! слагаемых, причём λ̃ = 0, если перестановка чётная, и λ̃ = 1,
если перестановка нечётная.
Квадратная мат­ри­ца A называется невырожденной, если её определитель
отличен от нуля detA ≠ 0. В противном случае detA = 0 мат­ри­ца называется
вырожденной, или сингулярной.
С мат­ри­цами можно проводить операции сравнения, сложения и умножения. Две мат­ри­цы A = {aij} и B = {bij} считаются равными, если они одного типа,
т. е. имеют одинаковое число строк и столбцов, и соответствующие элементы
их равны {aij} = {bij}.
Суммой двух матриц A = {aij} и B = {bij} одинакового типа называется мат­
ри­ца C = {cij} того же типа, элементы которой равны сумме соответствующих
элементов мат­ри­ц A = {aij} и B = {bij}: {cij} = {aij} + {bij}.
Разность матриц A = {a ij} и B = {b ij} определяется аналогично: {c ij} =
{a ij} - {b ij}.
Произведением числа ℏ и мат­ри­цы A = {aij} (или умножением мат­ри­цы на
число) называется мат­ри­ца, элементы которой получены умножением всех
элементов мат­ри­цы A = {aij} на число ℏ: ℏ · A = {ℏ · aij}.
Произведением матриц A = {aij} размерностью m×n и B = {bij} размерностью
n×s является мат­ри­ца C = {cij} размерностью m×s, каждый элемент которой
где i = 1…m, j = 1…s.
можно представить формулой
Таким образом, произведение мат­ри­ц A = {aij} и B = {bij} имеет смысл тогда
и только тогда, когда количество строк мат­ри­цы A = {aij} совпадает с количеством столбцов мат­ри­цы B = {bij}. Кроме того, произведение двух мат­ри­ц
не обладает переместительным законом, т. е. A · B ≠ B · A. В тех случаях, когда
A · B = B · A, мат­ри­цы A = {aij} и B = {bij} называются перестановочными.
Если в мат­ри­це A = {aij} размерностью m×n заменить строки соответствующими столбцами, то получится транспонированная матрица: AT = {aji}.
В частности, для вектора-строки a = {a1a2…an} транспонированной мат­ри­
цей является вектор-столбец:

Обратной матрицей по отношению к данной мат­ри­це A = {aij} размерностью n×n называется мат­ри­ца A-1 = {aij} того же типа, которая, будучи
умноженной как справа, так и слева на данную мат­ри­цу, в результате даёт
единичную мат­ри­цу E = {δij}, где δii = 1, δij = 0, при i ≠ j: A · A-1 = A-1 · A = E.
Нахождение обратной мат­ри­цы для данной называется обращением данной
матрицы. Всякая неособенная мат­ри­ца имеет обратную мат­ри­цу.
Начнём с операций, которые применимы к мат­ри­цам с точки зрения классической математики. Одним из базовых действий над мат­ри­цами является
сложение «+» (вычитание «-»). Здесь важно помнить, что суммируемые (вы-

82

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

читаемые) мат­ри­цы должны быть одной размерности. Результатом такой
операции является мат­ри­ца.
Листинг 3.21. Пример сложения и вычитания матриц
A=[1 2 3;4 5 6;7
B=[0 9 8;7 6 5;4
C=A+B;
D=A-B;
mprintf('матрица
disp(C);
mprintf('матрица
disp(D);
//результат
матрица C:
1.
11.
11.
11.
11.
11.

8 9]
3 2]

C:\n')
D:\n')

работы программы
11.
11.
11.

матрица D:
1. -7. -5.
-3. -1.
1.
3.
5.
7.

Умножать на число (запись «*») можно любую мат­ри­цу, результатом также
будет мат­ри­ца, каждый элемент которой будет помножен на заданное число.
Листинг 3.22. Пример умножения матрицы на число
--> A=[1 2 3;4 5 6;7 8 9];
--> B=0.2*A
B =
0.2
0.4
0.6
0.8
1.
1.2
1.4
1.6
1.8

Операция транспонирования (запись «'») меняет в заданной мат­ри­це строки на столбцы и также применима к мат­ри­цам любой размерности.
Листинг 3.23. Пример транспонирования матрицы
--> A
A =
1.
2.
4.
5.
7.
8.

3.
6.
9.

--> A'
ans =
1.
4.
2.
5.
3.
6.

7.
8.
9.

3.3. Действия над матрицами

83

При умножении матриц («*») важно помнить, что число столбцов первой
перемножаемой мат­ри­цы должно быть равно числу строк второй.
Листинг 3.24. Примеры умножения матриц
-->
-->
-->
ans
26.
59.
92.

A=[1 2 3;4 5 6;7 8 9];
B=[0 9 8;7 6 5;4 3 2];
A*B
=
30.
24.
84.
69.
138.
114.

-->
-->
-->
ans
0.
-9.
0.

A=[-3 2;0 1];
B=[0 -2;3 -1;0 1];
B*A
=
-2.
5.
1.

// Некорректное умножение матриц
--> A*B
Несогласованные размеры по строкам/столбцам.

Возведение матрицы в степень эквивалентно её умножению на себя указанное число раз. При этом целочисленный показатель степени может быть
как положительным, так и отрицательным. Матрица в степени -1 называется
обратной к данной. При возведении мат­ри­цы в положительную степень выполняется алгоритм умножения мат­ри­цы на себя указанное число раз. Возведение в отрицательную степень означает, что умножается на себя мат­ри­ца,
обратная к данной.
Листинг 3.25. Примеры возведения в степень
--> D=[3 2 1;1 0 2;4 1 3];
--> D^3
ans =
92.
40.
59.
65.
29.
40.
146.
65.
92.
--> D^(-1)
ans =
-0.4 -1.
0.8
1.
1. -1.
0.2
1. -0.4
--> D^(-3)
ans =
0.544
1.24 -0.888
-1.12
-1.2
1.24
-0.072 -1.12
0.544

84

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Для поэлементного преобразования матриц (листинг 3.26) можно применять операции, описанные ранее, как операции поэлементного преобразования векторов: добавление (вычитание) числа к каждому элементу матрицы
(«+» или «-»), поэлементное умножение матриц («.*») одинакового размера,
поэлементное деление матриц одинакового размера (прямое «./» и обратное
«.\»), поэлементное возведение в степень («.^») и применение к каждому элементу матрицы математических функций.
Листинг 3.26. Примеры преобразования матриц
--> M=[3 2 1;1 1 2;4 1 3];
--> N=[4 -2 -1;9 6 -2;-3 -1 2];
--> 2*M
ans =
6.
4.
2.
2.
8.
2.
--> N/3
ans =
1.3333333
3.
-1.

2.
4.
6.

-0.6666667 -0.3333333
2.
-0.6666667
-0.3333333
0.6666667

--> M.*N
ans =
12. -4. -1.
9.
6. -4.
-12. -1.
6.
--> N.*M
ans =
12. -4. -1.
9.
6. -4.
-12. -1.
6.
--> M./N
ans =
0.75
-1.
0.1111111
0.1666667
-1.3333333 -1.
--> M.\N
ans =
1.3333333
9.
-0.75
--> M.^0.2
ans =
1.2457309

-1.
-1.
1.5

-1. -1.
6. -1.
-1.
0.6666667

1.1486984

1.

3.3. Действия над матрицами
1.
1.3195079
--> N.^M
ans =
64.
4.
9.
6.
81. -1.

1.
1.

85

1.1486984
1.2457309

-1.
4.
8.

Задача 3.1
Вычислить математическое выражение (2A + BT )2 - AB -1 для заданных
значений A и B.
Решение задачи показано в листинге 3.27.
Листинг 3.27. Вычисление математического выражения (задача 3.1)
--> A=[-3 2 0;0 1 2;5 3 1];
-->B=[0 -2 1;3 -1 1;0 1 1];
--> (2*A+1/3*B')^2-A*B^(-1)
ans =
32.666667 -20.666667
20.666667
47.333333
26.888889
15.666667
-40.333333
75.333333
31.777778

Довольно необычное, с точки зрения математики, применение нашлось
для операторов / и \. Символ «/» используется для операции, называемой
делением мат­ри­ц слева направо, соответственно, знак \ применяется для деления мат­ри­ц справа налево. Операция B/A эквивалентна выражению B · A-1,
её удобно использовать для решения матричных уравнений вида X · A = B:
Листинг 3.28. Пример решения матричного уравнения вида X · A = B
A=[2 -1 2;-1 2 -2;2 -2 5];
mprintf('Матрица А:\n')
mprintf('%1.2f\t%1.2f\t%1.2f\n',A)
B=[7 0 0;0 1 0;0 0 1];
mprintf('Матрица B:\n');
mprintf('%1.2f\t%1.2f\t%1.2f\n',B)
X=B/A
mprintf('Матрица X:\n');
mprintf('%1.2f\t%1.2f\t%1.2f\n',X)
X0=X*A-B // Проверка X*A-B=0
mprintf('Проверка:\n');
mprintf('%1.2f\t%1.2f\t%1.2f\n',X0)
//Результат работы программы
Матрица А:
2.00
-1.00
2.00
-1.00
2.00
-2.00
2.00
-2.00
5.00

86
Матрица B:
7.00
0.00
0.00
1.00
0.00
0.00
Матрица X:
6.00
1.00
0.14
0.86
-0.29
0.29
Проверка:
0.00
0.00
0.00
-0.00
0.00
0.00

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

0.00
0.00
1.00
-2.00
0.29
0.43
0.00
0.00
0.00

Соответственно, A\B эквивалентно A-1 · B и применяется для решения уравнения A · X = B.
Листинг 3.29. Пример решения матричного уравнения вида A · X = B
A=[2 -1 2;-1 2 -2;2 -2 5];
mprintf('Матрица А:\n')
mprintf('%1.2f\t%1.2f\t%1.2f\n',A)
B=[7 0 0;0 1 0;0 0 1];
mprintf('Матрица B:\n');
mprintf('%1.2f\t%1.2f\t%1.2f\n',B)
X=A\B
mprintf('Матрица X:\n');
mprintf('%1.2f\t%1.2f\t%1.2f\n',X)
X0=A*X-B // Проверка A*X-B=0
mprintf('Проверка:\n');
mprintf('%1.2f\t%1.2f\t%1.2f\n',X0)
//Результат работы программы
Матрица А:
2.00
-1.00
2.00
-1.00
2.00
-2.00
2.00
-2.00
5.00
Матрица B:
7.00
0.00
0.00
0.00
1.00
0.00
0.00
0.00
1.00
Матрица X:
6.00
0.14
-0.29
1.00
0.86
0.29
-2.00
0.29
0.43
Проверка:
0.00
0.00
0.00
0.00
-0.00
0.00
0.00
0.00
0.00

Если предположить, что x и b – это векторы, а A – мат­ри­ца, то получим запись
системы линейных алгебраических уравнений в матричной форме Ax = b. Это
значит, что оператор \ можно применять для решения линейных систем.

3.4. Символьные матрицы и операции над ними

87

Листинг 3.30. Пример решения линейной системы вида Ax = b
A=[1 2;1 1];
b=[7;6];
mprintf('Матрица А:\n')
mprintf('%1.2f\t%1.2f\n',A)
mprintf('Вектор b:\n');
mprintf('%1.2f\n',b)
x=A\b
mprintf('Вектор x:\n');
mprintf('%1.2f\n',x)
x0=A*x // Проверка Ax=b
mprintf('Проверка:\n');
mprintf('%1.2f\n',x0)
//Результат работы программы
Матрица А:
1.00
2.00
1.00
1.00
Вектор b:
7.00
6.00
Вектор x:
5.00
1.00
Проверка:
7.00
6.00

3.4

Символьные матрицы и операции над ними

В Scilab можно задавать символьные мат­ри­цы, т. е. мат­ри­цы, элементы которых имеют строковый тип. При этом необходимо помнить, что строковые
элементы должны быть заключены в двойные или одинарные кавычки.
Листинг 3.31. Формирование символьных матриц
-->M=['a' 'b';'c' 'd']
M =
!a b !
!
!
!c d !
-->P=['1' '2';'3' '4']
P =
!1 2 !
!
!
!3 4 !

Символьные мат­ри­цы можно складывать (результат сложения – конкатенация соответствующих строк) и транспонировать.

88

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Листинг 3.32. Операции над символьными матрицами
-->M+P
ans =
!a1 b2 !
!
!
!c3 d4 !
-->M'
ans =
!a c !
!
!
!b d !

3.5

Функции для работы с матрицами и векторами

В Scilab существуют специальные функции, предназначенные для работы
с мат­ри­цами и векторами. Эти функции можно разделить на следующие
группы:
1) функции для работы с векторами;
2) функции для работы c мат­ри­цами;
3) функции, реализующие численные алгоритмы решения задач линейной алгебры.
Рассмотрим наиболее часто используемые функции.

3.5.1 Функции для работы с векторами
length(X ) определяет количество элементов массива X; если X – вектор, то
его длину; если X – мат­ри­ца, вычисляет общее число её элементов.
--> V=[-1 0 3 -2 1 -1 1];//Вектор-строка
--> length(V)//Длина вектора
ans =
7
-->[1 2 3;4 5 6];//Матрица
-->length(ans)//Количество элементов матрицы
ans =
6.
--> X=[1 2 3 4 5 6 7 8 9];
--> n=length(X)
n = 9
--> Y=[-2;-1;0;1;2]
Y =
-2
-1
0
1
2
--> m=length(Y)
m = 5

3.5. Функции для работы с матрицами и векторами

89

prod(X ) вычисляет произведение элементов вектора X.
--> X=[1 2 3 4 5 6 7 8 9]; prod(X)
ans = 362880

cumprod(X ) формирует вектор кумулятивного произведения – вектор того
же типа и размера, что и X вида: x1, x1 · x2, x1 · x2 · x3, …, x1 · x2  xn, каждый элемент
которого рассчитывается по формулам x¢i = x1 · x2  xi, т. е. i-й элемент вектора X умножается на произведение всех предыдущих элементов.
--> X=[1 2 3 4 5 ]; cumprod(X)
ans = 1
2
6
24
120

sum(sum(X [, fl]) вычисляет сумму элементов массива X, имеет необязательный параметр fl. Если параметр fl отсутствует, то функция sum(X) возвращает скалярное значение, равное сумме элементов массива. Если fl='r'
или fl=1, что то же самое, то функция вернет строку, равную поэлементной
сумме столбцов мат­ри­цы X. Если fl='с' или fl=2, то результатом работы
функции будет вектор-столбец, каждый элемент которого равен сумме элементов строк мат­ри­цы X. Частный случай применения функции sum – это
вычисление скалярного произведения векторов1.
-->M=[1 2 3;4 5 6;7 8 9];
-->Y=sum(M) //Сумма элементов матрицы
Y = 45.
-->S1=sum(M,1) //Сумма элементов матрицы по столбцам
S1 =
12
15
18
-->S2=sum(M,2) // Сумма элементов матрицы по строкам
S2 =
6
15
24
--> V=[-1 0 3 -2 1 -1 1];
--> sum(V) //Сумма элементов вектора
ans = 1
-->//Частный случай. Вычисление скалярного произведения
--> a=[1 2 3];b=[2 0 1];
--> sum(a.*b)
ans = 5

cumsum(X ) формирует вектор кумулятивной суммы – вектор того же типа
и размера, что и X вида: x1, x1 + x2, x1 + x2 + x3, …, x1 + x2 +  + xn, каждый
элемент которого рассчитывается по формуле x¢i = x1 + x2 +  + xi, т. е. к i-му
элементу вектора X прибавляется сумма всех предыдущих элементов.
--> X=[1 2 3 4 5 ]; cumsum(X)
ans = 1
3
6
10
15

1

Скалярное произведение вычисляется по формуле a⃗ · b⃗ = a1b1 + a2b2 +  + anbn.

90

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

diff(X) формирует вектор вида x2 - x1, x3 - x2, …, xn - xn-1, размер которого
на единицу меньше, чем у вектора X, а каждый элемент представляет собой
разность между двумя соседними элементами массива X, т. е. xi¢ = xi - xi-1.
--> X=[1 2 3 4 5 6 7 8 9]; diff(X)
ans = 1 1 1 1 1 1 1 1

min(X ) находит минимальный элемент вектора X, вызов в формате
[minimum,nomer]=min(X) даёт возможность определить минимальный элемент nomX и его номер nom в массиве X.
--> X=[-1 2 3 9 -8 7 5];
--> min(X)
ans = -8
--> [minimum,nomer]=min(X)
nomer
= 5.
minimum = -8.

max(X ) находит максимальный элемент массива X или при вызове вида
[maximum,nomer]=max(X ) определяет максимум и его номер.
--> X=[-1 2 3 9 -8 7 5];
--> max(X)
ans = 9
--> [maximum,nomer]=max(X)
nomer
= 4.
maximum = 9.

mean(X ) определяет среднее арифметическое массива X.
--> X=[-1 2 3 9 -8 7 5];
--> Sr=mean(X)
Sr = 2.4285714
--> sum(X)/length(X)
ans = 2.4285714

cross(x1,x2) вычисляет векторное произведение векторов x1 и x2.
-->
-->
x =
-->
-->
x =
6.
4.
2.

x1=[2 -3 0];x2=[0 1 -2];
x=cross(x1,x2)
6.
4.
2.
x1=[2;-3;0];x2=[0;1;-2];
x=cross(x1,x2)

gsort(X ) выполняет сортировку массива X.
--> X=[-1 2 3 9 -8 7 5];
--> gsort(X)// Сортировка по возрастанию
ans = -8 -1
2
3
5
7
9

3.5. Функции для работы с матрицами и векторами

91

--> -gsort(-X)// Сортировка по убыванию
ans = 9
7
5
3
2 -1 -8

3.5.2 Функции для работы c матрицами
prod(M [, k]) формирует вектор-строку или вектор-столбец в зависимости от
значения k, каждый элемент которой(го) является произведением элементов
соответствующего столбца или строки мат­ри­цы M. Если значение параметра k
отсутствует, то вычисляется произведение всех элементов мат­ри­цы.
--> M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3];
--> prod(M)
ans = -345600.
--> prod(M,1)
ans =
24. -25.
32.

18.

--> prod(M,2)
ans =
6.
-40.
-12.
-120.

cumprod(M [, k ]) отличается от функции cumprod(X ) тем, что операции,
описанные для неё, применяются к строкам или столбцам мат­ри­цы M в зависимости от значения параметра k, по умолчанию накапливание произведения выполняется по столбцам мат­ри­цы M.
--> M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3];
--> cumprod(M)
ans =
-1.
24.
1200.
-57600.
-4.
120. -1200.
-115200.
-12. -120. -4800.
-115200.
24. -600. -19200. -345600.
--> cumprod(M,1)
ans =
-1.
1.
-2.
-4.
5.
2.
-12. -5.
8.
24. -25.
32.

3.
6.
6.
18.

--> cumprod(M,2)
ans =
-1. -1.
2.
6.
4.
20. -20. -40.
3. -3.
-12. -12.
-2. -10. -40. -120.

sum(M [, k ]) формирует вектор-строку или вектор-столбец в зависимости
от значения k, каждый элемент которой(го) является суммой элементов со-

92

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

ответствующего столбца или строки мат­ри­цы M, если значение параметра k
отсутствует, то вычисляется сумма всех элементов мат­ри­цы.
--> M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3];
--> sum(M)
ans =
28.
--> sum(M,1)
ans =
4.
10.
5.

9.

--> sum(M,2)
ans =
1.
10.
7.
10.

cumsum(M, [k]) отличается от функции cumsum(X) тем, что операции, описанные для неё, применяются либо к строкам, либо к столбцам мат­ри­цы M
в зависимости от значения параметра k, по умолчанию результатом работы
функции является мат­ри­ца кумулятивных сумм столбцов мат­ри­цы M.
--> M=[-1 1 -2 3
--> cumsum(M)
ans =
-1.
5.
12.
3.
10.
11.
6.
9.
15.
4.
14.
19.

;4 5 -1 2;3 -1 4 1;-2 5 4 3];

22.
24.
25.
28.

--> cumsum(M,1)
ans =
-1.
1.
-2.
3.
3.
6.
-3.
5.
6.
5.
1.
6.
4.
10.
5.
9.
--> cumsum(M,2)
ans =
-1.
0. -2.
1.
4.
9.
8.
10.
3.
2.
6.
7.
-2.
3.
7.
10.

max(M [, fl]) вычисляет наибольший элемент в массиве M, имеет необязательный параметр fl. Если параметр fl отсутствует, то функция max(M) возвращает максимальный элемент массива M; если fl='r', то функция вернет
строку максимальных элементов столбцов мат­ри­цы M; если fl='с', то результатом работы функции будет вектор-столбец, каждый элемент которого
равен максимальному элементу соответствующих строк мат­ри­цы M. Функция

3.5. Функции для работы с матрицами и векторами

93

[x,nom]=max(M[,fl]) вернет значение максимального элемента x и его номер
в массиве nom.
-->M=[5 0 3;2 7 1;0 4 9];
-->max(M)
ans =
9.
-->max(M,'r')
ans =
5.
7.
9.
-->max(M,'c')
ans =
5.
7.
9.
-->[x,nom]=max(M)
nom =
3.
3.
x =
9.

min(M[, fl]) вычисляет наименьший элемент в массиве M, работает аналогично функции max.
--> A=[5 0 3; 2 7 1; 25 4 0];
--> [x,nom]=min(A)
nom =
1.
2.
x =
0.

mean(M[, fl]) вычисляет среднее значение массива M; если M – двумерный
массив, то mean(M,1) или mean(M,'r') определяет среднее значение строк
мат­ри­цы M, а mean(M,2) или mean(M,'c') – среднее значение столбцов.
--> M=[5 0 3;2 7 1;0 4 9];
-->mean(M)
ans =
3.4444444
-->mean(M,1)
ans =
2.3333333
3.6666667
4.3333333
-->mean(M,2)
ans =
2.6666667
3.3333333
4.3333333

median(M[, fl]) вычисляет медиану1 массива M, работает аналогично функции mean.
1

Значение, которое делит массив на две части.

94

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

-->M=[5 0 3;2 7 1;0 4 9];
-->median(M)
ans = 3.
-->median(M,1)
ans =
2.
4.
3.
-->median(M,2)
ans =
3.
2.
4.

gsort(M) выдаёт мат­ри­цу того же размера, что и M, каждый столбец которой упорядочен по возрастанию. Синтаксис:
[B [,k]]=gsort(A)
[B [,k]]=gsort(A,option)
[B [,k]]=gsort(A,option,direction)
Здесь:
z z A – мат­ри­ца;
z z option – символьная строка. Она задаёт тип требуемой сортировки:
– 'r' – сортируется каждый столбец A;
– 'c'– сортируется каждая строка A;
– 'g' – сортируются все элементы A. Это значение по умолчанию;
– 'lr' – лексикографическая сортировка строк A;
– 'lc' – лексикографическая сортировка столбцов A;
z z direction – символьная строка. Она задаёт направление сортировки;
'i' устанавливает порядок возрастания, а 'd' – порядок убывания (по
умолчанию);
z z B – массив того же типа и размеров, что и A;
z z k – вещественный массив целочисленных значений тех же размеров,
что и A. Содержит исходные индексы.
Когда элементы являются комплексными значениями, элементы сортируются по их модулям, 'g' в качестве второго аргумента работает с комплексными значениями.
--> A=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3]
A =
-1.
1. -2.
3.
4.
5. -1.
2.
3. -1.
4.
1.
-2.
5.
4.
3.
//Сортировка матрицы A по столбцам в порядке убывания.
//Такой же результат будет выдан B=gsort(A,'g','d') и B=gsort(A,'g')
--> B=gsort(A)
B =
5.
4.
2. -1.
5.
3.
1. -1.

3.5. Функции для работы с матрицами и векторами
4.
4.

3.
3.

1.
-1.

-2.
-2.

//Сортировка матрицы A по столбцам в порядке возрастания.
--> B=gsort(A,'g','i')
B =
-2. -1.
3.
4.
-2.
1.
3.
4.
-1.
1.
3.
5.
-1.
2.
4.
5.
//Сортировка строк
--> A=['а' 'г' 'е';'б' 'д' 'ю';'в' 'е' 'я']
A =
!а г е !
!
!
!б д ю !
!
!
!в е я !
//сортирует строки A в лексическом порядке убывания.
//B получается перестановкой строк матрицы A таким образом,
//чтобы строки B удовлетворяли B(i,:)>=B(j,:), если i B=gsort(A,'lr')
B =

!

!


е

я

д

ю

г

е

!
!
!
!
!

//сортирует строки A в лексическом порядке возрастания.
//B получается перестановкой строк матрицы A таким образом,
//чтобы строки B удовлетворяли B(i,:)=B(:,j), если i B=gsort(A,'lc')
B =
!е г а !
!
!
!ю д б !
!
!
!я е в !

95

96

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

//сортирует столбцы A в лексическом порядке возрастания.
//B получается перестановкой столбцов матрицы A таким образом,
//чтобы столбцы B удовлетворяли B(:,i)D=[1 2;3 4;5 6];
-->matrix(D,2,3)
ans =
1.
5.
4.
3.
2.
6.
-->matrix(D,3,2)
ans =
1.
2.
3.
4.
5.
6.
-->matrix(D,1,6)
ans =
1.
3.
5.
-->matrix(D,6,1)
ans =
1.
3.
5.
2.
4.
6.

2.

4.

6.

98

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

sparse([i 1 j 1; i 2 j 2; ...; i n j n], [n 1, n 2, ..., n n]) формирует разрежённую мат­ри­цу1. Для создания мат­ри­цы такого типа необходимо указать индексы её ненулевых элементов – [i1j1, i2j2, ..., injn] и их значения –
[n1,n2,...,nn]. Индексы одного элемента отделяются друг от друга либо
пробелом, либо запятой, а пары индексов – соответственно точкой с запятой,
значения элементов разделяются запятыми. При попытке просмотреть мат­
ри­цу подобного типа пользователю будет предоставлено сообщение о её
размерности, а также значения ненулевых элементов и их местоположение
в мат­ри­це.
full(M ) – вывод разрежённой мат­ри­цы М в виде таблицы.
-->A=sparse([1 3;3 2;3 5],[4,5,6])
A =
(
3,
5) sparse matrix
(
1,
3)
4.
(
3,
2)
5.
(
3,
5)
6.
-->full(A)
ans =
0.
0.
4.
0.
0.
0.
0.
0.
0.
0.
0.
5.
0.
0.
6.

hypermat(D[, V ]) – создание многомерной мат­ри­цы с размерностью, заданной вектором D и значениями элементов, хранящихся в векторе V (использование параметра V необязательно).
-->//Пример создания матрицы М,
-->//состоящей из трёх матриц размерности два на два,
-->//каждый элемент матрицы - член последовательности
-->//целых чисел от 0 до 11.
-->M=hypermat([2 2 3],0:11)
M =
(:,:,1)
0.
2.
1.
3.
(:,:,2)
4.
6.
5.
7.
(:,:,3)
8.
10.
9.
11.

size(V[, fl]) определяет размер массива V; если V – двумерный массив, то
size(V,1) или size(V,'r') определяет число строк мат­ри­цы V, а size(V,2)
или size(V,'c') – число столбцов.
-->M=[1 2;3 4;5 6;7 8];
-->[n,m]=size(M)
1

Разрежённая мат­ри­ца – мат­ри­ца, большинство элементов которой – нули.

3.5. Функции для работы с матрицами и векторами

99

m =
2.
n =
4.
-->size(M,1)
ans = 4.
-->size(M,2)
ans =
2.

eye(n[, m]) возвращает единичную мат­ри­цу (вектор) соответствующей
размерности.
--> eye(4,4)
ans =
1.
0.
0.
0.
1.
0.
0.
0.
1.
0.
0.
0.

0.
0.
0.
1.

--> eye(2,4)
ans =
1.
0.
0.
0.
1.
0.

0.
0.

--> eye(3,1)
ans = 1.
0.
0.
--> eye(1,5)
ans =
1.
0.
0.

0.

0.

ones(n[, m, p, …]) формирует мат­ри­цу (вектор), состоящую из единиц.
--> ones(2)
ans =
1.
--> ones(2,2)
ans =
1.
1.
1.
1.
--> ones(3,3)
ans =
1.
1.
1.
1.
1.
1.
1.
1.
1.
--> ones(1,4)
ans =
1.
1.
1.

1.

100

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

--> ones(2,1)
ans =
1.
1.
--> ones(4,2)
ans =
1.
1.
1.
1.
1.
1.
1.
1.
--> ones(2,3,4)
ans = (:,:,1)
1.
1.
1.
1.
1.
1.
(:,:,2)
1.
1.
1.
1.
1.
1.
(:,:,3)
1.
1.
1.
1.
1.
1.
(:,:,4)
1.
1.
1.
1.
1.
1.

zeros(n[, m, p, …]) возвращает нулевую мат­ри­цу (вектор) соответствующей размерности.
--> zeros(3)
ans =
0.
--> zeros(3,3)
ans =
0.
0.
0.
0.
0.
0.
0.
0.
0.
--> zeros(1,2)
ans =
0.
0.
--> zeros(3,2)
ans =
0.
0.
0.
0.
0.
0.
--> zeros(4,1)
ans =
0.
0.
0.
0.

3.5. Функции для работы с матрицами и векторами

101

--> zeros(2,2,2)
ans =
(:,:,1)
0.
0.
0.
0.
(:,:,2)
0.
0.
0.
0.

diag(X[, k]) возвращает квадратную мат­ри­цу с элементами X на главной
диагонали или на k-й. Функция diag(M[, k]), где M – ранее определённая мат­
ри­ца, в качестве результата выдаст вектор-столбец, содержащий элементы
главной или k-й диагонали мат­ри­цы M.
--> X=[-1 2 3 9 -8 7 5];
--> diag(X)
ans =
-1.
0.
0.
0.
0.
0.
2.
0.
0.
0.
0.
0.
3.
0.
0.
0.
0.
0.
9.
0.
0.
0.
0.
0. -8.
0.
0.
0.
0.
0.
0.
0.
0.
0.
0.

0.
0.
0.
0.
0.
7.
0.

0.
0.
0.
0.
0.
0.
5.

--> diag(X,0)
ans =
-1.
0.
0.
0.
2.
0.
0.
0.
3.
0.
0.
0.
0.
0.
0.
0.
0.
0.
0.
0.
0.

0.
0.
0.
0.
0.
7.
0.

0.
0.
0.
0.
0.
0.
5.

0.
0.
0.
0.
0.
0.
9.
0.
0. -8.
0.
0.
0.
0.

--> x=[2;-3; 0];
--> diag(x,1)
ans =
0.
2.
0.
0.
0.
0. -3.
0.
0.
0.
0.
0.
0.
0.
0.
0.
--> diag(x,-1)
ans =
0.
0.
0.
0.
2.
0.
0.
0.
0. -3.
0.
0.
0.
0.
0.
0.
--> diag(x,2)
ans =
0.
0.
2.

0.

0.

102
0.
0.
0.
0.

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры
0.
0.
0.
0.

0.
0.
0.
0.

-3.
0.
0.
0.

0.
0.
0.
0.

--> diag(x,-2)
ans =
0.
0.
0.
0.
0.
0.
0.
0.
2.
0.
0.
0.
0. -3.
0.
0.
0.
0.
0.
0.

0.
0.
0.
0.
0.

--> M=[1 2 3;4 5 6;7 8 9]
M =
1.
2.
3.
4.
5.
6.
7.
8.
9.
--> diag(M)
ans =
1.
5.
9.
--> diag(M,1)
ans =
2.
6.
--> diag(M,-2)
ans = 7.

rand([n, m, p, …]) возвращает мат­ри­цу (вектор) с элементами, распределёнными по равномерному закону, rand без аргументов возвращает одно
случайное число.
--> rand(2)
ans =
0.2113249
--> rand(3,1)
ans =
0.7560439
0.0002211
0.3303271
--> rand(1,4)
ans =
0.6653811
0.6283918

0.8497452

0.685731

--> rand(2,5)
ans =
0.8833888
0.3076091
0.6525135
0.9329616

0.2146008
0.312642

0.3616361
0.2922267

0.5664249
0.4826472

3.5. Функции для работы с матрицами и векторами
-->
ans
-->
ans

103

rand
= 0.3321719
rand
= 0.42848

randn([n, m, p …]) возвращает мат­ри­цу (вектор), элементы которой являются числами, распределёнными по нормальному закону, randn без аргументов возвращает одно случайное число.
--> randn(2)
ans =
-1.04321 -1.81309
1.09223 -0.83071
--> randn(2,4)
ans =
-0.222773 -0.540185 0.026355 0.308437
1.510429 1.360071 0.298315 1.186672
--> randn(1,3)
ans =
0.38577 -2.33667 -1.35689
--> randn(2,1)
ans =
-0.66235
0.32907
--> randn
ans = -1.0607
--> randn
ans = -0.47825

linspace(a, b[, n]) возвращает массив из 100 (если n не указано) или из
n точек, равномерно распределённых между значениями a и b.
-->
ans
-->
-->
ans
-->
ans

linspace(a,b,3)
= -2
0
2
a=-2;b=2;n=5;
linspace(a,b,n)
= -2 -1
0
1
2
linspace(0,50,5)
= 0.00000 12.50000 25.00000 37.50000 50.00000

//Работа с векторами.
-->a=[0;10;100];
-->b=[0;50;500];
--> linspace(a,b,1)
ans =
0.
50.
500.
-->linspace(a,b,3)
ans =
0.
0.
0.

104
10.
100.

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры
30.
300.

50.
500.

--> linspace(a,b,5)
ans =
0.
0.
0.
10.
20.
30.
100.
200.
300.

0.
40.
400.

0.
50.
500.

logspace(a, b[, n]) формирует массив из 50 (если n не указано) или из
n точек, равномерно распределённых в логарифмическом масштабе между
значениями 10a и 10b; функция logspace(a, pi) даёт равномерное распределение из 50 точек в интервале от 10a до pi1.
--> logspace(1,2,5)
ans = 10.000
17.783

31.623

56.234

100.000

//Работа с векторами.
a=[1;2;3];
b=[2;3;4];
--> logspace(a,b,1)
ans =
100.
1000.
10000.
--> logspace(a,b,3)
ans =
10.
31.622777
100.
100.
316.22777
1000.
1000.
3162.2777
10000.
--> logspace(a,b,5)
ans =
10.
17.782794
31.622777
100.
177.82794
316.22777
1000.
1778.2794
3162.2777

56.234133
562.34133
5623.4133

100.
1000.
10000.

repmat(M, n[, m]) формирует мат­ри­цу, состоящую n×n или из n×m копий
мат­ри­цы M, если M – скаляр, то формируется мат­ри­ца, элементы которой
равны значению M.
--> M=[1 2 3;4 5 6;7 8 9];
--> repmat(A,2)
ans =
1.
2.
3.
1.
2.
3.
4.
5.
6.
4.
5.
6.
7.
8.
9.
7.
8.
9.
1

Обратите внимание, что это идёт вразрез с определением функции для произвольного b ≠ pi, согласно которому интервал должен был бы быть от 10a до 10pi, сделано
это для совместимости с соответствующей функцией matlab. – Прим. ред.

3.5. Функции для работы с матрицами и векторами
1.
4.
7.

2.
5.
8.

3.
6.
9.

1.
4.
7.

2.
5.
8.

3.
6.
9.

--> repmat(M,2)
ans =
1.
2.
3.
1.
4.
5.
6.
4.
7.
8.
9.
7.
1.
2.
3.
1.
4.
5.
6.
4.
7.
8.
9.
7.

2.
5.
8.
2.
5.
8.

3.
6.
9.
3.
6.
9.

--> repmat(M,2,3)
ans =
1.
2.
3.
1.
4.
5.
6.
4.
7.
8.
9.
7.
1.
2.
3.
1.
4.
5.
6.
4.
7.
8.
9.
7.

2.
5.
8.
2.
5.
8.

3.
6.
9.
3.
6.
9.

1.
4.
7.
1.
4.
7.

2.
5.
8.
2.
5.
8.

105

3.
6.
9.
3.
6.
9.

--> repmat(M,3,1)
ans =
1.
2.
3.
4.
5.
6.
7.
8.
9.
1.
2.
3.
4.
5.
6.
7.
8.
9.
1.
2.
3.
4.
5.
6.
7.
8.
9.
--> repmat(9,3)
ans =
9.
9.
9.
9.
9.
9.
9.
9.
9.

cat(n, A, B, [C, ...]) объединяет мат­ри­цы А и В или все входящие мат­ри­
цы при n = 1 по строкам, при n = 2 по столбцам; то же, что [A; B] или [A, B].
-->
-->
-->
ans
0.
3.
6.

A=[0 1 2;3 4 5;6 7 8];
B=[11 12 13;14 15 16;17 18 19];
cat(2,A,B)
=
1.
2.
11.
12.
13.
4.
5.
14.
15.
16.
7.
8.
17.
18.
19.

--> [A,B]
ans =
0.
1.
2.

11.

12.

13.

106
3.
6.

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры
4.
7.

5.
8.

14.
17.

15.
18.

16.
19.

--> cat(1,A,B)
ans =
0.
1.
2.
3.
4.
5.
6.
7.
8.
11.
12.
13.
14.
15.
16.
17.
18.
19.
--> [A;B]
ans =
0.
1.
3.
4.
6.
7.
11.
12.
14.
15.
17.
18.

2.
5.
8.
13.
16.
19.

--> x1=[2;-3; 0];x2=[0; 1;-2];
--> cat(2,x1,x2)
ans =
2.
0.
-3.
1.
0.
-2.
--> cat(1,x1,x2)
ans =
2.
-3.
0.
0.
1.
-2.
-->
-->
ans
2.

x1=[2 -3 0];x2=[0 1 -2];
cat(2,x1,x2)
=
-3.
0.
0.
1. -2.

--> [x1 x2]
ans =
2. -3.
0.

0.

--> cat(1,x1,x2)
ans =
2. -3.
0.
0.
1. -2.
--> [x1;x2]
ans =
2. -3.
0.
0.
1. -2.

1.

-2.

3.5. Функции для работы с матрицами и векторами

107

tril(M[, k]) формирует из мат­ри­цы M нижнюю треугольную мат­ри­цу, начиная с главной или с k-й диагонали.
--> M=[0 1 2 3;4 5 6 7;8 9 0 1; 6 5 4 3];
--> tril(M)
ans =
0.
0.
0.
0.
4.
5.
0.
0.
8.
9.
0.
0.
6.
5.
4.
3.
--> tril(M,1)
ans =
0.
1.
0.
4.
5.
6.
8.
9.
0.
6.
5.
4.

0.
0.
1.
3.

--> tril(M,-1)
ans =
0.
0.
0.
0.
4.
0.
0.
0.
8.
9.
0.
0.
6.
5.
4.
0.
--> tril(M,2)
ans =
0.
1.
2.
4.
5.
6.
8.
9.
0.
6.
5.
4.

0.
7.
1.
3.

--> tril(M,-2)
ans =
0.
0.
0.
0.
0.
0.
0.
0.
8.
0.
0.
0.
6.
5.
0.
0.
--> X=[-1 2 3 9 -8 7 5];
--> tril(X)
ans =
-1.
0.
0.
0.
0.
--> tril(X')
ans =
-1.
2.
3.
9.
-8.
7.
5.

0.

0.

108

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

triu(M[, k]) формирует из мат­ри­цы M верхнюю треугольную мат­ри­цу, начиная с главной или с k-й диагонали.
--> M=[0 1 2 3;4 5 6 7;8 9 0 1; 6 5 4 3]
M =
0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
0.
1.
6.
5.
4.
3.
--> triu(M)
ans =
0.
1.
2.
0.
5.
6.
0.
0.
0.
0.
0.
0.

3.
7.
1.
3.

--> triu(M,1)
ans =
0.
1.
2.
0.
0.
6.
0.
0.
0.
0.
0.
0.

3.
7.
1.
0.

--> triu(M,-2)
ans =
0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
0.
1.
0.
5.
4.
3.
X=[-1 2 3 9 -8
--> triu(X)
ans =
-1.
2.
3.

7 5];

9.

-8.

7.

5.

--> triu(X')
ans =
-1.
0.
0.
0.
0.
0.
0.

3.5.3 Функции, реализующие численные алгоритмы решения
задач линейной алгебры
det(M ) вычисляет определитель квадратной мат­ри­цы M.
--> M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3];
--> det(M)

3.5. Функции для работы с матрицами и векторами
ans
-->
-->
ans

109

= 682
A=[1 0 -3;0 1 2;2 0 -1];
det(A)
=5

rank(M[, tol]) – вычисление ранга матрицы M 1 с точностью tol.
-->M=[1 0 2;3 2 1;0 3 1];
-->rank(M)
ans = 3.
-->Z=[1 2 2;0 1 3;2 4 4];
-->rank(Z)
ans = 2.

trace(M ) вычисляет след мат­ри­цы M, т. е. сумму элементов главной диагонали.
--> M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3]
M =
-1
1 -2
3
4
5 -1
2
3 -1
4
1
-2
5
4
3
--> trace(M)
ans = 11
--> sum(diag(M))
ans = 11

norm(M[, fl]) – вычисление нормы квадратной мат­ри­цы М; тип нормы
определяется необязательной строковой переменной fl, по умолчанию
fl=2. Функции norm(M) и norm(M,2) эквивалентны и вычисляют вторую норму мат­ри­цы М 2. Первая норма3 определяется функцией norm(M,1). Функции norm(M,'inf') и norm(M,'fro') вычисляют соответственно бесконечную4 и евклидову нормы5. Если V – вектор, то результатом работы функции
norm(V,1) будет сумма модулей всех элементов вектора V. С помощью функции norm(V,2) можно вычислить модуль вектора V 6. Значение norm(V,'inf')
равно модулю максимального элемента вектора.
-->M=[1 0 2;3 2 1;0 3 1];
-->norm(M,1)
ans = 5.
-->norm(M,2)
ans = 4.5806705
-->norm(M,'inf')

1
2
3
4
5
6

Ранг матрицы – максимальное число линейно независимых строк.
Вторая норма матрицы – её наибольшее сингулярное значение.
Первая норма матрицы – наибольшая сумма по столбцам.
Бесконечная норма – наибольшая сумма по строкам.
Евклидова норма – корень из суммы квадратов всех элементов мат­ри­цы.
Модуль вектора – корень квадратный из суммы квадратов его элементов.

110

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

ans = 6.
-->norm(M,'fro')
ans = 5.3851648
-->X=[5 -3 4 -1 2];
-->norm(X,1)
ans = 15.
-->sum(abs(X))//То же, что и norm(X,1)
ans = 15.
-->norm(X,2)
ans = 7.4161985
-->sqrt(sum(X^2)) //То же, что и norm(X,2)
ans = 7.4161985
-->norm(X,'inf')
ans =
5.
-->max(abs(X))//То же, что и norm(X,'inf')
ans =
5.

cond(M[, p]) возвращает число обусловленности мат­ри­цы M, основанное
на норме p.
-->
-->
ans
-->
ans
-->
ans
-->
ans
-->
ans

M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3];
cond(M)
=
3.3323623
cond(M,2)
=
3.3323623
cond(M,1)
=
6.4926686
cond(M,%inf)
=
6.7741935
cond(M,'fro')
=
5.7154131

rcond(M ) – вычисляет величину, обратную значению числа обусловленности мат­ри­цы относительно первой нормы, если полученная величина близка
к единице, то мат­ри­ца хорошо обусловлена, если приближается к нулю, то
плохо.
--> M=[-1 1 -2 3;4 5 -1 2;3 -1 4 1;-2 5 4 3];
--> rcond(M)
ans =
0.1738022

inv(A) вычисляет матрицу, обратную1 к A 2.
-->//Пример вычисления обратной матрицы.
-->A=[1 2 3 5;0 1 3 2;4 2 1 1;2 3 0 1];
1

2

Обратной мат­ри­цей по отношению к данной называется мат­ри­ца того же типа, которая, будучи умноженной как слева, так и справа на данную мат­ри­цу, в результате
даст единичную мат­ри­цу. При умножении А на inv(A) слева должна получиться
единичная мат­ри­ца.
Вычисление основано на методе LU-разложения.

3.5. Функции для работы с матрицами и векторами

111

-->inv(A)
ans =
0.0285714 -0.1428571
0.3428571 -0.2
-0.1428571
0.2142857 -0.2142857
0.5
-0.2
0.5
0.1
-0.1
0.3714286 -0.3571429 -0.0428571 -0.1
//При умножении обратной матрицы на исходную
//получилась матрица, близкая к единичной.
-->inv(A)*A
ans =
1.
0.
0.
0.
0.
1.
0.
0.
0.
0.
1.
0.
0.
0.
0.
1.
-->//При попытке обратить вырожденную матрицу
-->//(определитель равен или близок к нулю)
-->//пользователь получит сообщение об ошибке.
-->B=[1 2 3;1 4 5;1 6 7];
-->inv(B)
inv: Задача вырождена.

pinv(A[, tol]) вычисляет псевдообратную матрицу1 для мат­ри­цы A с точностью tol (необязательный параметр).
-->pinv(A)
ans =
0.0285714 -0.1428571
0.3428571 -0.2
-0.1428571
0.2142857 -0.2142857
0.5
-0.2
0.5
0.1
-0.1
0.3714286 -0.3571429 -0.0428571 -0.1

linsolve(A, b) решает систему линейных алгебраических уравнений ви­да
A · x⃗ + b⃗ = 0.

//Решение системы линейных уравнений
//{x1+2*x2-7=0; x1+x2-6=0}.
//Свободные коэффициенты вводятся как вектор-столбец
//и с учётом знаков.
-->A=[1 2;1 1];b=[-7;-6];
-->x=linsolve(A,b)
x =
5.
1.
//Результатом операции A*x+b является вектор, достаточно
//близкий к нулю, это значит, что система решена верно.
-->P=A*x+b;
1

Если для мат­ри­цы pinv(A[,tol])=Х выполняется условие A*Х*А=А, Х*А*Х=Х, а мат­
ри­цы Х*А и A*Х эрмитовы, то вычисляемая мат­ри­ца Х псевдообратная к А. Вычисление базируется на методе сингулярного разложения, и все сингулярные значения
мат­ри­цы, меньшие tol, приравниваются к нулю.

112

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

--> mprintf('%1.2f\n',P)
-0.00
0.00
//Решение системы {x1+x2-1=0; x1+x2-3=0},
//которая не имеет решений:
-->A=[1 1;1 1]; b=[-1;-3];
-->linsolve(A,b)
ВНИМАНИЕ: Конфликтующие линейные ограничения.
ans =
[]
//Решение системы {3x1-x2-1=0; 6x1-2x2-2=0}.
//В случае когда система имеет бесконечное
//множество решений, SCILAB выдаст одно из них.
-->A=[3 -1;6 -2];
-->b=[-1;-2];
-->x=linsolve(A,b)
x =
0.3
- 0.1

spec(M) вычисляет собственные значения и собственные векторы квад­
ратной мат­ри­цы M.
-->M=[3 -2;-4 1]
M =
3.
-2.
-4.
1.
-->spec(M) //Собственные числа матрицы
ans =
5.
-1.
//Х - собственные векторы, соответствующие
//собственным значениям из матрицы Y.
-->[X,Y]=spec(M)
Y =
5.
0.
0. -1.
X =
0.7071068
-0.7071068

0.4472136
0.8944272

rref(M) осуществляет приведение мат­ри­цы M к треугольной форме, используя метод исключения Гаусса.
--> M=[3 -2 1 5;6 -4 2 7;9 -6 3 12]
M =
3 -2
1
5
6 -4
2
7
9 -6
3 12
--> rref(M)

3.5. Функции для работы с матрицами и векторами
ans =
1 -0.66667
0
0
0
0

0.33333
0
0

113

0
1
0

chol(M) возвращает разложение по Холецкому для положительно определённой симметрической мат­ри­цы M.
--> M=[10 1 1;2 10 1;2 2 10]
M =
10
1
1
2
10
1
2
2
10
--> chol(M)
ans =
3.1622777
0.3162278
0.3162278
0.
3.1464265
0.2860388
0.
0.
3.1333978
// Матрица не симметрическая
--> A=[1 2;1 1]; chol(A)
chol: Матрица не является положительно определённой.
--> M=[3 -2 1 5;6 -4 2 7;9 -6 3 12];
--> chol(M)
chol: Неверный тип аргумента 1: ожидалась квадратная матрица.

lu(M) выполняет треугольное разложение мат­ри­цы M 1.
-->A=[2 -1 5;3 2 -5;1 1 -2]
A =
2.
- 1.
5.
3.
2.
- 5.
1.
1.
- 2.
-->[L,U]=lu(A)
U =
3.
0.
0.

2.
-2.3333333
0.

L =
0.6666667
1.
0.3333333

-5.
8.3333333
0.8571429

1.
0.
-0.1428571

0.
0.
1.

-->LU=L*U
LU =
2. -1.
5.
3.
2. -5.
1.
1. -2.
1

M = C · L · U, где L и U – соответственно нижняя и верхняя треугольные мат­ри­цы,
все четыре мат­ри­цы квадратные и одного порядка. Такие вычисления называют
LU-раз­ложением.

114

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

qr(M) выполняет QR-разложение, команда [Q,R,P]=qr(M ) возвращает
три мат­ри­цы: ортогональную мат­ри­цу Q, верхнюю треугольную мат­ри­цу R
и мат­ри­цу перестановок P, причём A · P = Q · P.
--> M=[3 -2 1;5 6 -4;2 7 9];
--> [Q,R,P]=qr(M)
P =
0.
0.
1.
0.
1.
0.
1.
0.
0.
R =
-9.8994949 -3.7375644 -0.1010153
0.
-8.6620213 -4.3433799
0.
0.
-4.3731964
Q =
-0.1010153
0.2744799 -0.9562723
0.404061
-0.8670267 -0.2915464
-0.9091373 -0.415843
-0.0233237
--> Z=M*P-Q*R
Z =
9.992D-16
2.220D-15
8.882D-16
-4.441D-16 -8.882D-16 -1.776D-15
0.
0.
-4.441D-16
--> mprintf('%1.2f\t%1.2f\t%1.2f\n',Z);
0.00
0.00
0.00
-0.00
-0.00
-0.00
0.00
0.00
-0.00

svd(M) возвращает вектор сингулярных чисел мат­ри­цы, при использовании в формате [U,S,V]=svd(M ) выполняет сингулярное разложение мат­
ри­цы M, выдаёт три мат­ри­цы: U – сформирована из ортонормированных
собственных векторов, отвечающих наибольшим собственным значениям
мат­ри­цы M · M T, V состоит из ортонормированных собственных векторов мат­
ри­цы M · M T, S – диагональная мат­ри­ца из сингулярных чисел (неотрицательных значений квадратных корней из собственных значений мат­ри­цы M · M T ),
мат­ри­цы удовлетворяют условию A = U · S · V T.
--> M=[3 -2 1; 5 6 -4; 2 7 9];
--> svd(M)
ans =
11.755348
8.5347066
3.7377236
--> [U,S,V]=svd(M)
V =
0.2736345 -0.5001845
0.7042053 -0.4776138

0.8215471
-0.525338

3.6. Решение некоторых задач алгебры матриц
0.6551482

0.7222884

0.2215409

S =
11.755348
0.
0.

0.
8.5347066
0.

0.
0.
3.7377236

U =
0.0057541
0.2528901
0.9674779

0.0207345
-0.9673161
0.2527245

0.9997685
0.0186059
-0.0108095

115

kernel([, tol[, fl ]]) – определение ядра матрицы1 М, параметры tol и fl
являются необязательными. Первый задаёт точность вычислений, второй –
используемый при вычислении алгоритм, принимающий значение 'qr' или
'svd'.
-->A=[4 1 -3 -1;2
A =
4.
1. - 3. 2.
3.
1. 1. - 2. - 2.

3 1 -5;1 -2 -2 3]
1.
5.
3.

-->X=kernel(A)
X =
0.3464102
0.5773503
0.4618802
0.5773503

Рассмотрим некоторые задачи линейной алгебры, которые могут быть
решены с помощью описанных выше функций.

3.6

Решение некоторых задач алгебры матриц

Задача 3.2
Для заданных мат­ри­ц A, B и C проверить выполнение следующих тождеств:
(A · B) · C = A · (B · C),

(3.4)

(AT + B) · C = AT · C + B · C.

(3.5)

Из листинга 3.33 видно, что мат­ри­цы, получившиеся в результате вычисления левой и правой частей тождества (3.4), равны, следовательно, первое
тождество истинно.
1

Ядро мат­ри­цы – это множество векторов X. Поиск ядра мат­ри­цы сводится к решению однородной системы линейных уравнений AX = 0. Если при вызове функции
X=kernel(A) мат­ри­ца X окажется непустой, то действительно AX = 0.

116

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Листинг 3.33. Проверка матричных тождеств (пример 3.2)
--> A=[1 -2 0; -3 0 4];B=[3 1;2 0;-1 1];C=[1 2;-1 0];
--> (A*B)*C
ans =
-2 -2
-14 -26
--> A*(B*C)
ans =
-2 -2
-14 -26

Для исследования тождества (3.5) из левой части равенства вычитаем правую и получаем нулевую мат­ри­цу, что также приводит к выводу об истинности тождества. Результат представлен в листинге 3.34.
Листинг 3.34. Проверка матричных тождеств (пример 3.2)
-->
ans
0
0
0

(A'+B)*C-(A'*C+B*C)
=
0
0
0

Задача 3.3
Проверить, является ли мат­ри­ца симметрической. Квадратная мат­ри­ца
называется симметрической, если AT = A.
Из листинга 3.35 видно, что в результате вычитания из мат­ри­цы A транспонированной мат­ри­цы AT получена нулевая мат­ри­ца, т. е. тождество выполнено, заданная мат­ри­ца – симметрическая.
Листинг 3.35. Проверка симметрической матрицы (пример 3.3)
-->
ans
0 0
0 0
0 0

A=[1 -0.5 1.5;-0.5 0 2.5;1.5 2.5 -2]; A-A’
=
0
0
0

Задача 3.4
Проверить, является ли мат­ри­ца кососимметрической. Квадратная мат­ри­
ца называется кососимметрической, если AT = -A.
Проверив равенство для заданной мат­ри­цы (листинг 3.36), убеждаемся
в его истинности.

3.6. Решение некоторых задач алгебры матриц

117

Листинг 3.36. Проверка кососимметрической матрицы (пример 3.4)
-->
ans
0
0
0

A=[0 -0.25 0.75;0.25 0 -1.25;-0.75 1.25 0]; A'+A
=
0
0
0
0
0
0

Задача 3.5
Проверить, является ли мат­ри­ца ортогональной. Квадратная мат­ри­ца называется ортогональной, если |A| = detA ≠ 0 и AT = A-1.
Для решения поставленной задачи необходимо вычислить определитель
заданной мат­ри­цы и убедиться в том, что он не равен нулю.Затем следует
транспонировать исходную мат­ри­цу и найти мат­ри­цу, обратную к ней. Если
визуально сложно убедиться в том, что транспонированная мат­ри­ца равна
обратной, можно вычислить их разность. В результате должна получиться
нулевая мат­ри­ца (листинг 3.37).
Листинг 3.37. Проверка ортогональности матрицы (пример 3.5)
--> A=[0.5 0.7071 0.5;0.7071 0 -0.7071;0.5 -0.7071 0.5]
A =
0.5
0.7071
0.5
0.7071
0.
-0.7071
0.5
-0.7071
0.5
--> det(A)// Определитель матрицы A отличен от нуля
ans = -0.9999808
// При вычитании из транспонированной матрицы A обратной
// к ней матрицы получаем нулевую матрицу, значит, A - ортогональная.
--> R=A'-inv(A);
--> mprintf('%1.2f\t%1.2f\t%1.2f\n',R)
0.00
-0.00
0.00
-0.00
0.00
0.00
0.00
0.00
0.00

Задача 3.6
Задана мат­ри­ца A. Показать, что мат­ри­ца B = 2A - E, где E – единичная
мат­ри­ца, инволютивна. Квадратная мат­ри­ца называется инволютивной,
если B2 = E, где E – единичная мат­ри­ца.
Листинг 3.38. Проверка матрицы на инволютивность (пример 3.6)
-->
ans
1
0

A=[6 -15;2 -5]; B=2*A-eye(2,2); B^2
=
0
1

118

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Задача 3.7
Решить матричные уравнения A · X = B и X · A = B, выполнить проверку.
Матричное уравнение – это уравнение вида A · X = B или X · A = B, где X –
это неизвестная мат­ри­ца. Если умножить матричное уравнение на мат­ри­цу,
обратную к A, то оно примет вид: A-1 · A · X = B · A-1 или X · A · A-1 = B · A-1. Так
как A-1 · A = A · A-1 = E, а E · X = X · E = X, то неизвестную мат­ри­цу X можно
вычислить так: X = A-1 · B или X = B · A-1. Понятно, что матричное уравнение
имеет единственное решение, если A и B – квадратные мат­ри­цы n-го порядка
и определитель мат­ри­цы A не равен нулю. Как решить матричное уравнение
в Scilab, показано в листинге 3.39.
Листинг 3.39. Решение матричного уравнения (пример 3.7)
--> A=[ 2 3;-2 6];B=[2 5;2/3 5/3];
// Решение уравнения A*X=B. Первый способ
--> X=A\B
X =
0.5555556
1.3888889
0.2962963
0.7407407
// Второй способ
--> X=inv(A)*B
X =
0.5555556
1.3888889
0.2962963
0.7407407
// Проверка A*X-B=0
--> P=A*X-B;
--> mprintf('%1.2f\t%1.2f\n',P)
0.00
0.00
-0.00
-0.00
// Решение уравнения X*A=B. Первый способ
--> X=B/A
X =
1.2222222
0.2222222
0.4074074
0.0740741
// Второй способ
--> X=B*inv(A)
X =
1.2222222
0.2222222
0.4074074
0.0740741
// Проверка X*A-B=0
--> P=X*A-B;
--> mprintf('%1.2f\t%1.2f\n',P)
0.00
0.00
0.00
0.00

3.7. Решение систем линейных уравнений

119

3.7 Решение систем линейных уравнений
Система m уравнений с n неизвестными вида

называется системой линейных алгебраических уравнений (СЛАУ), причём
z z xj – неизвестные;
z z aij – коэффициенты при неизвестных;
z z bi – свободные коэффициенты (i = 1…m, j = 1…n).
Кроме того, система из m линейных уравнений с n неизвестными может
быть описана при помощи мат­ри­ц: A · x = b, где x = {xj} – вектор неизвестных;
A = {aij} – матрица коэффициентов при неизвестных или матрица системы;
b = {bi} – вектор свободных членов системы или вектор правых частей (i =
1…m, j = 1…n).
Матрица (A|b), которая формируется путём приписывания к мат­ри­це коэффициентов A столбца свободных членов b, называется расширенной мат­
рицей системы.
Если все bi = 0, то речь идёт об однородной системе линейных уравнений,
иначе говорят о неоднородной системе.
Совокупность всех решений системы (x1, x2…xn) называется множеством
решений, или просто решением системы. Две системы уравнений называются
эквивалентными, если они имеют одинаковое множество решений.
Однородные системы линейных уравнений Ax = 0 всегда разрешимы, так
как последовательность (x1 = 0, x2 = 0, …, xn = 0) удовлетворяет всем уравнениям системы. Такое решение называют тривиальным. Вопрос о решении
однородных систем сводится к вопросу о том, существуют ли, кроме тривиального, другие, нетривиальные решения.
Система линейных уравнений может не иметь ни одного решения, и тогда
она называется несовместной. Например, в системе

левые части уравнений совпадают, а правые различны, поэтому никакие
значения x1 и x2 не могут удовлетворить обоим уравнениям сразу.
Если же система линейных уравнений обладает решением, то она называется совместной. Совместная система называется определённой, если она
обладает одним-единственным решением, и неопределённой, если решений
больше, чем одно. Так, система

120

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

определена и имеет единственное решение x1 = 5, x2 = 1, а система уравнений

не определена, так как имеет бесконечное множество решений вида x1 = k,
x2 = 3k - 1, где число k произвольно.
Совокупность всех решений неопределённой системы уравнений называется её общим решением, а какое-то одно конкретное решение – частным.
Частное решение, полученное из общего при нулевых значениях свободных
переменных, называется базисным.
При определении совместности систем уравнений важную роль играет понятие ранга мат­ри­цы. Пусть дана мат­ри­ца A размером n×m. Вычёркиванием
некоторых строк или столбцов из неё можно получить квадратные мат­ри­
цы k-го порядка, определители которых называются минорами порядка k
мат­ри­цы А. Наивысший порядок не равных нулю миноров мат­ри­цы A называют рангом мат­ри­цы и обозначают r(A). Из определения вытекает, что
r(A) £ min(n, m), а r(A) = 0, только если мат­ри­ца нулевая и r(A) = n для невырожденной мат­ри­цы n-го порядка. При элементарных преобразованиях
(перестановка строк мат­ри­цы, умножение строк на число, отличное от нуля,
и сложение строк) ранг мат­ри­цы не изменяется. Итак, если речь идёт об исследовании системы на совместность, следует помнить, что система n линейных уравнений с m неизвестными:
z z несовместна, если r(A|b) > r(A);
z z совместна, если r(A|b) = r(A), причём при r(A|b) = r(A) = m имеет единственное решение, а при r(A|b) = r(A) < m имеет бесконечно много решений.
Существует немало методов для практического отыскания решений систем
линейных уравнений. Эти методы разделяют на точные и приближённые. Метод относится к классу точных, если с его помощью можно найти решение
в результате конечного числа арифметических и логических операций.
Задача 3.8
Решить заданную систему линейных уравнений при помощи правила Крамера.

(3.6)
Правило Крамера заключается в следующем. Если определитель detA мат­
ри­цы системы Ax = b из n уравнений с n неизвестными отличен от нуля, то
система имеет единственное решение (x1, x2, …, xn), определяемое по формугде deti – определитель мат­ри­цы, полученной из мат­
лам Крамера xi =

121

3.7. Решение систем линейных уравнений

ри­цы системы A заменой i-го столбца столбцом свободных членов b. Если
определитель мат­ри­цы системы равен нулю, это не означает, что система не
имеет решений: возможно, её нельзя решить по формулам Крамера.
Итак, для решения поставленной задачи необходимо выполнить следующие действия:
1) представить систему в матричном виде, т. е. сформировать мат­ри­цу
системы A и вектор правых частей b;
2) вычислить главный определитель detA;
3) сформировать вспомогательные мат­ри­цы для вычисления определителей deti;
4) вычислить определители deti;
5) найти решение системы по формуле xi =

.

Листинг 3.40 содержит решение поставленной задачи.
Листинг 3.40. Решение СЛАУ методом Крамера (пример 3.8)
disp('Решение СЛАУ методом Крамера');
disp('Матрица системы:'); A=[2 -1 5;3 2 -5;1 1 -2]
disp('Вектор свободных коэффициентов:'); b=[0;1;4]
disp('Главный определитель:'); D=det(A)
disp('Вспомогательные матрицы:');
A1=A; A1(:,1)=b
A2=A; A2(:,2)=b
A3=A; A3(:,3)=b
disp('Вспомогательные определители:');
d(1)=det(A1);
d(2)=det(A2);
d(3)=det(A3);
d
disp('Вектор решений СЛАУ Ax=b'); x=d/D
disp('Проверка Ax-b=0');
P=A*x'-b;
mprintf('%1.2f\n',P)
//Результат работы программы
Решение СЛАУ методом Крамера
Матрица системы:
A =
2. -1.
5.
3.
2. -5.
1.
1. -2.
Вектор свободных коэффициентов:
b =
0.
1.
4.
Главный определитель:
D = 6.

122

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Вспомогательные матрицы:
A1 =
0. -1.
5.
1.
2. -5.
4.
1. -2.
A2 =
2.
0.
5.
3.
1. -5.
1.
4. -2.
A3 =
2. -1.
0.
3.
2.
1.
1.
1.
4.
Вспомогательные определители:
d =
-17.
91.
25.
Вектор решений СЛАУ Ax=b
x =
-2.8333333
15.166667
4.1666667
Проверка Ax-b=0
-0.00
0.00
0.00

Решение СЛАУ по формулам Крамера выглядит достаточно громоздко, поэтому на практике его используют довольно редко.
Задача 3.9
Решить систему линейных уравнений 3.6 из примера 3.8 методом обратной мат­ри­цы.
Метод обратной матрицы: для системы из n линейных уравнений с n неизвестными Ax = b, при условии, что определитель мат­ри­цы A не равен нулю,
единственное решение можно представить в виде x = A-1b (вывод формулы
см. в примере 3.7).
Итак, для того чтобы решить систему линейных уравнений методом обратной мат­ри­цы, необходимо выполнить следующие действия:
1) сформировать мат­ри­цу коэффициентов и вектор свободных членов
заданной системы;
2) решить систему, представив вектор неизвестных как произведение
мат­ри­цы, обратной к мат­ри­це системы, и вектора свободных членов
(листинг 3.41).
Листинг 3.41. Решение СЛАУ примера 3.8 методом обратной матрицы (пример 3.9)
disp('Решение СЛАУ методом обратной матрицы');
disp('Матрица системы:');
A=[2 -1 5;3 2 -5;1 1 -2]
disp('Вектор свободных коэффициентов:');

3.7. Решение систем линейных уравнений

123

b=[0;1;4]
disp('Вектор решений СЛАУ Ax=b');
x=A^(-1)*b
disp('Вектор решений СЛАУ Ax=b с помощью функции inv(A)');
x=inv(A)*b
disp('Проверка Ax=b');
P=A*x;
mprintf('%1.2f\n',P)
//Результат работы программы
Решение СЛАУ методом обратной матрицы
Матрица системы:
A =
2. -1.
5.
3.
2. -5.
1.
1. -2.
Вектор свободных коэффициентов:
b =
0.
1.
4.
Вектор решений СЛАУ Ax=b
x =
-2.8333333
15.166667
4.1666667
Вектор решений СЛАУ Ax=b с помощью функции inv(A)
x =
-2.8333333
15.166667
4.1666667
Проверка Ax=b
0.00
1.00
4.00

Задача 3.10
Решить данную систему линейных уравнений методом Гаусса.

(3.7)

Решение системы линейных уравнений при помощи метода Гаусса основывается на том, что от заданной системы переходят к эквивалентной
системе, которая решается проще, чем исходная система.

124

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Метод Гаусса состоит из двух этапов. Первый этап – это прямой ход, в результате которого расширенная мат­ри­ца системы путём элементарных преобразований (перестановка уравнений системы, умножение уравнений на
число, отличное от нуля, и сложение уравнений) приводится к ступенчатому
виду:

На втором этапе (обратный ход) ступенчатую мат­ри­цу преобразовывают
так, чтобы в первых n столбцах получилась единичная мат­ри­ца:

Последний, n + 1 столбец этой мат­ри­цы содержит решение системы линейных уравнений.
Исходя из вышеизложенного, порядок решения задачи в Scilab (лис­
тинг 3.42) следующий:
1) сформировать мат­ри­цу коэффициентов A и вектор свободных членов b
заданной системы;
2) сформировать расширенную мат­ри­цу системы, объединив A и b;
3) используя функцию rref, привести расширенную мат­ри­цу к ступенчатому виду;
4) найти решение системы, выделив последний столбец мат­ри­цы, полученной в предыдущем пункте;
5) выполнить вычисление Ax - b; если в результате получился нулевой
вектор, задача решена верно.
Листинг 3.42. Решение СЛАУ методом Гаусса (пример 3.10)
disp('Решение СЛАУ методом Гаусса');
disp('Матрица системы:'); A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6]
disp('Вектор свободных коэффициентов:'); b=[8;9;-5;0]
disp('Расширенная матрица системы:'); C=rref([A b])
disp('Размерность матрицы C:'); n=size(C)
disp('Вектор решений СЛАУ Ax=b'); x=C(:,n(2))
disp('Проверка Ax-b'); P=A*x-b;
mprintf('%1.2f\n',P)
//Результат работы программы

3.7. Решение систем линейных уравнений

125

Решение СЛАУ методом Гаусса
Матрица системы:
A =
2.
1. -5.
1.
1. -3.
0. -6.
0.
2. -1.
2.
1.
4. -7.
6.
Вектор свободных коэффициентов:
b =
8.
9.
-5.
0.
Расширенная матрица системы:
C =
1.
0.
0.
0.
3.
0.
1.
0.
0. -4.
0.
0.
1.
0. -1.
0.
0.
0.
1.
1.
Размерность матрицы C:
n =
4.
5.
Вектор решений СЛАУ Ax=b
x =
3.
-4.
-1.
1.
Проверка Ax-b
0.00
0.00
0.00
-0.00

Задача 3.11
Решить систему линейных уравнений из примера 3.10 с помощью LU-раз­
ложения.
Дадим определение разложения мат­ри­цы на множители. Если все определители квадратной мат­ри­цы A отличны от нуля, то существуют такие нижняя L и верхняя U треугольные мат­ри­цы, что A = LU:

Если диагональные элементы одной из мат­ри­ц ненулевые, то такое разложение единственно.

126

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Метод решения системы линейных уравнений с использованием разложения мат­ри­цы коэффициентов на множители называют LU-разложением,
или LU-факторизацией.
Если мат­ри­ца A исходной системы Ax = b разложена в произведение треугольных мат­ри­ц L и U, то можно записать уравнение: LUx = b.
Введя вектор вспомогательных переменных y = (y1, y2, …, yn)T, уравнение
LUx = b можно переписать в виде системы:
Таким образом решение системы Ax = b с квадратной мат­ри­цей коэффициентов свелось к последовательному решению двух систем с треугольными
мат­ри­цами коэффициентов.
Обратим внимание на тот факт, что выполнение приведённых расчётов
можно интерпретировать как преобразование данной системы к треугольной. Иными словами, LU-разложение – это другая схема реализации метода
Гаусса.
Исходя из средств, которыми располагает Scilab, решение поставленной
задачи будет выглядеть так (листинг 3.43):
1) сформируем мат­ри­цу коэффициентов A и вектор свободных членов b
заданной системы;
2) воспользовавшись функцией lu(A), получим мат­ри­цы L (нижняя тре­
угольная мат­ри­ца), U (верхняя треугольная мат­ри­ца) и P (мат­ри­ца перестановок, или, иначе, мат­ри­ца, которая демонстрирует, каким образом были переставлены строки исходной мат­ри­цы при разложении
на множители L и U);
3) поскольку в задаче речь идёт о решении системы, то элементы вектора b должны занять места, соответствующие строкам мат­ри­цы A, для
чего необходимо выполнить действие Pb;
4) решим системы уравнений Ly = b относительно y;
5) зная U и y, найдём решение системы Ux = y.
Листинг 3.43. Решение СЛАУ методом LU-разложения (пример 3.11)
disp('Решение СЛАУ методом LU-разложения');
disp('Матрица системы:'); A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6]
disp('Вектор свободных коэффициентов:'); b=[8;9;-5;0]
disp('LU-разложение:'); [L,U,P]=lu(A)
Y=rref([L P*b])
n=size(Y)
y=Y(:,n(2))
X=rref([U y])
n=size(X)
x=X(:,n(2))
disp('Проверка Ax-b'); P=A*x-b;
mprintf('%1.2f\n',P)
//Результат работы программы

3.7. Решение систем линейных уравнений
Решение СЛАУ методом LU-разложения
Матрица системы:
A =
2.
1. -5.
1.
1. -3.
0. -6.
0.
2. -1.
2.
1.
4. -7.
6.
Вектор свободных коэффициентов:
b =
8.
9.
-5.
0.
LU-разложение:
P =
1.
0.
0.
0.
1.
0.
0.
0.
0.
0.
0.
1.

0.
0.
1.
0.

U =
2.
1. -5.
0. -3.5 2.5
0.
0. -2.
0.
0.
0.

1.
-6.5
-1.
-1.9285714

L =
1.
0.
0.5
1.
0.5 -1.
0.
-0.5714286
Y =
1.
0.
0.
1.
0.
0.
0.
0.
n =
4.
5.
y =

0.
0.
1.
0.

0.
0.
1.
-0.2142857
0.
0.
0.
1.

8.
5.
1.
-1.9285714

0.
0.
0.
1.

3.
-4.
-1.
1.

8.
5.
1.
-1.9285714
X =
1.
0.
0.
1.
0.
0.
0.
0.

0.
0.
1.
0.

0.
0.
0.
1.

127

128

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

n =
4.
5.
x

=
3.
-4.
-1.
1.

Проверка Ax-b
0.00
0.00
-0.00
0.00

Задача 3.12
Решить систему линейных уравнений с помощью QR-разложения.

(3.8)

Квадратную мат­ри­цу A можно представить в виде произведения ортогональной мат­ри­цы Q и верхней треугольной мат­ри­цы R. Использование этого
свойства мат­ри­ц при решении системы линейных уравнений называют методом QR-разложения.
Идея решения системы этим методом аналогична той, что была описана
в предыдущей задаче:
Ax = b ⇒ QRx = b ⇒ (Qy = b, Rx = y).

Таким образом, решение системы уравнений с квадратной мат­ри­цей коэффициентов сводится к решению двух систем, мат­ри­ца коэффициентов
первой ортогональная, второй – верхняя треугольная.
Как решить эту задачу средствами Scilab, показано в листинге 3.44.
Листинг 3.44. Решение СЛАУ методом QR-разложения (пример 3.12)
disp('Решение линейной системы с помощью QR-разложения');
A=[3,1,-1,2;-5,1,3,-4;2,0,1,-1;1,-5,3,-3]
b=[6;-12;1;3]
[Q,R]=qr(A)
y=Q'*b
X=rref([R y])
x=X(1:4,5:5)
//Результат работы программы

3.7. Решение систем линейных уравнений
Решение линейной системы с помощью QR-разложения
A =
3.
1. -1.
2.
-5.
1.
3. -4.
2.
0.
1. -1.
1. -5.
3. -3.
b =
6.
-12.
1.
3.
R =
-6.244998
1.1208971
2.081666
0.
-5.0738141
3.0220526
0.
0.
-2.5561425
0.
0.
0.
Q =
-0.4803845 -0.303216
-0.3584834
0.8006408 -0.0202144 -0.5455182
-0.3202563 -0.0707504 -0.7356703
-0.1601282
0.9500767 -0.1808003

-3.3626912
-3.3050542
2.7431773
0.4938648

y

0.7407972
0.2469324
-0.5926378
0.1975459

=
-13.290637
1.2027567
3.117247
1.4815944

X =
1.
0.
0.
1.
0.
0.
0.
0.
x

0.
0.
1.
0.

0.
0.
0.
1.

1.
-1.
2.
3.

=
1.
-1.
2.
3.

Задача 3.13
Исследовать систему на совместность и, если возможно, решить её.

а)

129

130

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

б)

в)
Для решения задачи (листинг 3.45) введём исходные данные, т. е. мат­ри­цу
коэффициентов системы и вектор правых частей. Затем выполним вычисление рангов мат­ри­цы коэффициентов и расширенной мат­ри­цы системы.
Возможны три случая:
1) ранги мат­ри­ц равны и совпадают с количеством неизвестных r(A|b) =
r(A) = 3, значит, система совместна и имеет единственное решение;
2) ранг расширенной мат­ри­цы больше ранга мат­ри­цы системы r(A|b) >
r(A), что означает несовместность системы;
3) ранг расширенной мат­ри­цы равен рангу мат­ри­цы системы r(A|b) = r(A)
= 3, но меньше, чем количество неизвестных системы r(A|b) = r(A) < 4.
Значит, система совместна, но имеет бесконечное множество решений.
Листинг 3.45. Исследование системы на совместность (пример 3.13)
disp('Исследование системы на совместность');
disp('Введите матрицу системы:'); A=input('A=');
disp('Введите вектор свободных коэффициентов:'); b=input('b=');
[n,m]=size(A);
mprintf('Размерность системы: %d %d\n',n,m);
r=rank(A)
mprintf('Ранг матрицы системы: %d\n',r);
R=rank([A b])
mprintf('Ранг расширенной матрицы: %d\n', R);
if r==R
disp('Система совместна.');
if r==m
disp('Система имеет единственное решение.');
disp('Решение системы методом обратной матрицы:');
x=inv(A)*b;
disp(x);
disp('Проверка Ax-b=0:');
y=A*x-b;
disp(y);
else
disp('Система имеет бесконечно много решений.');
end;
else
disp('Система не совместна');

3.8. Собственные значения и собственные векторы

131

end;
//Результат работы программы
Исследование системы а) на совместность
Введите матрицу системы:
A=[1 2 5;1 -1 3; 3 -6 -1];
Введите вектор свободных коэффициентов:
b=[-9;2;25];
Размерность системы: 3 3
Ранг матрицы системы: 3
Ранг расширенной матрицы: 3
Система совместна.
Система имеет единственное решение.
Решение системы методом обратной матрицы:
2.
-3.
-1.
Проверка Ax-b=0:
0.
0.
-3.553D-15
Исследование системы б) на совместность
Введите матрицу системы:
A=[1 -5 -8 1;3 1 -3 -5;1 0 -7 2;0 11 20 -9]
Введите вектор свободных коэффициентов:
b=[3;1;-5;2]
Размерность системы: 4 4
Ранг матрицы системы: 3
Ранг расширенной матрицы: 4
Система не совместна
Исследование системы в) на совместность
Введите матрицу системы:
A=[4 1 -3 -1;2 3 1 -5;1 -2 -2 4]
Введите вектор свободных коэффициентов:
b=[0;0;0]
Размерность системы: 3 4
Ранг матрицы системы: 3
Ранг расширенной матрицы: 3
Система совместна.
Система имеет бесконечно много решений.

3.8

Собственные значения и собственные векторы

Пусть A – мат­ри­ца размерностью n×n. Любой ненулевой вектор x, принадлежащий некоторому векторному пространству, для которого Ax = λx, где λ –
некоторое число, называется собственным вектором матрицы, а λ – принадлежащим ему или соответствующим ему собственным значением матрицы A.

132

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Уравнение Ax = λx эквивалентно уравнению (A - λE)x = 0. Это однородная
система линейных уравнений, нетривиальные решения которой являются искомыми собственными векторами. Она имеет нетривиальные решения только тогда, когда r(A - λE) < n, т. е. если det(A - λE) = 0. Многочлен
det(A - λE) называется характеристическим многочленом матрицы A, а уравнение det(A - λE) = 0 – характеристическим уравнением матрицы A. Если
λi – собственные значения A, то нетривиальные решения однородной системы линейных уравнений det(A - λE) = 0 есть собственные векторы A, принадлежащие собственному значению λi. Множество решений этой системы
уравнений называют собственным подпространством матрицы A, принадлежащим собственному значению λi, каждый ненулевой вектор собственного
подпространства является собственным вектором матрицы A.
Иногда требуется найти собственные векторы y и собственные значения ℏ,
определяемые соотношением Ay = ℏBy, (y ≠ 0), где B – невырожденная мат­
ри­ца. Векторы y и числа ℏ обязательно являются собственными векторами
и собственными значениями мат­ри­цы B-1A. Пусть A = aij и B = bij, причём мат­
ри­ца B является положительно определённой, тогда собственные значения ℏ
совпадают с корнями уравнения n-й степени det(A - ℏB) = det(aij - ℏbij) = 0.
Это уравнение называют характеристическим уравнением для обобщённой
задачи о собственных значениях. Для каждого корня ℏ кратности m существует ровно m линейно независимых собственных векторов y.
Задача 3.14
Найти собственные значения и собственные векторы мат­ри­цы A.
В листинге 3.46 показано решение поставленной задачи.
Листинг 3.46. Нахождение собственных значений (пример 3.14)
disp('Введите матрицу:'); A=input('A=');
[n,m]=size(A);
d=spec(A)
disp('Вектор собственных значений матрицы A:');disp(d);
[L, D]=spec(A);
disp('L - Матрица собственных векторов:'); disp(L);
disp('D - Диагональная матрица собственных значений:');
[N M]=size(D);
for i=1:N
for j=1:M
mprintf('%2.1f\t',D(i,j));
end
mprintf('\n');
end
disp('Проверка:');
for i=1:n
p=(A-D(i,i)*eye(n,n))*L(:,i);
mprintf('%2.2f\t',p);
mprintf('\n');
end;

3.8. Собственные значения и собственные векторы

133

//Результат работы программы
Введите матрицу:
A=[5 2 -1;1 -3 2; 4 5 -3]
Вектор собственных значений матрицы A:
4.9083269
-1.180D-16
-5.9083269
L - Матрица собственных векторов:
-0.796113
-0.0493264
0.1813029
-0.2410436
0.54259
-0.5988027
-0.5550694
0.8385482
0.7801055
D - Диагональная матрица собственных значений:
4.9
0.0
0.0
0.0
-0.0
0.0
0.0
0.0
-5.9
Проверка:
-0.00
0.00
0.00
0.00
0.00
-0.00

-0.00
0.00
-0.00

Задача 3.15
Привести заданную мат­ри­цу к диагональному виду.
Задача состоит в том, чтобы для квадратной мат­ри­цы A подобрать такую
мат­ри­цу C, чтобы мат­ри­ца B = C -1AC имела диагональный вид. Эта задача
связана с теорией собственных значений, так как разрешима только в том
случае, если мат­ри­ца C состоит из собственных векторов мат­ри­цы A.
Листинг 3.47. Приведение к диагональному виду (пример 3.15)
disp('Введите матрицу:'); A=input('A=');
[C,D]=spec(A);
disp('Диагональная матрица к матрице А:');
[N M]=size(D);
for i=1:N
for j=1:M
mprintf('%2.1f\t',D(i,j));
end
mprintf('\n');
end
disp('Проверка B=D');
B=inv(C)*A*C
[N M]=size(B);
for i=1:N
for j=1:M
mprintf('%2.1f\t',B(i,j));

134

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры
end
mprintf('\n');

end
//результат работы программы
Введите матрицу:
A=[2 1 3;1 -2 1;3 2 2]
Диагональная матрица к матрице А:
5.4
0.0
0.0
0.0
-1.0
0.0
0.0
0.0
-2.4
Проверка B=D
5.4
-0.0
0.0

3.9

-0.0
-1.0
0.0

-0.0
-0.0
-2.4

Норма и число обусловленности матрицы

Матричная норма – это некоторая скалярная числовая характеристика, которую ставят в соответствие мат­ри­це. В задачах линейной алгебры используются различные матричные нормы:
z z первая норма ||A||1 квадратной мат­ри­цы A = {aij}:

zz

вторая норма ||A||2 квадратной мат­ри­цы A = {aij}:

где

– максимальное собственное значение мат­ри­цы A = {aij};

zz

евклидова норма ||A||e квадратной мат­ри­цы A = {aij}:

zz

бесконечная норма ||A||i квадратной мат­ри­цы A = {aij}:

Число обусловленности матрицы A используется для определения меры
чувствительности системы линейных уравнений Ax = b к погрешностям задания вектора b. Чем больше число обусловленности, тем более неустойчив
процесс нахождения решения системы. Существует несколько вариантов
вычисления числа обусловленности, но все они связаны с нормой мат­ри­цы
и равны произведению нормы исходной мат­ри­цы на норму обратной:

3.9. Норма и число обусловленности матрицы
zz
zz
zz
zz

135

число обусловленности мат­ри­цы, вычисленное в норме ||A||1:
N = ||A||1 · ||A-1||1;
число обусловленности мат­ри­цы, вычисленное в норме ||A||2:
M = ||A||2 · ||A-1||2;
число обусловленности мат­ри­цы, вычисленное в норме ||A||i :
P = ||A||i · ||A-1||i;
число обусловленности мат­ри­цы, вычисленное в норме ||A||e:
H = ||A||e · ||A-1||e.

Задача 3.16
Вычислить нормы и числа обусловленности мат­ри­цы A.
В листинге 3.48 приведён фрагмент документа, в котором происходит вычисление норм мат­ри­цы A с помощью функции norm и по соответствующим формулам. Вычисление чисел обусловленности проведено при помощи
функции cond(A) и по формулам, отражающим зависимость числа обусловленности от соответствующей нормы мат­ри­цы.
Листинг 3.48. Вычисление матричных норм (пример 3.16)
disp('Введите матрицу:'); A=input('A='); [n,m]=size(A);
n_1=norm(A,1); N_1=max(sum(abs(A),'c'));
mprintf('Первая норма: %2.2f\n', N_1);
n_2=norm(A,2); N_2= sqrt(max(spec(A*A')));
mprintf('Вторая норма: %2.2f\n',N_2);
n_i= norm(A,'inf'); N_i=max(sum(abs(A'),'c'));
mprintf('Бесконечная норма: %2.2f\n',N_i);
n_e= norm(A,'fro'); N_e= sqrt(sum(diag(A*A')));
mprintf('Евклидова норма: %2.2f\n', N_e);
c_1= cond(A,1); C_1= norm(A,1)*norm(inv(A),1);
mprintf('Число обусловленности в первой норме: %2.2f\n',C_1);
c_2=cond(A,2); C_2=norm(A,2)*norm(inv(A),2);
mprintf('Число обусловленности во второй норме: %2.2f\n',C_2);
c_i= cond(A,'inf'); C_i= norm(A,'inf')*norm(inv(A),'inf');
mprintf('Число обусловленности в бесконечной норме: %2.2f\n',C_i);
c_e= cond(A,'fro'); C_e= norm(A,'fro')*norm(inv(A),'fro');
mprintf('Число обусловленности в евклидовой норме: %2.2f\n',C_e);
//Результат работы программы

136

Глава 3. Массивы и матрицы в Scilab. Решение задач линейной алгебры

Введите матрицу:
A=[5 7 6 5;7 10 8 7;6 8 10 9;5 7 9 10]
Первая норма: 33.00
Вторая норма: 30.29
Бесконечная норма: 33.00
Евклидова норма: 30.55
Число обусловленности в первой норме: 4488.00
Число обусловленности во второй норме: 2984.09
Число обусловленности в бесконечной норме: 4488.00
Число обусловленности в евклидовой норме: 3009.58

Глава 4

Построение графиков в Scilab
В этой главе читатель может познакомиться с графическим аппаратом Scilab
для построения двумерных и трёхмерных графиков.

4.1 Построение графиков в декартовой системе
координат
Декартова (прямоугольная) система координат задаётся двумя перпендикулярными прямыми, называемыми осями координат. Горизонтальная прямая X – ось абсцисс, а вертикальная Y – ось ординат. Точку пересечения осей
называют началом координат. Четыре угла, образованные осями координат,
носят название координатных углов. Положение точки в прямоугольной системе координат определяется значением двух величин, называемых координатами точки. Если точка имеет координаты x и y, то x – абсцисса точки,
y – ордината. Уравнение, связывающее координаты x и y, является уравнением линии, если координаты любой точки этой линии удовлетворяют ему.
Величина y называется функцией переменной величины x, если каждому
из тех значений, которые может принимать x, соответствует одно или несколько определённых значений y. При этом переменная величина x называется аргументом функции y = f(x). Говорят также, что величина y зависит
от величины х. Функция считается заданной, если для каждого значения
аргумента существует соответствующее значение функции. Чаще всего используют следующие способы задания функций:
z z табличный – числовые значения функции уже заданы и занесены в таб­
лицу; недостаток заключается в том, что таблица может не содержать
все нужные значения функции;
z z графический – значения функции заданы при помощи линии (графика), у которой абсциссы изображают значения аргумента, а ординаты –
соответствующие значения функции;
z z аналитический – функция задаётся одной или несколькими формулами (уравнениями); при этом если зависимость между x и y выражена
уравнением, разрешённым относительно y, то говорят о явно заданной
функции, в противном случае функция считается неявной.

138

Глава 4. Построение графиков в Scilab

Совокупность всех значений, которые может принимать в условиях поставленной задачи аргумент x функции y = f(x), называется областью определения этой функции. Совокупность значений y, которые принимает функция
f(x), называется множеством значений функции.
Для того чтобы построить график функции f(x), необходимо сформировать
два массива x и y одинаковой размерности, а затем обратиться к функции plot:
plot(x,y)
Здесь x – массив абсцисс; y – массив ординат.
В простейшем случае обращение к функции имеет вид plot(y). В качестве
массива х выступает массив номеров точек массива y. В листинге 4.1 и на
рис. 4.1 представлен пример построения графика функции y = f(i), где i –
номер точки в массиве y.

Рис. 4.1. График функции y = f(i )

В результате обращения к функции plot(y) будет создано окно с именем
Графическое окно 0, в котором будет построен график функции y = f(i ).
График формируется путём соединения соседних точек прямыми линиями. Чем больше интервал между соседними точками (т. е. чем меньше точек),
тем больше заметно, что график представляет из себя ломаную.
Листинг 4.1. Построение графика функции вида y = f(i)
y=[1 2 3 -2 4 5 -1 6 9 11 0 -2 5];
plot(y);

4.2. Особенности работы функции plot

4.2

139

Особенности работы функции plot

В Scilab любой объект является мат­ри­цей. В функции plot мат­ри­ца x отвечает за построение оси абсцисс. Матрица y отвечает за построение графика
функции по заданным значениям в заданных точках. Для нормального построения графика должны совпадать размерности мат­ри­ц x и y.
Функция считывает мат­ри­цу следующим образом: количество строк мат­
ри­цы – это количество точек для построения графика, а количество столбцов
мат­ри­цы – это количество функций.
Пример: пусть мат­ри­ца Х выглядит так:
0.
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.

Матрица y=sin(x):
0.
0.0998334
0.1986693
0.2955202
0.3894183
0.4794255
0.5646425
0.6442177
0.7173561
0.7833269
0.841471

В таком случае функция plot(x,y) построит один график по одиннадцати
точкам (см. рис. 4.2).
Добавим ещё один вектор-столбец (т. е. мат­ри­цу размером Nx1) z=cos(x):
1.
0.9950042
0.9800666
0.9553365
0.921061
0.8775826
0.8253356
0.7648422
0.6967067
0.62161
0.5403023

140

Глава 4. Построение графиков в Scilab

Рис. 4.2. Результат работы функции plot(x,y)

Чтобы сохранить количество входных параметров, объединим y и z в одну
мат­ри­цу.
0.
0.0998334
0.1986693
0.2955202
0.3894183
0.4794255
0.5646425
0.6442177
0.7173561
0.7833269
0.841471

1.
0.9950042
0.9800666
0.9553365
0.921061
0.8775826
0.8253356
0.7648422
0.6967067
0.62161
0.5403023

Теперь функция plot(x,[y;z]) построит два графика по одиннадцати точкам (см. рис. 4.3).
Однако при написании кода в Scilab:
x=0:0.1:1;
y=sin(x);
z=cos(x);
plot(x,[y;z]);

4.2. Особенности работы функции plot

141

кроме окна с графиком выводится сообщение:
ВНИМАНИЕ: Транспонирование вектора-строки X для совместимости размеров
ВНИМАНИЕ: Транспонирование матрицы данных Y для получения совместимости
размерности

Рис. 4.3. Результат работы функции plot(x,[y;z])

Дело в том, что при создании массива стандартным способом формируется
мат­ри­ца с размерами 1xN (1 строка на N столбцов).
--> x=0:0.1:1
x = 0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00
--> y=sin(x)
y = 0.000 0.100 0.199 0.296 0.389 0.479 0.565 0.644 0.717 0.783 0.841
--> z=cos(x)
z = 1.000 0.995 0.980 0.955 0.921 0.878 0.825 0.765 0.697
0.622 0.540

И мат­ри­ца [y;z] выглядит так:
0.000 0.100 0.199 0.296 0.389 0.479 0.565 0.644 0.717 0.783 0.841
1.000 0.995 0.980 0.955 0.921 0.878 0.825 0.765 0.69 0.622 0.540

142

Глава 4. Построение графиков в Scilab

Если количество строк в мат­ри­це – это количество точек для построения
графика, то массив Х задаёт всего одну. Построить график в единственной
точке нельзя, следовательно, массив Х не выполняет свою функцию.
Scilab предотвращает такое поведение при помощи автоматического
транспонирования. Именно об этом и выводится сообщение. Если транспонировать мат­ри­цу [y;z], т. е. вызвать функцию
--> plot(x,[y;z]')

будет выведено одно сообщение:
ВНИМАНИЕ: Транспонирование вектора-строки X для совместимости размеров

так как мат­ри­ца [y;z] введена корректно и транспонировать нужно только
вектор X.
Однако автоматическое транспонирование происходит не всегда.
Например, нужно построить графики функций y=sin(x) на интервале
[0;1] и z=cos(x) на интервале [1;2]. Оба графика должны быть расположены в одной системе координат.
Первое, что нужно сделать для решения задачи, – разделить общий интервал [0;2] на два: [0;1] и [1;2]. Сделаем это с помощью массивов х1 и х2.
//Шаг 0.1
--> x1=0:0.1:1
x1 = 0.
0.1
--> x2=1:0.1:2
x2 = 1.
1.1

0.2
1.2

0.3

0.4

1.3

1.4

0.5
1.5

0.6
1.6

0.7

0.8

1.7

0.9

1.8

1.9

1.
2.

Теперь зададим функции y=sin(x) и z=cos(x) с учётом того, что каждая
функция должна быть отображена на своём интервале.
--> y=sin(x1)
y = 0.000 0.100 0.199
0.783 0.841
--> z=cos(x2)
z = 0.540 0.454 0.362
-0.227 -0.323 -0.416

0.296

0.389

0.479

0.565

0.267

0.170

0.071

-0.029

0.644

0.717

-0.129

Для сохранения количества входных параметров объединим массивы х1
и х2 в одну мат­ри­цу, а y и z – в другую. Матрица [x1;x2]:
0.
1.

0.1
1.1

0.2
1.2

0.3
1.3

0.4
1.4

0.5
1.5

0.6
1.6

0.7
1.7

0.8
1.8

0.9
1.9

1.
2.

Матрица [y;z]:
0.000 0.100 0.199 0.296 0.389 0.479 0.565 0.644 0.717
0.783 0.841
0.540 0.454 0.362 0.267 0.170 0.071 -0.029 -0.129 -0.227 -0.323 -0.416

Вызываем функцию
-->plot([x1;x2],[y;z])

4.2. Особенности работы функции plot

143

Сообщения о транспонировании нет, а в окне Scilab построено одиннадцать графиков по двум точкам (см. рис. 4.4).

Рис. 4.4. Результат работы функции plot([x1;x2],[y;z])

Если посмотреть на вид вышеприведённых мат­ри­ц, можно увидеть, что
количество строк равно двум, а количество столбцов – одиннадцати. Иначе
говоря, количество точек для построения графика равно двум, а количество
функций – одиннадцати. Здесь нет никаких несоответствий, а значит, не
нужно ничего транспонировать.
Автоматическое транспонирование применяется только к векторам.
А вот для вывода двух графиков функций по одиннадцати точкам следует
при вызове функции plot явно указать, что мат­ри­цы должны быть транспонированы. Тогда
--> plot([x1;x2]',[y;z]')

выводит ожидаемые графики функций(см. рис. 4.5).
Также обратите внимание, что и мат­ри­ца [x1;x2], и мат­ри­ца [y;z] имеют
одинаковые размеры 2х11 (или 11х2 в случае транспонирования). Совпадение размеров мат­ри­ц крайне важно, так как первым параметром в функцию
передаются точки для построения графика, а вторым – значения в этих точках. Если размеры мат­ри­ц будут разные, то функция plot не сможет построить график. Будет выведено сообщение:
plot: Неверный размер входных аргументов №2 и №3: размеры несовместимы.

144

Глава 4. Построение графиков в Scilab

Рис. 4.5. Результат работы функции plot([x1;x2]',[y;z]')

Задача 4.1
Построить график функции y = sin(cos(x)) на интервале [-2π; 2π] с шагом
π/10 с помощью функции plot.
Сформируем массив X. Вычисляя значение функции y = sin(cos(x)) для каждого значения массива X, создадим массив Y . Затем воспользуемся функцией
plot(x,y) для построения кривой (см. листинг 4.2, рис. 4.6).
Листинг 4.2. Построение графика функции y = sin(cos(x))
x=-2*%pi:%pi/10:2*%pi;// Формирование массива x.
y=sin(cos(x));// Формирование массива y.
plot(x,y)// Построение графика функции.

Задача 4.2
Построить график функции y = sin(x) + sin(3x) + sin(5x) на интервале
[-10; 10] с шагом 0.1.
Решение этой задачи представлено в листинге 4.3.
Листинг 4.3. Построение графика (пример 4.2)
x=-10:0.1:10;
y=sin(x)+sin(3*x)/3+sin(5*x)/5;
plot(x,y)

4.2. Особенности работы функции plot

Рис. 4.6. График функции y = sin(cos(x))

Рис. 4.7. График функции y = sin(x) + 13 sin(3x) + 15 sin(5x)

145

146

Глава 4. Построение графиков в Scilab

4.3 Построение нескольких графиков в одной
системе координат
Построить несколько графиков в одной системе координат можно несколькими способами:
1) в функции plot(x,y) вторым параметром указать мат­ри­цу, в которой
количество столбцов равно количеству функций;
2) использовать расширенный синтаксис функции plot:
plot(x1,y1,x2,y2,...,xn,yn);
3) повторно вызвать команду plot с другими параметрами.
Задача 4.3
В одной системе координат построить графики функций y = sin(cos(x)), z =
cos(sin(x)), v = esin(x), t = ecos(x) на интервале [-2π; 2π] с шагом 0,1.
Листинг 4.4. Построение графиков нескольких функций. Способ 1
x=-2*%pi:%pi/10:2*%pi;
y=sin(cos(x));
z=cos(sin(x));
v=exp(sin(x));
t=exp(cos(x));
plot(x',[y;z;v;t]');

Рис. 4.8. Построение графиков нескольких функций

4.3. Построение нескольких графиков в одной системе координат

147

Вообще говоря, не обязательно формировать для каждой функции свой
массив значений. Достаточно указать в квадратных скобках через точку с запятой их математические выражения, и массивы автоматически будут созданы как промежуточный этап построения функций.
x=-2*%pi:%pi/10:2*%pi;
plot(x',[sin(cos(x));cos(sin(x));exp(sin(x));exp(cos(x));]');

Задача 4.4
В одной системе координат построить графики функций y = sin
cos(x) и v = ecos(x). Интервал изменения x: [-6,28; 6,28], шаг: 0.02.

,z =

Для построения нескольких графиков в одной системе координат также
можно обратиться к функции plot следующим образом:
plot(x1,y1,x2,y2,...xn,yn)
где x1, y1 – массивы абсцисс и ординат первого графика; x2, y2 – массивы
абсцисс и ординат второго графика; xn, yn – массивы абсцисс и ординат n-го
графика.
В нашем случае обращение к функции plot будет иметь вид plot(x,y,x,z,
x,v) (листинг 4.5 и рис. 4.9).
Листинг 4.5. Построение графиков нескольких функций. Способ 2
//Вариант 1
x=-6.28:0.02:6.28;
y=sin(x/2); z=cos(x); v=exp(cos(x));
plot(x,y,x,z,x,v);
//Вариант 2
x=-6.28:0.02:6.28;
plot(x,sin(x/2),x,cos(x),x,exp(cos(x)));

Обратите внимание, что при построении графиков этим способом Scilab
автоматически изменяет цвета кривых, изображаемых в одной системе координат.
Задача 4.5
Построить в одной системе координат графики функций y = sin
cos(x) и v = ecos(x). Интервал изменения x: [-6,28; 6,28], шаг: 0.02.

,z =

Если повторно обратиться к функции plot, новый график функции будет
дорисован поверх предыдущего в этом же окне.
Следовательно, несколько графиков в одной системе координат можно
вывести повторным вызовом функции plot c другими параметрами.
Чтобы стереть график и построить вместо него новый, достаточно перед
вызовом plot вызвать функцию
mtlb_hold('off')

148

Глава 4. Построение графиков в Scilab

Рис. 4.9. Графики нескольких функций

Листинг 4.6. Построение графиков нескольких функций. Способ 3
//Вывод нескольких графиков в одной системе координат
x=-6.28:0.02:6.28;
y=sin(x/2);
z=cos(x);
v=exp(cos(x));
plot(x,y);
plot(x,z);
plot(x,v);
//Перерисовка графиков
x=-6.28:0.02:6.28;
y=sin(x/2);
z=cos(x);
v=exp(cos(x));
mtlb_hold('off');
plot(x,y);
plot(x,z);
plot(x,v);
//В результате в графическом окне остаётся
//только последний график

4.4. Построение нескольких графиков в одном графическом окне

149

Рис. 4.10. Графики нескольких функций

4.4 Построение нескольких графиков в одном
графическом окне
В Scilab можно выводить несколько графиков в одном окне, не совмещая их
в одной системе координат.
Вывести несколько графиков в одном окне можно с помощью функции
subplot. Она разделяет графическое окно на несколько отдельных областей,
в каждой из которых строится свой график с собственной системой координат. Обращение к функции имеет вид:
subplot(m,n,p) или subplot(mnp)
Выполнение функции приводит к тому, что графическое окно разбивается
на m окон по вертикали и n окон по горизонтали, текущим окном становится
окно с номером p.
Задача 4.6
Построить графики функций y = sin(x), z = cos(x), u = cos(sin(x)), v =
sin(cos(x)), w = exp(sin(x)) и r = exp(cos(x)) в одном графическом окне, каждый в своей системе координат, используя команду subplot.

150

Глава 4. Построение графиков в Scilab

Пусть x изменяется на интервале [-10; 10] с шагом 0.01. Сформируем массивы значений функций Y, Z, U, V, W, R.
C помощью функции subplot разбиваем графическое окно на заданное
количество областей. Пусть в каждом столбце по вертикали будет три, а по
горизонтали две области для вывода графиков.
Третье число в записи функции subplot указывает, в которую из областей
(счет ведется по порядку – слева направо и сверху вниз) выводится график,
формируемый функцией plot(x,y) (листинг 4.7 и рис. 4.11).

Рис. 4.11. Графики шести функций в одном графическом окне

Листинг 4.7. Несколько графиков в одном окне, но в разных системах координат
x=[-10:0.01:10];
y=sin(x); z=cos(x);
u=cos(sin(x)); v=sin(cos(x));
w=exp(sin(x)); r=exp(cos(x));
subplot(3,2,1);
plot(x,y);
subplot(3,2,2);
plot(x,z);
subplot(3,2,3);
plot(x,u);
subplot(3,2,4);

4.5. Оформление графиков при помощи функции plot

151

plot(x,v);
subplot(3,2,5);
plot(x,w);
subplot(3,2,6);
plot(x,r);

4.5

Оформление графиков при помощи функции plot

Установить желаемый вид и цвет графика можно, используя полную форму
обращения к функции plot:
plot(x1, y1, s1, x2, y2, s2, ..., xn, yn, sn)
где x1, x2, ..., xn – массивы абсцисс графиков; y1, y2, ..., yn – массивы ординат графиков; s1, s2, ..., sn – строка, состоящая из трёх символов, которые
определяют соответственно цвет линии, тип маркера и тип линии графиков
(см. табл. 4.1– 4.3), в строке могут использоваться один, два или три символа
одновременно в любой желаемой комбинации.
Задача 4.7
Построить графики функций y = sin , z = cos(x) и v = ecos(x) в одних координатных осях и независимо определить внешний вид каждого графика.
будет штриховым, z = cos(x) – чёрного
Пусть график функции y = sin
цвета, с маркером в виде звёздочки, v = exp(cos(x)) – штриховым, красного цвета, с маркером в виде точки (см. листинг 4.8 и рис. 4.12).
Листинг 4.8. Изменение внешнего вида графика с помощью plot
x=-6.28:0.2:6.28;
y=sin(x/2);
z=cos(x);
v=exp(cos(x));
plot(x,y,'--');
plot(x,z,'k*');
plot(x,v,'r.--');

Таблица 4.1. Символы, определяющие цвет линии графика
Символ

Описание

y
m
с
r
g
b
w
k

Жёлтый
Розовый
Голубой
Красный
Зелёный
Синий
Белый
Чёрный

152

Глава 4. Построение графиков в Scilab

Рис. 4.12. Управление свойствами линии графика
при помощи функции plot

Таблица 4.2. Символы, определяющие тип маркера
Символ

Описание

.
o
х
+
*
s
d
v
^
<
>
p

Точка
Кружок
Крестик
Знак «плюс»
Звёздочка
Квадрат
Ромб
Треугольник вершиной вниз
Треугольник вершиной вверх
Треугольник вершиной влево
Треугольник вершиной вправо
Пятиконечная звезда

Чтобы график было проще анализировать, удобно выводить сетку – дополнительные оси для X и Y. В Scilab это можно сделать с помощью команды
xgrid(цвет, толщина линии, стиль)
где цвет определяет цвет линии сетки; толщина линии определяет толщину
линии сетки; стиль определяет стиль линии сетки.

4.5. Оформление графиков при помощи функции plot

153

Таблица 4.3. Символы, определяющие тип линии графика
Символ

Описание

:
-.
--

Сплошная (по умолчанию)
Щтрих, чередующийся с двумя точками
Штрих, чередующийся с одной точкой
Штриховая

Каждый параметр принимает либо число, либо вектор чисел из двух элементов (первый отвечает за внешний вид вертикальных линий сетки, второй – за внешний вид горизонтальных).
Некоторые из возможных цветов:
z z 1 – чёрный;
z z 2 – синий;
z z 3 – зелёный;
z z 4 – голубой;
z z 5 – красный;
z z 6 – розовый;
z z 7 – жёлтый;
z z 8 – белый.
Толщина задаётся числом от 1 до 10. Некоторые из возможных стилей:
z z 1 – сплошная линия;
z z 2 – штрих;
z z 3 – мелкий штрих;
z z 4 – точка иштрих;
z z 5 – две точки и штрих;
z z 6 – штрих и тире;
z z 7 – точки;
z z 8 – тире.
Если оставить скобки пустыми, по умолчанию будет прорисована сетка
чёрного цвета.
Построим в одних координатных осях синусоиду с линией красного цвета
и косинусоиду с линией синего цвета на заданном интервале, а затем выведем сетку (см. листинг 4.9 и рис. 4.13).
Листинг 4.9. Вывод сетки графика с помощью команды xgrid
x=-10:0.1:10;
y=sin(cos(x));
z=cos(sin(x));
plot(x,y,'m*',x,z,'gd'); //построение y - розовый график из "*",
// z - зелёный график из ромбов.
//Сетка по умолчанию
xgrid()

154

Глава 4. Построение графиков в Scilab

//Вариант 1
//сетка чёрная, толщины 1, штрих.
//Для обеих осей внешний вид одинаковый
--> xgrid (1, 1, 2)
\\
//Вариант 2
// вертикальные линии сетки красные, а горизонтальные - чёрные;
//толщина 2; сплошная линия
--> xgrid ([5;1],2 ,1)
//Вариант 3
//вертикальные линии сетки синие, толщина 4, сплошная линия
//горизонтальные линии сетки чёрные, толщина 2, штрих с двумя точками
--> xgrid ([9;1],[4;2],[1;5])

Рис. 4.13. Команда xgrid

Заголовок графика, построенного функцией plot, можно вывести командой xtitle:
xtitle(title, xstr, ystr)
где title – название графика; xstr – название оси X; ystr – название оси Y.
Воспользуемся предыдущим примером и добавим к графику заголовок
'График y=cos(x)' и подписи к координатным осям X и Y (см. листинг 4.10
и рис. 4.14).

4.5. Оформление графиков при помощи функции plot

155

Листинг 4.10. Вывод заголовка графика и подписей координатных осей
x=-10:0.1:10;
y=cos(x);
plot(x,y,'m*');
xgrid();
xtitle('График y=cos(x)','Ось X','Ось Y');

Рис. 4.14. Команда xtitle

В случаях когда в одной координатной плоскости изображаются графики
нескольких функций, как в нашем примере, возникает необходимость в «легенде». Её можно вывести с помощью команды legend:
legend(leg1, leg2, ..., legn, [pos], [boxed])
где leg1 – имя первого графика; leg2 – имя второго графика; legn – имя n-го
графика; pos – месторасположение легенды:
z z 1 – в верхнем правом углу (по умолчанию),
z z 2 – в верхнем левом углу,
z z 3 – в нижнем левом углу, 4 – в нижнем правом углу,
z z 5 – определяется пользователем после вывода графика;
boxed – логическая переменная, которая определяет, прорисовывать (значение по умолчанию – %t) или нет (значение %f) рамку вокруг легенды.

156

Глава 4. Построение графиков в Scilab

Выведем на графике одного из предыдущих примеров легенду и сами
определим её местоположение (после вывода графика под курсором мыши
будет расположена легенда. Чтобы прикрепить её к графику, нужно кликнуть
левой кнопкой мыши в нужном месте). Также отменим построение рамки
вокруг легенды (см. листинг 4.11 и рис. 4.15).
Листинг 4.11. Вывод легенды графика и определение её свойств
x=-10:0.1:10;
y=sin(cos(x));
z=cos(sin(x));
plot(x,y,'m*',x,z,'gd');
xgrid();
xtitle('График sin(cos(x)) и cos(sin(x))','X','Y');
legend('sin(cos(x))','cos(sin(x))',5,%f);

Рис. 4.15. Команда legend

4.6

Функция plot2d

Для построения графиков также можно использовать функцию plot2d. Обращение к функции имеет вид:
plot2d([logflag],x,y)
где logflag (необязательный параметр) – строка из двух символов, каждый
из которых определяет тип осей (n – нормальная ось, l – логарифмическая

157

4.6. Функция plot2d

ось), по умолчанию – «nn»; x – массив абсцисс; y – массив ординат или мат­ри­
ца, каждый столбец которых содержит массив ординат очередного графика –
в случае если необходимо построить графики нескольких функций.
При построении графиков принцип работы и синтаксис plot2d ничем не
отличаются от plot. Использовать можно любую из функций.
Задача 4.8
Построить график функции y = sin(x) на интервале [-2π; 2π] с шагом 0,1.
В данной задаче использование функции plot2d аналогично функции plot
(см. листинг 4.12 и рис. 4.16).
Листинг 4.12. Пример простейшего использования функции plot2d
x=[-2*%pi:%pi/10:2*%pi];
plot2d(x,sin(x));

Рис. 4.16. График функции y = sin(x)

Используя функцию plot2d, можно также построить несколько графиков
в одной системе координат.
Задача 4.9
Построить графики функций y = sin(x), y1 = sin(2x), y2 = sin(3x) на интервале
[0; 2π] с шагом 0,1 в одной системе координат.

158

Глава 4. Построение графиков в Scilab

В качестве массива Y в квадратных скобках поочередно укажем математические выражения заданных функций, разделяя их пробелами (см. лис­
тинг 4.13 и рис. 4.17).
Листинг 4.13. Несколько графиков в одних координатных осях. Команда plot2d
x=[0:%pi/20:2*%pi]';//транспонирование вектора x
plot2d(x,[sin(x) sin(2*x) sin(3*x)]);

Рис. 4.17. Графики функций y = sin(x), y = sin(2x), y = sin(3x)

4.7 Оформление графиков при помощи функции
plot2d
В общем виде обращение к функции имеет вид:
plot2d([logflag],x,y',[key1=value1,key2=value2,...,keyn=valuen]
где logflag (необязательный параметр) – строка из двух символов, каждый
из которых определяет тип осей (n – нормальная ось, l – логарифмическая
ось), по умолчанию – «nn»; x – массив абсцисс; y – массив ординат или мат­
ри­ца, каждый столбец которых содержит массив ординат очередного графика – в случае если необходимо построить графики нескольких функций
y1, y2, ..., yn, когда все они зависят от одной и той же переменной x. При
этом количество элементов в массиве x и y должно быть одинаковым. Если x
и y – мат­ри­цы одного размера, то каждый столбец мат­ри­цы y отображается

4.7. Оформление графиков при помощи функции plot2d

159

относительно соответствующего столбца мат­ри­цы x; keyi=valuei – последовательность значений свойств графика, определяющих его внешний вид:
key1=value1, key2=value2,..., keyn=valuen

Полная форма обращения к функции plot2d дает возможность самостоятельно определять внешний вид графика – за это в ней отвечает параметр
keyn=valuen.
Возможны следующие значения параметра keyn=valuen:
z z style – определяет массив числовых значений цветов графика. Количество элементов массива совпадает с количеством изображаемых
графиков. Можно воспользоваться функцией color, которая по названию (color("имя цвета")) или коду rgb (color(r,g,b)) цвета формирует
нужный id (код) цвета.
В качестве примера построим в одних координатных осях графики
функций y = sin(x) и y = cos(x), для синусоиды с помощью параметра
style определим имя цвета – красный («red»), а для косинусоиды – id
зелёного цвета (0,176,0) (см. листинг 4.14).
Полученные графики представлены на рис. 4.18.
Листинг 4.14. Изменение цвета линии графика
x=[-2*%pi:%pi/100:2*%pi];
y=[sin(x);cos(x)];
plot2d(x,y',style=[color("red"),color(0,176,0)]);

Рис. 4.18. Параметр style функции plot2d

160
zz

Глава 4. Построение графиков в Scilab

rect – значение параметра keyn=valuen функции plot2d – это вектор
[xmin, ymin, xmax, ymax], определяющий размер окна вокруг графика:
– xmin, xmax – минимальное и максимальное значения по оси X;
– ymin, ymax – минимальное и максимальное значения по оси Y.
Применим параметр rect к предыдущему примеру, установив для него
следующие значения [–8,–2,8,2] (см. листинг 4.15 и рис. 4.19).

Листинг 4.15. Определение размеров окна вокруг графика
x=[-2*%pi:%pi/100:2*%pi];
y=[sin(x);cos(x)];
subplot(1,2,1);
//Построение графика [-8;8] по Х и [-2;2] по Y
plot2d(x,y',style=[color("red"),color(0,176,0)],rect=[-8,-2,8,2]);
subplot(1,2,2);
//Построение графика [-2;2] по Х и [-2;2] по Y
plot2d(x,y',style=[color("red"),color(0,176,0)],rect=[-2,-2,2,2]);

Рис. 4.19. Параметр rect функции plot2d
zz

axesflag – значение параметра keyn=valuen функции plot2d – определяет наличие рамки вокруг графика. Необходимо выделить следующие
базисные значения этого параметра:
0 – нет рамки; нет осей;
1 – есть рамка; ось y слева (по умолчанию);

4.7. Оформление графиков при помощи функции plot2d

161

2 – есть рамка; нет осей;
3 – есть рамка; ось y справа;
4 – нет рамки; оси проходят через точку (0, 0);
5 – есть рамка; оси проходят через точку (0, 0).

Рис. 4.20. Параметр axesflag функции plot2d

Задача 4.10
Построить графики функций y = sin(x) и y1 = cos(x), используя 4 базисных
значения параметра axesflag, в одном графическом окне при помощи
функции subplot.
Листинг 4.16. Вывод рамки и определение размера координатных осей
x=[-2*%pi:%pi/50:2*%pi];
y=[sin(x); cos(x)];
subplot(2,3,1)
xtitle('axesflag=0')
plot2d(x,y',style=[color("red"), color("blue")], axesflag=0);
subplot(2,3,2)
xtitle('axesflag=1')
plot2d(x,y',style=[color("red"), color("blue")], axesflag=1);
subplot(2,3,3)
xtitle('axesflag=2')
plot2d(x,y',style=[color("red"), color("blue")], axesflag=2);
subplot(2,3,4)

162

Глава 4. Построение графиков в Scilab

xtitle('axesflag=3')
plot2d(x,y',style=[color("red"), color("blue")], axesflag=3);
subplot(2,3,5)
xtitle('axesflag=4')
plot2d(x,y',style=[color("red"), color("blue")], axesflag=4);
subplot(2,3,6)
xtitle('axesflag=5')
plot2d(x,y',style=[color("red"), color("blue")], axesflag=5);
zz

Для того чтобы определить число основных и промежуточных делений координатных осей, в Scilab существует параметр nax. Параметр
axesflag=1 (по умолчанию) – это массив из четырёх значений: [nx,
Nx, ny, Ny].
Здесь Nx (Ny) – число основных делений c подписями под осью X (Y);
nx (ny) – число промежуточных делений.

Задача 4.11
Построить графики функций sin(x) и cos(x). Модифицировать масштаб координатных осей графика.
Сформируем массив X, приняв, что x изменяется в диапазоне [-8:8] с шагом 0.1, затем совместно сформируем массивы значений заданных функций
с помощью следующей записи: y=[sin(x); cos(x)].
С помощью функции plot2d построим кривые функций y = sin(x) и y1 =
cos(x), установив значение параметра nax=[4,9,3,6]. Таким образом, ось X
будет разбита девятью основными делениями (засечками), каждое основное – четырьмя промежуточными, а ось Y – соответственно шестью и тремя
(см. листинг 4.17 и рис. 4.21).
Листинг 4.17. Нанесение на график основных и промежуточных делений
x=[-8:0.1:8];
y=[sin(x); cos(x)];
plot2d(x,y',style=[color("red"),color("blue")],axesflag=1,nax=[4,9,3,6]);
zz

leg – значение параметра keyn=valuen функции plot2d – строка, определяющая легенды для каждого графика:
leg1@leg2@leg3@\ldots@legn

где leg1 – легенда первого графика; legn – легенда n-го графика.
Построим графики функций sin(x) и cos(x) с пересечением осей X и Y в точке (0,0) – значение параметра axesflag=5, выведем легенду с подписями для
обеих кривых (см. листинг 4.18 и рис. 4.22).
Листинг 4.18. Вывод легенды графика
x=[-2*%pi:%pi/100:2*%pi];
y=[sin(x); cos(x)];
plot2d(x,y',axesflag=5, leg="sin(x)@cos(x)");

4.7. Оформление графиков при помощи функции plot2d

Рис. 4.21. Параметр nax функции plot2d

Рис. 4.22. Параметр leg функции plot2d

163

164

Глава 4. Построение графиков в Scilab

4.7.1 Построение точечных графиков
Функцию plot2d можно использовать для построения точечных графиков.
В этом случае обращение к функции имеет вид:
plot2d(x,y,d)
где d – отрицательное число, определяющее тип маркера (см. табл. 4.4).
Задача 4.12
Построить точечный график функции y = sin(x) с типом маркера «плюс,
вписанный в ромб».
Таблица 4.4. Числа, определяющие тип маркера
Число

Описание

–0
–1
–2
–3
–4
–5
–6
–7
–8
–9
–10
–11
–12
–13
–14

Точка
Плюс
Крестик
Плюс, вписанный в окружность
Закрашенный ромб
Незакрашенный ромб
Треугольник вершиной вверх
Треугольник вершиной вниз
Плюс, вписанный в ромб
Кружок
Звёздочка
Квадрат
Треугольник вершиной вправо
Треугольник вершиной влево
Пятиконечная звезда

При построении кривой с помощью функции plot2d укажем аргумент -8,
определяющий тип маркера «плюс, вписанный в ромб» (см. листинг 4.19
и рис. 4.23).
Листинг 4.19. Построение точечных графиков
x=[-2*%pi:%pi/50:2*%pi];
y=sin(x);
plot2d(x,y,-8);

4.7.2 Построение графиков в виде ступенчатой линии
Для изображения графика в виде ступенчатой линии в Scilab существует
функция plot2d2(x,y). Она полностью совпадает по синтаксису с функцией

4.7. Оформление графиков при помощи функции plot2d

165

plot2d. Главное отличие состоит в том, что X и Y могут быть независимыми
друг от друга функциями, важно лишь, чтобы массивы X и Y были разбиты
на одинаковое количество интервалов.
Задача 4.13
Имеются детальные наблюдения за ростом народонаселения на планете
за период с 1947 по 2006 год, млн чел. Построить график, отражающий динамику процесса на основании данных 1947, 1958, 1970, 1980, 1999 и 2006
годов.

Рис. 4.23. Точечный график функции y = sin(x)

Поэлементно введём массивы X и Y и воспользуемся функцией plot2d2(x,y)
(см. листинг 4.20 и рис. 4.24).
Листинг 4.20. Построение графиков в виде ступенчатой линии
x=[1947 1958 1970 1980 1999 2006];
y=[2.003 3.1 3.6 4.7 5.2 5.4];
plot2d2(x,y);

166

Глава 4. Построение графиков в Scilab

Рис. 4.24. Построение ступенчатого графика при помощи plot2d2

4.8 Построение графиков в полярной системе
координат
Полярная система координат состоит из заданной фиксированной точки
O – полюса, концентрических окружностей с центром в полюсе и лучей, выходящих из точки O, один из которых OX – полярная ось.
Расположение любой точки M в полярных координатах можно задать положительным числом ρ = OM (полярный радиус) и числом φ, равным величине
угла XOM (полярный угол).
В Scilab для формирования графика в полярной системе координат необходимо сформировать массивы значений полярного угла и полярного радиуса,
а затем обратиться к функции:
polarplot(fi,ro,[key1=value1,key2=value2,...,keyn=valuen])
где fi – полярный угол; ro – полярный радиус; keyn=valuen – последовательность значений свойств графика.
Задача 4.14
Построить полярные графики функций 3 cos 5φ и 3 cos 3φ.
Определив диапазон и шаг изменения полярного угла, формируем массивы fi, ro.

4.8. Построение графиков в полярной системе координат

167

Поочередно строим заданные кривые с помощью функции polarplot, при
этом для линии графика функции ro установим красный цвет, а для функции
ro1 – синий (cм. листинг 4.21, рис. 4.25).
Листинг 4.21. График функций в полярной системе координат
fi=0:%pi/100:2*%pi;
ro=3*cos(5*fi);ro1=3*cos(3*fi);
polarplot(fi,ro,style=color("red"));
polarplot(fi,ro1,style=color("blue"));

Рис. 4.25. Полярные графики функций ρ = 3 cos(5φ), ρ1 = 3 cos(3φ)

Задача 4.15
Построить графики архимедовой спирали, гиперболической спирали и логарифмической спирали в полярных координатах.
Уравнение архимедовой спирали в полярных координатах имеет вид:
ρ = αφ, гиперболической – ρ = . Соотношение ρ = αekφ, k = ctg α является
уравнением логарифмической спирали в полярных координатах. Частным
случаем логарифмической спирали (α = , k = 0) является уравнение окружности (ρ = α).
В листинге 4.22 приведён текст программы, позволяющей построить в одном графическом окне четыре оси координат, в каждом из которых построить свой график – архимедову, гиперболическую и логарифмическую спирали, а также окружность.

168

Глава 4. Построение графиков в Scilab

График представлен на рис. 4.26.
Листинг 4.22. Построение графиков спиралей (пример 4.15)
fi1=0:%pi/15:6*%pi;
fi2=%pi/3:%pi/15:6*%pi;
fi3=0:%pi/15:4*%pi;
fi4=-%pi:%pi/15:%pi;
ro1=4*fi1;
ro2=0.5./fi2;
ro3=4*exp(0.2*fi3);
for i = 1:length(fi4)
ro4(i)=4;
end
subplot(2,2,1);
polarplot(fi1,ro1,-3);
title('график архимедовой спирали');
subplot(2,2,2);
polarplot(fi2,ro2,-4);
title('график гиперболической спирали');
subplot(2,2,3);
polarplot(fi3,ro3,-10);
title('график логарифмической спирали ');
subplot(2,2,4);
polarplot(fi4,ro4,-14); title('график окружности');

Рис. 4.26. Графики архимедовой, гиперболической и логарифмической спиралей,
окружности в полярных координатах

4.9. Построение графиков функций, заданных в параметрической форме

169

4.9 Построение графиков функций, заданных
в параметрической форме
Задание функции y(x) с помощью равенств x = f(t) и y = g(t) называют параметрическим, а вспомогательную величину t – параметром.
Построение графика функции, заданной параметрически, можно осуществ­
лять следующим образом:
1) определить массив t;
2) определить массивы x = f(t) и y = g(t);
3) построить график функции y(x) с помощью plot(x,y) либо plot2d(x,y).
Задача 4.16
Построить график строфоиды.
Напомним, что строфоида представляет собой алгебраическую кривую
третьего порядка, которая в общем виде задаётся уравнением:
x2(a + x) = y2(a - x).

(4.1)

Представим это уравнение с помощью параметра t:

(4.2)

Зададим массивы t, x и y и построим график с помощью функции plot(x,y)
(см. листинг 4.23, рис. 4.27).
Листинг 4.23. Построение строфоиды с помощью функции plot
t=-5:0.01:5;
x=(t.^2-1)./(t.^2+1);
y=t.*(t.^2-1)./(t.^2+1);
plot(x,y);

Задача 4.17
Построить график полукубической параболы.
Полукубическая парабола – это алгебраическая кривая второго порядка,
которая в общем виде может быть описана следующим уравнением:
y m = A + Bx + Cx2 + … + Nx n.

(4.3)

170

Глава 4. Построение графиков в Scilab

Рис. 4.27. График строфоиды

Приведём это уравнение к параметрической форме:
(4.4)
Как и в примере со строфоидой, t-параметр определяем как массив, а x и y –
как зависимые от него величины. Однако теперь для построения графика
обратимся к функции plot2d(x,y) (см. листинг 4.24, рис. 4.28).
Листинг 4.24. Построение полукубической параболы
t=-3:0.01:3;
x=0.5*t.^2;
y=0.3*t.^3;
plot2d(x,y);

Задача 4.18
Построить график эпициклоиды. Уравнение эпициклоиды в параметрической форме имеет вид: x = 4 cos t - cos 4t, y = 4 sin t - sin 4t, t Î [0; 2π].
В листинге 4.25 представлен текст программы для изображения графика
эпициклоиды, а на рис. 4.29 – сам график.

4.9. Построение графиков функций, заданных в параметрической форме

Рис. 4.28. График полукубической параболы

Листинг 4.25. Построение графика эпициклоиды (пример 4.18)
t=0:%pi/50:2*%pi;x=4*cos(t)-cos(4*t);y=4*sin(t)-sin(4*t);
plot(x,y);
xgrid();

Рис. 4.29. График эпициклоиды

171

172

Глава 4. Построение графиков в Scilab

Задача 4.19
Построить график астроиды.
Уравнение астроиды в параметрической форме имеет вид x = 3 cos3t, y =
3 sin3t, t Î [0; 2π]. В листинге 4.26 представлен текст программы для изображения графика астроиды, а на рис. 4.30 – сам график.
Листинг 4.26. Построение графика астроиды (пример 4.19)
t=0:%pi/50:2*%pi;
x=3*cos(t).^3;
y=3*sin(t).^3;
plot(x,y);
xgrid();

Рис. 4.30. График астроиды

Функция bar предназначена для построения гистограммы.
Функция bar(y) выводит элементы массива y в виде гистограммы, в качестве массива x выступает массив номеров элементов массива y. Функция
bar(x, y) выводит гистограмму элементов массива y в виде столбцов в позициях, определяемых массивом x. Элементы должны быть упорядочены
в порядке возрастания.
Рассмотрим несколько примеров построения гистограмм.
y=[5; 6; 7; 8; 9; 8; 7; 6; 4; 3];
bar(y);

строит гистограмму, представленную на рис. 4.31.

4.9. Построение графиков функций, заданных в параметрической форме

Рис. 4.31. Пример использования функции bar(y)
x1=[-2,-1,0,1,2,3,4];
y1=exp(sin(x1));
bar(x1,y1);

строит гистограмму, представленную на рис. 4.32.

Рис. 4.32. Пример использования функции bar(x, y)

173

174

Глава 4. Построение графиков в Scilab

4.10

Примеры решения некоторых задач

Задача 4.20
Построить график функции y = sin(cos(x)) на интервале -2π до 2π.
Решение задачи представлено в листинге 4.27 и на рис. 4.33.
Листинг 4.27. Построение графика функции y = sin(cos(x))
x=-2*%pi : %pi/100 : 2*%pi;
y=sin(cos(x));
plot(x,y);

Рис. 4.33. График функции y = sin(cos(x))

Задача 4.21
Изобразить график функции y = x2/2 на интервале [0.6;2.5] и точечный
график функции, заданный таблично.
x
y

1
1

1.3
1.5

1.5
1.7

1.4
1.8

1.6
1.75

2
1.6

2.1
1.53

2.3
1.4

4.10. Примеры решения некоторых задач

175

Листинг 4.28. Построение графика нескольких функций
x1=0.6:0.05:2.5;
y1=x1.*x1/2;
x=[1 1.3 1.5 1.4 1.6 2 2.1 2.3]
y=[1 1.5 1.7 1.8 1.75 1.6 1.53 1.4]
plot(x,y,'ob',x1,y1,'r');

Рис. 4.34. График нескольких функций

Задача 4.22
Построить график разрывной функции
Область определения функции:
4x + 8 ≠ 0 ⇒ 4x ≠ -8 ⇒ x ≠ -2.
Попробуем построить график в Scilab, не обращая внимания на имеющуюся точку разрыва (листинг 4.29, рис. 4.35).
Листинг 4.29. Построение графика разрывной функции
x=-5:0.1:5;
y=(4*x.^2+5)./(4*x+8);
plot(x,y);

176

Глава 4. Построение графиков в Scilab

Далеко не каждый график можно построить, не обращая внимания на разрывы. Рассмотрим ещё два примера.
Задача 4.23
Построить график функции
Функция имеет разрыв в точках
Листинг 4.30. Построение графика функции y =

4x3 − 3x
4x4 − 1

x=-2:0.1:2;
y=(4*x.^3-3*x)./(4*x.^4-1);
plot(x,y);

Рис. 4.35. График разрывной функции

Полученный график представлен на рис. 4.36.
А теперь попробуем «обойти» точки разрыва (рис. 4.37).
clear x y
deff('y=F(x)','y=(4*x.^3-3*x)./(4*x.^4-1)')
h=0.05
x1=-2:0.02:-1/sqrt(2)-h;
x2=-1/sqrt(2)+h:0.02:1/sqrt(2)-h;
x3=1/sqrt(2)+h:0.02:2;
plot(x1,F(x1),'r',x2,F(x2),'r',x3,F(x3),'r');

4.10. Примеры решения некоторых задач

Рис. 4.36. Неверное построение графика функции
с точками разрыва

Рис. 4.37. Верное построение графика функции с точками разрыва

177

178

Глава 4. Построение графиков в Scilab

Задача 4.24
Построить график функции
Область определения: x2 - 1 > 0 ⇒ x2 > 1 ⇒ x Î (-¥; -1) È (1; +¥).
Листинг 4.31. Построение графика функции f(x) =

7x2 − 3
x2 − 1

clf
deff('y=F(x)','y=(7*x.^2-3)./(x.^2-1).^0.5')
x1=-3:0.01:-1.01;
x2=1.01:0.01:3;
plot(x1,F(x1),'b',x2,F(x2),'b');
xgrid();

Рис. 4.38. График функции f(x) =

7x2 − 3
x2 − 1

Задача 4.25
Изобразить линию, заданную неявно, уравнением: 4y2 + 5x2 - 20 = 0.
Разрешим заданное уравнение относительно переменной y. График f(x, y)
представлен линиями f1(x) =
20 - 5x2 ³ 0 ⇒ x2 £ 4 ⇒ x Î [-2; 2].

и f2(x) = -

. Область определения:

179

4.10. Примеры решения некоторых задач

Листинг 4.32. Решение задачи 4.25
clear;clf;
deff('y=F(x)','y=sqrt(20-5*x^2)/2')
x=-2:0.01:2;
plot(x,F(x),'r',x,-F(x),'r')
xgrid();

Рис. 4.39. График функции 4y2 + 5x2 − 20 = 0

Задача 4.26
Изобразить линию, заданную неявно:
Решим уравнение относительно переменной y: f1(x) =
-

и f2(x) =

. Область определения: x - 4 ³ 0 ⇒ x Î (-¥, -2] ∪ [2, +¥).
2

Листинг 4.33. Решение задачи 4.26

deff('y=f(x)' ,'y=(3/2)*(x^2-4)^0.5');
x1=-6:0.01:-2; x2=2:0.01:6;
plot(x1,f(x1),'k',x1,-f(x1),'k',x2,f(x2),'k',x2,-f(x2),'k')
xgrid();
xtitle('График функции','Ось X','Ось Y')

График функции представлен на рис. 4.40.

180

Глава 4. Построение графиков в Scilab

Рис. 4.40. График функции

x2
4



y2
9

=1

Задача 4.27
Изобразить графики функций sin(x), cos(x), sin(cos(x)), cos(sin(x)).
Листинг 4.34. Построение графиков функций sin(x), cos(x), sin(cos(x)), cos(sin(x))
x=-10:0.01:10;
y=sin(x);
z=cos(x);
u=cos(sin(x));
v=sin(cos(x));
subplot(2,2,1);
plot(x,y);
xgrid();
xtitle('График функции SIN(X)','Ось X','Ось Y');
subplot(2,2,2);
plot(x,z);
xgrid();
xtitle('График функции COS(X)','Ось X','Ось Y');
subplot(2,2,3);
plot(x,u);
xgrid();

4.10. Примеры решения некоторых задач

181

xtitle('График функции COS(SIN(X))','Ось X','Ось Y');
subplot(2,2,4);
plot(x,v);
xgrid();
xtitle('График функции SIN(COS(X))','Ось X','Ось Y');

Графики представлены на рис. 4.41.

Рис. 4.41. Графики функций sin(x), cos(x), sin(cos(x)), cos(sin(x))

Задача 4.28
Построить графики нескольких функций в одной системе координат. Вы­
вести сетку, заголовок графика и осей координат, легенду.
Листинг 4.35. Построение нескольких графиков
x=-2*%pi:%pi/100:2*%pi;
plot(x,sin(cos(x)),'r',x,cos(sin(x)),'b',x,exp(sin(x)),...
'm:',x,exp(cos(x)),'k');
xgrid();
xtitle('Графики нескольких функций с легендами','Ось X','Ось Y');
legend('sin(cos(x))','cos(sin(x))','exp(sin(x))','exp(cos(x))');

Графики представлены на рис. 4.42.

182

Глава 4. Построение графиков в Scilab

Рис. 4.42. Несколько графиков в одной системе координат

4.11

Режим форматирования графика

В Scilab внешний вид графика можно изменять, используя возможности графического окна, в котором он отображается. Переход к режиму форматирования осуществляется командой Правка ⇒ Свойства графического окна
в меню графического окна.
Возможности форматирования мы рассмотрим на примере построения
графиков функций y1 = sin(2x) и y2 = sin(3x) на интервале [0; 2π] с шагом 0,1.
Сформируем массив x и воспользуемся функцией plot2d (см. листинг 4.36,
рис. 4.43).
Листинг 4.36. Построение графиков функций y1 = sin(2x) и y2 = sin(3x)
x=[0:%pi/50:2*%pi]';
plot2d(x,[sin(2*x) sin(3*x)]);

Командой меню графического окна Правка ⇒ Свойства графического
окна вызываем окно форматирования полученного графика Figure Editor
(см. рис. 4.44).
Левая часть окна – Object Browser – это поле просмотра объектов, доступных для форматирования. Щелчок по объекту Figure(1) (Графическое окно)
делает его активным, а в правой области окна – Object Properties – появляются свойства активного объекта, которые могут быть изменены.

4.11. Режим форматирования графика

Рис. 4.43. Графики функций y1 = sin(2x) и y2 = sin(3x)

Рис. 4.44. Окно форматирования графика Figure Editor

183

184

Глава 4. Построение графиков в Scilab

Первоначально в поле Object Browser всегда отображаются два объекта:
Figure (Графическое окно) и его дочерний объект Axes (Оси). Значок «плюс»
возле объекта указывает на то, что он содержит объекты более низкого порядка.

Рис. 4.45. Иерархия объектов в поле Object Browser

Если щелкнуть по значку «плюс» у объекта Axes (Оси), появится объект
Compound(1) (Группа) также со значком «плюс». Объект Compound(1) содержит построенные в одних координатных осях графики функций y1 =
sin(2x) и y2 = sin(3x) – соответственно Polyline(2) и Polyline(1) (см. рис. 4.45).

4.11.1 Форматирование объекта Figure
Напомним, что объект Figure – этo графическое окно и собственно график,
отображаемый в нем. Для изменения свойств графического окна необходимо
выделить Figure(1) в поле Object Browser окна форматирования.
На рис. 4.45 изображена закладка Style окна форматирования Figure Editor
для объекта Figure(1). Здесь можно изменить значения следующих свойств:
z z Visibility (отображение графика) – переключатель, принимающий значения «on» и «off». По умолчанию установлено состояние «on» – график
выводится на экран;
z z Figure name (имя графика) – это последовательность символов, которые выводятся в строке заголовка графического окна. По умолчанию
графическому окну присваивается имя Графическое окно (%d), где
%d – это порядковый номер графика (Figure id). Для первого графического окна Figure id равен 0, для второго – 1, для третьего – 2 и т. д.

4.11. Режим форматирования графика

185

Однако вы можете ввести любое желаемое имя. Например, заменить
Scilab Graphic (%d) на График y=f(x) и нажать клавишу Enter. Заголовок окна будет изменён (см. рис. 4.46);

Рис. 4.46. Изменение заголовка графического окна
в окне форматирования

X position, Y position – эти поля определяют положение графического
окна на мониторе в пикселях по горизонтали и вертикали соответственно. Точка с координатами (0; 0) – верхний левый угол экрана;
z z X size, Y size – это соответственно ширина и высота графического окна
в пикселях;
z z X axis size, Y axis size – эти значения определяют размер осей X и Y;
z z Back. color (цвет фона) – каждому положению ползунка соответствует
свой номер цвета (RGB-id). Доступны 35 оттенков (от -2 – белый до
32 – жёлто-горячий).
Установим ползунок в положение 15. Цвет фона станет зелёным (см.
рис. 4.47).
Цветовая палитра может быть изменена пользователем на закладке Co­
lor­map (см. рис. 4.48).
Устанавливая значения для красного (RED), зелёного (GREEN) и синего
(BLUE) цветов, можно изменять каждый оттенок независимо, не вызывая
изменений других цветов в палитре. Например, вектор [0 0 0] задаёт чёрный
цвет, [0.230 0.230 0.250] – лазурный, [0.85 0.107 0.47] – малиновый.
В строке Colormap (Nx3 double array) можно задать RGB-id для всей палитры. Полный перечень всех доступных при форматировании оттенков
zz

186

Глава 4. Построение графиков в Scilab

с их RGB-id можно найти в статье встроенной справочной системы Scilab
«Color_list». Однако следует учесть, что в статье перед id цвета опущены «0.».

Рис. 4.47. Изменение фона графика в окне форматирования Figure Editor

Рис. 4.48. Изменение палитры цветов на закладке Colormap
окна форматирования Figure Editor

4.11. Режим форматирования графика

187

На закладке Mode в области Object Properties для объекта Figure (см.
рис. 4.49) можно установить следующие свойства:
z z Auto resize – свойство, которое позволяет изменять размер графика.
Когда этот режим включён (положение переключателя «on» – по умолчанию), мы можем изменять размер графического окна, перетаскивая
его границы с помощью мыши, и при этом автоматически будет изменяться размер графика, отображаемого в окне. В выключенном положении график будет сохранять свои размеры (см. рис. 4.50);

Рис. 4.49. Закладка Mode окна форматирования Figure Editor
zz

zz

Pixel drawing mode – свойство, которое определяет способ формирования изображения на экране. По умолчанию установлен режим
«copy». В этом случае точно выполняется требуемая операция построе­
ния графика. Однако часто необходимо нанести изображение на уже
существующее, при этом цвет вновь построенного графика должен
четко выделяться. Для этого существует набор режимов: «clear», «and»,
«andReverse», «andInverted», «noop», «xor», «or», «nor», «equiv», «invert»,
«orReverse», «copyInverted», «orInverted», «nand», «set».
Результат использования значения «invert» режима Pixel drawing mode
представлен на рис. 4.51.
Rotation style – это свойство применимо лишь к трёхмерным графикам. Режим по умолчанию «unary» предназначен для вращения выделенных графиков, при включённом режиме «multiple» вращаются все
трёхмерные графики.

188

Глава 4. Построение графиков в Scilab

Рис. 4.50. Использование режима Auto resize

Рис. 4.51. Режим «invert» свойства Pixel drawing mode на вкладке Mode

4.11. Режим форматирования графика

189

Для изменения свойств объекта Axes (Оси графика) необходимо выделить
его в поле Object Browser окна форматирования. В области Object Properties
доступные для модификации свойства будут сгруппированы на нескольких
закладках. Закладки X, Y и Z идентичны, с той лишь разницей, что позволяют устанавливать желаемый внешний вид соответственно для осей X, Y и Z.
Поэтому мы рассмотрим лишь закладку X (см. рис. 4.52).

Рис. 4.52. Закладка X окна форматирования свойств объекта Axes

На закладке X все свойства разделены на две области: Label Options
(Cвойства подписей осей) и Axis Options (Свойства осей). В области Label
Options можно установить:
z z Text – собственно подпись оси – любая последовательность символов;
z z Visibility – видимость – переключатель, принимающий значения «on»
и «off». По умолчанию оси графика выводятся на экран (положение
«on»);
z z Fill mode – режим заливки – переключатель, принимающий значения
«on» и «off» (по умолчанию). Для того чтобы определить цвет фона вокруг подписи оси, необходимо установить состояние «on»;
z z Auto position – автоматическое определение положения подписи оси
графика. По умолчанию установлено значение «on» – подпись выводится внизу, по центру оси. Однако положение подписи можно определить и самостоятельно, для этого в поле Position задаются координаты
в виде вектора [x, y]. При этом переключатель Auto position автоматически примет значение «off»;

190

Глава 4. Построение графиков в Scilab

zz

Auto Rotation – режим автоматического вращения подписи оси. По
умолчанию этот режим отключён (состояние переключателя «off»);

zz

Font angle – угол поворота подписи оси. Можно установить одно из
предлагаемых значений: 0°, 90°, 180° и 270°, а также любой произвольный угол поворота надписи в последнем поле (см. рис. 4.52);

zz

Fore/Back colors – цвет символов и цвет фона подписи оси соответственно, устанавливаются при помощи ползунка, каждому положению
которого отвечает определённый цвет. Всего доступно 35 цветов;

zz

Font size/color – размер символов подписи оси (возможны значения от
0 до 6) и их цвет (всего доступно 35 цветов). По умолчанию для шрифта
установлен размер 1;

zz

Font style – стиль начертания символов подписи оси. По умолчанию
установлен стиль Serif;

В области Axis Options можно изменить:
zz

Location – расположение оси графика. Для оси X возможны следующие
значения этого свойства: bottom – снизу, top – сверху, middle – посередине; а для оси Y: left – слева, right – справа, middle – посередине;

zz

Grid color – цвет линий сетки графика, устанавливаемый с помощью
ползунка. В положении -1 линии сетки графика отсутствуют, в положении 0 выводятся чёрные линии, кроме того, доступны ещё 32 цвета.
Для того чтобы отображались линии сетки для осей X и Y, необходимо
установить свойство Grid color и на закладке X, и на закладке Y;

zz

Data bounds – ограничение данных. Для каждой оси можно уменьшить
диапазон исходных данных, по которым формируется график, сделав
его более детальным;

zz

Scale – масштаб оси графика. Существует
два автоматических режима: lin (линейный) и log (логарифмический). Нажатие
на кнопку Ticks (Засечки) приводит к появлению окна модификации деления оси
Edit Axes Ticks. Это окно представлено на
рис. 4.53.
С его помощью можно установить следующие свойства засечек координатных осей:
– Visibility – отображение – переключатель, принимающий значения «on»
и «off». По умолчанию засечки на оси
графика выводятся на экран (положение «on»);
– Auto ticks – режим автоматического деления оси, по умолчанию также включён (значение переключателя «on»).
Однако существует возможность само-

Рис. 4.53. Окно Edit Axes Ticks

4.11. Режим форматирования графика

191

стоятельно определить шаг, с которым будет разбита ось, его нужно
ввести в поле Steb by и нажать Enter. При этом переключатель Auto
ticks автоматически примет значение «off»;
– Sub ticks – промежуточные засечки. В этом поле нужно ввести число
засечек, которые будут выводиться между основными делениями оси.
Следует отметить, что промежуточные засечки не подписываются.
В окне Edit Axes Ticks формируется таблица основных засечек (без засечек
Sub ticks). Первый столбец Locations задаёт положение засечки, а второй
Labels – подпись засечки.
Для удобства редактирования таблицы окно снабжено кнопками Insert,
Delete, Apply, Quit. Кнопка Insert позволяет вставить в окно готовую таб­
лицу засечек (либо её фрагмент) посредством буфера обмена. Вставка производится начиная с позиции активной ячейки. Кнопка Delete позволяет
удалять не только активную ячейку, но и всю строку, которой она принадлежит. Кнопка Apply подтверждает изменения, а Quit служит для выхода из
окна Edit Axes Ticks.
Последняя опция на закладке X – это переключатель Reverse. Если установить его в положение «on», график зеркально отобразится относительно
оси Y. Если же включить этот режим на закладке Y, график будет зеркально
отражен относительно оси X.
Закладка Title окна форматирования осей Axes Editor предназначена для
изменения свойств названия графика. Она содержит лишь одну область –
Label Options, идентичную области Label Options закладок X, Y и Z (см.
рис. 4.54).

Рис. 4.54. Закладка Title окна форматирования Axes Editor

192

Глава 4. Построение графиков в Scilab

Проиллюстрируем возможности изменения свойств координатных осей
графика с помощью закладок X, Y, Title окна форматирования осей Axes
Editor.
Построим в одних координатных осях графики функций y1 = sin(2x) и y2 =
sin(3x) на интервале [0; 2π] с шагом 0,1.
Выведем подписи для оси X «Ось абсцисс» и для оси Y «Ось ординат»,
установим для подписей стиль шрифта Serif Bold и размер 3. Для обеих осей
ползунок Grid Color установим в положение 1.
Определим для оси X размещение middle, а на закладке Y включим режим Reverse. Выведем заголовок графика «График y=f(x)», определив стиль
шрифта Serif Bold, размер символов 4. Включив режим заливки, установим её
цвет – голубой (положение ползунка 12) и цвет границы – синий (положение
ползунка 11).
В итоге сформируется графическое окно, представленное на рис. 4.55.

Рис. 4.55. Форматирование осей графика
средствами закладок X, Y, Title

Закладка Style окна форматирования осей графика Axes Editor (см.
рис. 4.56) предоставляет возможность изменять следующие свойства линии
оси и подписей засечек:
z z Visibility – отображение – переключатель, принимающий значения
«on» (по умолчанию) и «off». В положении «off» график вообще не выводится в окно;
z z Font style – стиль начертания символов подписей засечек на оси. По
умолчанию установлен стиль Serif;

4.11. Режим форматирования графика
zz

zz
zz

zz

zz

zz

193

Font color – ползунок, каждое положение которого определяет цвет
символов подписей засечек. По умолчанию установлен в положении
-1 – чёрный цвет;
Font size – размер символов подписей засечек на оси, возможны значения от 0 до 6. По умолчанию для шрифта установлен размер 1;
Fore. color – ползунок, каждое положение которого определяет цвет
собственно координатной оси. По умолчанию установлен в положении
-1 – чёрный цвет;
Back. color – ползунок, каждое положение которого определяет цвет
заливки фона графика. По умолчанию установлен в положении -2 –
белый цвет;
Thickness – толщина линии координатной оси, определяемая ползунком с положениями от 1 до 30. По умолчанию для толщины линии
установлено значение 1;
Line style – стиль начертания линии. Возможно 6 режимов: solid –
сплошная линия, остальные режимы – вариации пунктиров.

Рис. 4.56. Закладка Style окна форматирования осей Axes Editor

В качестве примера отформатируем графики функций предыдущего примера средствами закладки Style. Установим стиль шрифта подписи засечек
на осях Serif Bold, размер шрифта – 2, установим голубой цвет фона графика
(положение ползунка Back. color 12) и толщину линий координатных осей 2.

194

Глава 4. Построение графиков в Scilab

На экран будет выведено графическое окно, представленное на рис. 4.57.

Рис. 4.57. Форматирование осей графика средствами закладки Style

Закладка Aspect окна форматирования Axes Editor (см. рис. 4.58) позволяет изменять следующие свойства:
z z Auto clear – если переключатель установлен в положение «on», графическое окно будет автоматически очищаться каждый раз перед построением нового графика. Если же этот режим отключён (по умолчанию),
графики будут накладываться в одних координатных осях в соответствии с режимом Auto scale;
z z Auto scale – режим обновления границ координатных осей графика.
В состоянии переключателя «on» (по умолчанию) новый график изменит границы предыдущего графика, чтобы сформироваться на всём
заданном интервале, но в том же масштабе, что и предыдущий график.
При отключённом режиме Auto scale новый график будет построен
в пределах осей предыдущего графика и, возможно, будет отражать
лишь часть заданного интервала.
Воспользуемся предыдущими примерами и проиллюстрируем действие режима Auto scale. Построим графики функций y = sin(x) и y1 =
cos(x) на интервале [-2π; 2π], а затем график функции y2 = sin(3x) на
интервале [0; 2π]. Обратите внимание, что интервал третьего графика
гораздо уже. Поскольку по умолчанию режим Auto scale включён, оси
будут изменены так, что оба графика сформируются полностью на заданных интервалах (см. листинг 4.37, рис. 4.59).

4.11. Режим форматирования графика

Рис. 4.58. Закладка Aspect окна форматирования осей Axes Editor

Рис. 4.59. Построение графиков с включённым режимом Auto scale

195

196

Глава 4. Построение графиков в Scilab

Листинг 4.37. Пример использования режима автоматического масштабирования
координатных осей Auto scale
x=[-2*%pi:%pi/100:2*%pi];
y=[sin(x); cos(x)];
plot2d(x,y');
x=[0:0.1:2*%pi];
plot2d(sin(3*x));

Теперь построим первые два графика, отключим режим Auto scale, а затем построим третий график. Он будет сформирован лишь частично (см.
листинг 4.38, рис. 4.60).
Листинг 4.38. Построение графиков нескольких функций в одном графическом
окне при выключенном режиме Auto scale
x=[-2*%pi:%pi/100:2*%pi];
y=[sin(x); cos(x)];
plot2d(x,y');
//отключаем режим Auto scale
x=[0:%pi/100:2*%pi];
plot2d(sin(3*x));

Рис. 4.60. Построение графиков
с отключённым режимом Auto scale

4.11. Режим форматирования графика

197

Переключатель Boxed на закладке Aspect окна форматирования Axes
Editor определяет, ограничивать график прямоугольной рамкой (положение «on» по умолчанию) или выводить только координатные оси
(положение «off»).
z z Isoview – это свойство используется для того, чтобы установить одинаковый масштаб для всех осей графика. По умолчанию установлено
состояние переключателя «off».
z z Tight limits – если этот режим включён, оси графика изменяются таким образом, чтобы точно соответствовать значению свойства Data
bounds закладок X, Y и Z. При значении «off» (по умолчанию) оси могут
увеличить исходный интервал, чтобы было проще выбрать масштаб
оси и нанести на неё засечки.
z z Cube scaling – эта опция применима лишь к трёхмерным графикам.
При состоянии переключателя «on» исходные данные ограничиваются
так, чтобы поверхность поместилась в куб размером 1. Это позволяет
нагляднее изобразить 3D-график в тех случаях, когда масштаб координатных осей слишком разнится от одной оси к другой. По умолчанию
установлено состояние переключателя «off».
z z Сlip state – режим кадрирования (обрезки) графика. Возможно одно из
следующих состояний переключателя: «off» означает, что создаваемое
изображение не кадрируется; «clipgrf» (по умолчанию) – от создаваемого изображения обрезается область, находящаяся вне границ осей;
«on» – от создаваемого изображения обрезается область, находящаяся
вне границ, заданных свойством Сlip box.
z z Сlip box – прямоугольная область, которая будет отображаться после
обрезки изображения. Вначале в полях X и Y задаются координаты
верхней левой точки прямоугольника (upper-left point coordinates), затем ширина и высота – поля W и H.
z z Margins – это свойство устанавливает расстояние от границы графического окна до области графика: Left (левый край), Right (правый), Top
(верхний), Bottom (нижний). Значение должно находиться в интервале
[0 : 1]. По умолчанию каждому полю присвоено значение 0.125.
z z Axes bounds – это свойство задаёт часть графика, которая будет выводиться в координатных осях. Left и Up определяют положение верхний
левый угол, Width и Height – ширину и высоту фрагмента графика.
Значение должно находиться в интервале [0 : 1]. По умолчанию отображаемый фрагмент задаётся мат­ри­цей [0 0 1 1].
Закладка View Point окна форматирования осей графика Axes Editor (см.
рис. 4.61) позволяет установить лишь одно свойство – угол, под которым
наблюдатель видит график. По умолчанию установлены значения углов поворота наблюдателя (Rotation angles) 0 и 270.
zz

198

Глава 4. Построение графиков в Scilab

Рис. 4.61. Закладка View Point окна форматирования Axes Editor

4.11.2 Форматирование объекта Polyline
Для перехода к форматированию линии графика необходимо выбрать объект
Polyline в поле просмотра объектов Object Browser окна Polyline Editor. Доступные для изменения свойства в области Object Properties сгруппированы
на трёх закладках: Style, Data, Clipping.
Закладка Style окна форматирования Polyline Editor (см. рис. 4.62) позволяет установить значения следующих свойств:
z z Visibility – отображение – переключатель, принимающий значения
«on» (по умолчанию) и «off». В положении «off» линия графика не отображается в окне;
z z Fill mode – режим заливки – переключатель, принимающий значения
«on» и «off» (по умолчанию). Для того чтобы определить цвет фона
области, которую ограничивает кривая, переключатель необходимо
установить в состояние «on»;
z z Closed – если включить это свойство, линия графика станет замкнутой;
z z Polyline style – стиль отображения графика. Возможны следующие
значения: interpolated – сплошная плавная линия; staircase – ступенчатая линия; barplot – полосчатые области; arrowed – линия, состоящая из
последовательности стрелок, размер стрелки можно установить в поле
Arrow size; filled – закрашенные области; bar – полосчатые области,
ограниченные сплошной плавной линией (см. рис. 4.63);
z z Line – стили начертания линии графика. Доступны 6 стилей: solid –
сплошная, остальные – вариации пунктирной линии. Здесь же из спис­
ка можно выбрать желаемую толщину кривой: от 1 до 30;

4.11. Режим форматирования графика

Рис. 4.62. Закладка Style окна форматирования Polyline Editor

Рис. 4.63. График функции y = sin(3x).
Стиль отображения линии графика – bar

199

200

Глава 4. Построение графиков в Scilab

Foreground и Background – свойства, устанавливающие соответственно цвет линии графика и заливку области, которая ограничивается
кривой, при этом переключатель Fill mode должен быть установлен
в положение «on»;
z z Interp color vector – вектор, определяющий заливку каждого сегмента
графика;
z z Mark mode – режим, позволяющий строить точечные графики (положение переключателя «on»). По умолчанию это свойство отключено;
z z Mark style – стиль маркера – возможны следующие значения: dot –
точка; plus – знак «плюс»; cross – крестик; star – плюс, вписанный
в окружность; filled diamond – закрашенный ромб; diamond – ромб;
triangle up – треугольник вершиной вверх; triangle down –треугольник
вершиной вниз; diamond plus – плюс, вписанный в ромб; circle – кружок;
asterisk – звёздочка; square – квадрат; triangle right – треугольник вершиной вправо; triangle left – треугольник вершиной влево; pentagram –
пятиконечная звезда;
z z Mark size – размер маркера – устанавливаемые значения могут изменяться от 0 до 30pt;
z z Mark foreground – ползунок, каждое положение которого определяет
цвет заливки маркера.
На рис. 4.64 представлен точечный график функции y = sin(3x) с типом
маркера filled diamond, размером маркера 1, значением цвета заливки маркера Mark foreground 5.
zz

Рис. 4.64. Форматирование точечного графика функции y = sin(3x)

4.11. Режим форматирования графика

201

Закладка Data окна форматирования Polyline Editor позволяет уточнить
область данных, по которым строится график. В поле Data field первоначально указывается текущий диапазон, в нашем случае это 2 массива типа Double,
в каждом из них 63 значения – [63x2 double array] (см. рис. 4.65). Однако в этом
списке можно выбрать строку Edit data и отредактировать таблицу исходных
данных. Закладка Clipping (Обрезка) окна форматирования Polyline Editor
позволяет установить границы прямоугольной области – Clip box (Кадр),
которая останется видимой после обрезки изображения (см. рис. 4.66).

Рис. 4.65. Закладка Data окна форматирования Polyline Editor

Напомним, что в полях X и Y следует указать x-, y-координаты верхнего левого угла кадра, а в полях W, H – его ширину и высоту. Режим Clip state также
может принимать одно из значений: «off» означает, что создаваемая графика
не кадрируется; «clipgrf» (по умолчанию) – от создаваемой графики обрезается область, находящаяся вне границ осей; «on» – от создаваемой графики
обрезается область, находящаяся вне границ, заданных свойством Сlip box.
Дадим определение прямоугольной (или декартовой) системы координат
в пространстве.
Прямоугольная система координат в пространстве состоит из заданной
фиксированной точки О пространства, называемой началом координат,
и трёх перпендикулярных прямых пространства OX, OY и OZ, не лежащих
в одной плоскости и пересекающихся в начале координат, – их называют
координатными осями (OX – ось абсцисс, OY – ось ординат, OZ – ось аппликат). Положение точки M в пространственной системе координат определяется значением трёх координат и обозначается M(x, y, z). Три плоскости,

202

Глава 4. Построение графиков в Scilab

содержащие пары координатных осей, называются координатными плоскостями XY, XZ и YZ.

Рис. 4.66. Закладка Clipping окна форматирования Polyline Editor

Величина z называется функцией двух величин x и y, если каждой паре
чисел, которые могут быть значениями переменных x и y, соответствует одно
или несколько определённых значений величины z. При этом переменные
x и y называют аргументами функции z(x, y). Пары тех чисел, которые могут
быть значениями аргументов x, y функции z(x, y), в совокупности составляют
область определения этой функции.
Для построения графика двух переменных z = f(x, y) необходимо выполнить следующие действия:
1) сформировать в области построения графика прямоугольную сетку,
проводя прямые, параллельные осям y = yj и x = xi, где xi = x0 + ih,
i = 0, 1, 2, …, n; yj = y0 + jδ,
j = 0, 1, 2, …, k;
2) вычислить значения zi, j = f(xi, yj) во всех узлах сетки;
3) обратиться к функции построения поверхности, передавая ей в качест­
ве параметров сетку и мат­ри­цу Z = {zi, j} значений в узлах сетки.

4.12

Функции plot3d и plot3d1

В Scilab поверхность можно построить с помощью функций plot3d или
plot3d1. Их отличие состоит в том, что plot3d строит поверхность и заливает её одним цветом, а plot3d1 строит поверхность, каждая ячейка которой

4.12. Функции plot3d и plot3d1

203

имеет цвет, зависящий от значения функции в каждом соответствующем
узле сетки (см. рис. 4.67).

Рис. 4.67. Отличие plot3d от plot3d1

Обращение к функциям следующее:
plot3d(x,y,z,[theta,alpha,leg,flag,ebox][keyn=valuen]),
plot3d1(x,y,z,[theta,alpha,leg,flag,ebox][keyn=valuen]),
Здесь:
zz

x – вектор-столбец значений абсцисс;

zz

y – вектор-столбец значений ординат;

zz

z – мат­ри­ца значений функции;

zz

theta, alpha – действительные числа, которые определяют в градусах
сферические координаты угла зрения на график. Попросту говоря, это
угол, под которым наблюдатель видит отображаемую поверхность;

zz

leg – подписи координатных осей графика – символы, отделяемые
знаком @ (например, 'X@Y@Z');

zz

flag – массив, состоящий из трёх целочисленных параметров:
[mode,type,box].
Здесь:
– mode – устанавливает цвет поверхности (см. табл. 4.5). По умолчанию
равен 2 – цвет заливки синий, прямоугольная сетка выводится;

204

Глава 4. Построение графиков в Scilab

Таблица 4.5. Значения параметра mode
Значение
>0
0
[x y]=meshgrid(-2:2,-3:3)
y =
-3. -3. -3. -3. -3.
-2. -2. -2. -2. -2.
-1. -1. -1. -1. -1.
0.
0.
0.
0.
0.
1.
1.
1.
1.
1.
2.
2.
2.
2.
2.
3.
3.
3.
3.
3.
x =
-2.
-2.
-2.
-2.
-2.
-2.
-2.

-1.
-1.
-1.
-1.
-1.
-1.
-1.

0.
0.
0.
0.
0.
0.
0.

1.
1.
1.
1.
1.
1.
1.

2.
2.
2.
2.
2.
2.
2.

После формирования сетки вычислим значение функции во всех узловых
точках:
--> z=3*x.*x-2*sin(y).^2
z =
11.96017
2.96017
-0.03983
10.34636
1.34636
-1.65364
10.58385
1.58385
-1.41615
12.00000
3.00000
0.00000
10.58385
1.58385
-1.41615
10.34636
1.34636
-1.65364
11.96017
2.96017
-0.03983

2.96017
1.34636
1.58385
3.00000
1.58385
1.34636
2.96017

11.96017
10.34636
10.58385
12.00000
10.58385
10.34636
11.96017

Для построения каркасного графика следует обратиться к функции mesh:
mesh(x, y, z);

После это будет создано графическое окно с трёхмерным графиком (см.
рис. 4.72).
Как видно, построенный график получился грубым. Для создания более
точного и плавного графика следует сделать сетку более плотной, т. е. самостоятельно указать шаг (см. листинг 4.43 и рис. 4.73).
Листинг 4.43. Построение графика поверхности с заданным шагом
[x y]=meshgrid(-2:0.1:2,-3:0.1:3);
z=3*x.*x-2*sin(y).^2
mesh(x,y,z);

4.13. Функции meshgrid, surf и mesh

Рис. 4.72. График функции z(x, y) = 3x 2 − 2sin2y

Рис. 4.73. График функции z(x, y) = 3x 2 − 2sin2y
c более плотной сеткой

211

212

Глава 4. Построение графиков в Scilab

Любой трёхмерный график можно вращать. Для этого следует зажать правую клавишу мыши и потянуть в нужном направлении. Кроме того, можно
изменить масштаб графика, используя колесо мыши.
Задача 4.34
С использованием функции surf построить график функции z(x, y) =

В листинге 4.44 представлено решение задачи, а на рис. 4.74 изображён
получившийся график.
Листинг 4.44. Построение графика поверхности
[x y]=meshgrid(-2:0.2:2,0:0.2:4);
z=sqrt(sin(x).^2+cos(y).^2);
surf(x,y,z);

Рис. 4.74. График функции z(x, y) = sin2x + cos2y

В Scilab можно построить графики двух поверхностей в одной системе координат. По умолчанию, как и для двумерных графиков, команда mtlb_hold
имеет значение 'on' и блокирует создание нового графического окна при
выполнении команд surf или mesh. Для перерисовки графиков в окне следует
использовать mtlb_hold('off').

4.13. Функции meshgrid, surf и mesh

213

Задача 4.35
Построить график функции

Сформируем плотную прямоугольную сетку с помощью команды meshgrid.
Вычислим значения функций во всех узлах сетки.
Поверхность z = +(3x2 + 4y 2) - 1 построим с помощью команды surf, каждая её ячейка будет залита цветом, зависящим от значения функции в узле
сетки. А с помощью команды mesh построим поверхность z1 = -(3x2 + 4y2) - 1
в одних координатных осях с z = +(3x2 + 4y2) - 1, при этом будет выведена прямоугольная сетка, а ячейки залиты белым цветом (см. листинг 4.45,
рис. 4.75).
Листинг 4.45. Построение графиков нескольких функций в одном графическом окне
[x y]=meshgrid(-2:0.2:2,-2:0.2:2);
z=3*x.^2+4*y.^2-1;
z1=-3*x.^2-4*y.^2-1;
surf(x,y,z);
mesh(x,y,z1);

Рис. 4.75. График функции z(x, y) = ±(3x2 + 4y 2) − 1

214

Глава 4. Построение графиков в Scilab

4.13.1 Построение графиков поверхностей, заданных
параметрически
При построении графиков поверхностей, заданных параметрически – x(u, v),
y(u, v) и z(u, v), – необходимо сформировать мат­ри­цы X, Y и Z одинакового
размера. Следует выделить два основных вида представления x, y и z в случае
параметрического задания поверхностей:
1) если x, y и z можно представить в виде f(u) · g(v), то соответствующие им
мат­ри­цы X, Y и Z следует формировать в виде матричного умножения
f(u) на g(v);
2) если x, y и z можно представить в виде f(u) или g(v), то в этом случае
мат­ри­цы X, Y и Z следует записывать в виде f(u) · ones(v) или g(v) · ones(u)
соответственно.

4.14

Функции plot3d2 и plot3d3

Функции plot3d2 и plot3d3 являются аналогами функции plot3d, поэтому
имеют такой же синтаксис:
plot3d2(x,y,z,[theta,alpha,leg,flag,ebox][keyn=valuen]),
plot3d3(x,y,z,[theta,alpha,leg,flag,ebox][keyn=valuen])

Эти функции предназначены для построения поверхности, которая задаётся набором граней. То есть если функция plot3d по входным данным
сможет построить лишь отдельно стоящие друг от друга плоские грани, то
plot3d2 (plot3d3) проинтерпретирует взаимное расположение этих граней
в виде цельного геометрического тела.
Отличие функций plot3d2 и plot3d3 сходно с различием действия функций plot3d и plot3d1, а также surf и mesh. Plot3d2 строит поверхность, при
этом выводит сетку и заливает все ячейки одним из цветов, по умолчанию –
синим. Plot3d также выводит сетку, однако оставляет все ячейки без заливки
(т. е. белыми).
Задача 4.36
Построить сферу

при помощи функции plot3d2.
Листинг 4.46. Построение сферы с помощью функции plot3d2
u = linspace(-%pi/2,%pi/2,40);
v = linspace(0,2*%pi,20);

4.14. Функции plot3d2 и plot3d3

215

X = cos(u)'*cos(v);
Y = cos(u)'*sin(v);
Z = sin(u)'*ones(v);
plot3d2(X,Y,Z);

Отметим также, что здесь linspace – функция, возвращающая массив
с линейным приращением значений в заданном диапазоне. Например,
u=linspace(-%pi/2,%pi/2,40) значит, что параметр u линейно изменяется
в диапазоне [-2π; 2π]. Число 40 устанавливает, что массив должен содержать
ровно 40 значений, по умолчанию их 100 (см. листинг 4.46). Построенная
функцией plot3d2 сфера представлена на рис. 4.76.

Рис. 4.76. График сферы, построенный функцией plot3d2

Теперь посмотрим, как эту же задачу выполнят функции plot3d и plot3d3.
Расчёты мат­ри­ц и векторов аналогичны, отличается лишь функция построе­
ния графика.
Листинг 4.47. Построение сферы с помощью функции plot3d
u = linspace(-%pi/2,%pi/2,40);
v = linspace(0,2*%pi,20);
X = cos(u)'*cos(v);
Y = cos(u)'*sin(v);
Z = sin(u)'*ones(v);
plot3d(X,Y,Z);

216

Глава 4. Построение графиков в Scilab

Рис. 4.77. График сферы, построенный функцией plot3d

Рис. 4.78. График сферы, построенный функцией plot3d3

4.15. Функции param3d и param3d1

217

Листинг 4.48. Построение сферы с помощью функции plot3d3
u = linspace(-%pi/2,%pi/2,40);
v = linspace(0,2*%pi,20);
X = cos(u)'*cos(v);
Y = cos(u)'*sin(v);
Z = sin(u)'*ones(v);
plot3d3(X,Y,Z);

4.15

Функции param3d и param3d1

Для построения параметрической кривой в Scilab существует команда
param3d:
param3d(x,y,z,[theta,alpha,leg,flag,ebox]).

Проиллюстрируем возможности функции param3d следующими примерами.
Задача 4.37
Построить график линии, заданной параметрически:

Прежде всего определим диапазон и шаг изменения параметра t.
Затем обратимся к функции param3d, передав ей математические выражения функций y, y1 и y2, а также углы в градусах, под которыми наблюдатель
будет видеть формируемый график, – 45 и 35 (см. листинг 4.49, рис. 4.79).
Листинг 4.49. Построение линии, заданной параметрически, с помощью функции
param3d
t=[0:%pi/10:10*%pi];
param3d(sin(t),cos(t),t/7,45,35);

Задача 4.38
Построить линию, заданную параметрически:

218

Глава 4. Построение графиков в Scilab

Рис. 4.79. График параметрической линии,
построенный функцией param3d

Определив массив значений параметра t, вычислим значения X, Y и Z
координат кривой.
Для построения графика используем команду param3d, установив углы
обозрения наблюдателя 45° и 60° (см. листинг 4.50, рис. 4.80).
Листинг 4.50. Построение линии, заданной параметрически, с помощью функции
param3d
t=-50*%pi:%pi/10:50*%pi;
x=t.*sin(t);
y=t.*cos(t);
z=t.*abs(t)/(50*%pi);
param3d(x,y,z,45,60);

Для вывода нескольких параметрически заданных кривых в одних координатах в Scilab используется функция param3d1. Она имеет несколько
отличный синтаксис:
param3d1(x,y,list(z,colors),[theta,alpha,leg,flag,ebox])

Здесь впервые появляется необходимость использования конструкции
list(z,colors), которая позволяет не только задавать Z-координату для
каждой из кривых, но и устанавливать для них желаемый цвет. Рассмотрим
это на примере.

4.15. Функции param3d и param3d1

219

Рис. 4.80. График параметрической линии,
построенный функцией param3d

Задача 4.39
Построить графики линий, заданных параметрически:

Зададим массив значений параметра t.
Для построения графиков линий в одной системе координат обратимся
к функции param3d1. В качестве параметров в первых квадратных скобках
передадим ей X- и Y-координаты первой кривой, а во вторых – второй. При
помощи свойства list определим Z-координаты и для первой кривой установим темно-синий цвет линии (9), а для второй – красный (5). Числа 35
и 45 – углы обозрения наблюдателя. Параметр 'X@Y@Z' отвечает за вывод
подписей осей графика (см. листинг 4.51, рис. 4.81).
Листинг 4.51. Построение нескольких параметрически заданных линий с помощью
команды list функции param3d
t=[0:%pi/50:5*%pi]';
param3d1([sin(t),sin(2*t)],[cos(t),cos(2*t)],...
list([t/10,sin(t)],[9,5]),35,45,"X@Y@Z");

220

Глава 4. Построение графиков в Scilab

Рис. 4.81. Графики параметрических кривых,
построенные функцией param3d1

Задача 4.40
Построить поверхность однополостного гиперболоида, уравнение которого задано в параметрическом виде: x(u, v) = ch(u)cos(v), y(u, v) = ch(u)
sin(v), z(u, v) = sh(u), u Î [0, π], v Î [0, 2π].
В листинге 4.52 представлено решение этой задачи. График однополостного гиперболоида представлен на рис. 4.82.
Листинг 4.52. Построение поверхности гиперболоида (пример 4.40)
clear; h=%pi/50;
u=[0:h:%pi]'; // Формируем вектор-столбец u.
// Формируем вектор-строку v. Обратите внимание, u - столбец,
// v - строка с одинаковым количеством элементов.
v=[0:2*h:6.28];
// Формируем матрицу X как матричное произведение ch(u)*cos(v).
X=cosh(u)*cos(v);
// Формируем матрицу Y как матричное произведение ch(u)*sin(v).
Y=cosh(u)*sin(v);
// Формируем матрицу Z как матричное произведение столбца sh(u)
// на строку ones(v).
Z=sinh(u)*ones(v);
surf(X,Y,Z);
xgrid();
title('Однополостный гиперболоид');xlabel('X');ylabel('Y');zlabel('Z')

4.15. Функции param3d и param3d1

221

Рис. 4.82. График однополостного гиперболоида

Построение сферы в Scilab:
Задача 4.41
Построить поверхность сферы с центром (x0, y0, z0) и радиусом R.
В декартовой системе координат уравнение сферы имеет вид: (x - x0)2 +
(y - y0)2 + (z - z0)2 = R2. Его можно записать в параметрическом виде:

где u Î [0, 2π), v Î [0, π].
Методика построения сферы подобна методике построения однополостного гиперболоида, описанной в примере 4.40. В листинге 4.53 представлен
текст программы построения сферы с центром в точке (1, 1, 1) и радиусом
R = 4, а на рис. 4.83 изображена сфера.
Листинг 4.53. Построение сферы (пример 4.41)
clear;
h=%pi/30;
u=[-0:h:%pi]'; // Формируем вектор-столбец u.
v=[0:2*h:2*%pi]; // Формируем вектор-строку v.
// Формируем матрицу X, используя матричное произведение sin(u)*cos(v).
x=1+4*sin(u)*cos(v);
// Формируем матрицу Y, используя произведение sin(u)*sin(v).

222

Глава 4. Построение графиков в Scilab

y=1+4*sin(u)*sin(v);
// Формируем матрицу Z, используя произведение столбца
// cos(u) на строку ones(v).
z=1+4*cos(u)*ones(v);
// Формируем график поверхности.
surf(x,y,z,45,60);
xgrid();
// Подписываем график и оси.
title('Сфера');xlabel('X');ylabel('Y');zlabel('Z');

Рис. 4.83. График сферы,
построенный с использованием функции surf

Сфера является частным случаем более общей фигуры – эллипсоида. Рассмотрим способ построения эллипсоида.
Задача 4.42
Построить поверхность эллипсоида, уравнение которой задано в парамет­
рическом виде:

Здесь a, b, c – полуоси эллипсоида, (x0, y0, z0) – центр эллипсоида.

4.15. Функции param3d и param3d1

223

Методика построения эллипсоида подобна тому, как ранее были построе­
ны однополостный гиперболоид (пример 4.40) и сфера (пример 4.41). Для
этого необходимо сформировать мат­ри­цы X, Y и Z, после чего вызвать функцию surf. Решение показано в листинге 4.54.
Листинг 4.54. Построение поверхности эллипсоида (пример 4.42)
clear;
h=%pi/30;
u=[-0:h:%pi]'; // Формируем вектор-столбец u.
v=[0:2*h:2*%pi]; // Формируем вектор-строку v.
// Формируем матрицу X, используя матричное произведение sin(u)*cos(v).
a=3;b=7;c=1;
x0=10;y0=10;z0=10;
x=x0+a*sin(u)*cos(v);
// Формируем матрицу Y, используя произведение sin(u)*sin(v).
y=y0+b*sin(u)*sin(v);
// Формируем матрицу Z, используя произведение столбца
// cos(u) на строку ones(v).
z=z0+c*cos(u)*ones(v);
surf(x,y,z);
xgrid(); // Формируем эллипсоид.
// Подписываем график и оси.
title('Элипсоид');xlabel('X');ylabel('Y');zlabel('Z');

Эллипсоид с центром в точке (10, 10, 10) и полуосями a = 3, b = 7, c = 1
представлен на рис. 4.84.

Рис. 4.84. Эллипсоид с центром в точке (10, 10, 10)
и полуосями a = 3, b = 7, c = 1

224

Глава 4. Построение графиков в Scilab

4.16

Функция contour

В Scilab, кроме построения объемных графиков, также реализована возможность создания пространственных моделей объектов. На практике часто возникает необходимость построения карт в изолиниях значений показателя,
где X-, Y-координаты задают положение конкретной изучаемой точки на
плоскости, а Z-координата – зафиксированную величину показателя в этой
точке. Точки с одинаковыми значениями показателя соединяют так называе­
мые изолинии – линии одинаковых уровней значений исследуемой величины.
Для построения изолиний в Scilab существует функция contour. Обращение к ней имеет вид:
contour(x,y,z,nz[theta,alpha,leg,flag,ebox,zlev])
Здесь:
z z x, y – массивы действительных чисел;
z z z – мат­ри­ца действительных чисел – значения функции, описывающей
поверхность Z(x, y);
z z nz – параметр, который устанавливает количество изолиний. Если nz –
целое число, то в диапазоне между минимальным и максимальным
значениями функции Z(x, y) через равные интервалы будет проведено
nz изолиний. Если же задать nz как массив, то изолинии будут проводиться через все указанные в массиве значения;
z z theta, alpha – действительные числа, которые определяют в градусах сферические координаты угла обозрения наблюдателя. Попросту
говоря, это угол, под которым наблюдатель видит отображаемую поверхность;
z z leg – подписи координатных осей графика – символы, отделяемые
знаком @. Например, 'X@Y@Z';
z z flag – массив, состоящий из трёх целочисленных параметров:
[mode,type,box].
Здесь:
– mode – устанавливает способ и место нанесения линий уровня (см.
табл. 4.8);
Таблица 4.8. Значения параметра mode
Значение Описание
0
1
2

Изолинии наносятся на поверхность Z(x, y)
Изолинии наносятся на поверхность и план, который задаётся уравнением
Z = zlev
Изолинии наносятся на двумерный график

– type – позволяет управлять масштабом графика (см. табл. 4.6), по
умолчанию имеет значение 2;

4.16. Функция contour

225

– box – определяет наличие рамки вокруг отображаемого графика (см.
табл. 4.7). По умолчанию равен 4;
z z ebox – определяет границы области, в которую будет выводиться поверхность, как вектор [xmin,xmax,ymin,ymax,zmin,zmax]. Этот параметр может использоваться только при значении параметра type=1;
z z zlev – математическое выражение, которое задаёт план (горизонтальную проекцию заданной поверхности) для построения изолиний. По
умолчанию совпадает с уравнением, описывающим плоскость, – в этом
случае может не указываться.
Следует отметить, что функции contour уравнение поверхности Z(x, y)
удобнее передавать в качестве параметра как функцию, определённую пользователем.
Напомним, что функции в Scilab создаются при помощи команды deff:
deff('[s1,s2,...]=newfunction(e1,e2,...)
где s1,s2,... – список выходных параметров, т. е. переменных, которым будет присвоен конечный результат вычислений; newfunction – имя создавае­
мой функции, оно будет использоваться для её вызова; e1,e2,... – входные
параметры.
Второй способ создания функции – это примение конструкции вида:
function =

end

где lhs_arguments – список выходных параметров; function_name – имя создаваемой функции; rhs_arguments – входные параметры.
Задача 4.43
Построить линии уровня поверхности Z = x · sin(x)2 · cos(y).
Введём параметр t и определим массив его значений. При помощи команды function создадим функцию my_surface с входными данными x, y
и выходными – z. В теле функции вычислим значения математического выражения, задающего поверхность.
Для построения изолиний обратимся к функции contour (см. листинг 4.55,
рис. 4.85).
Листинг 4.55. Построение изолиний поверхности Z = x · sin(x)2 · cos(y) с помощью
функции contour
t=linspace(-%pi,%pi,30);
function z=my_surface(x,y)
z=x*sin(x)^2*cos(y)
end
contour(t,t,my_surface,10);

226

Глава 4. Построение графиков в Scilab

Рис. 4.85. Изолинии поверхности Z = x · sin(x)2 · cos(y)

Этот пример показывает, что выполнение функции contour приводит
к формированию линий со значениями показателя и проецированию их
на горизонтальную плоскость. Очевидно, что такое представление данных
малоинформативно. Гораздо нагляднее изображение поверхности и изолиний в одном графическом окне.
Задача 4.44
Построить поверхность Z = sin(x) · cos(y) и вывести изолинии в одном графическом окне.
Прежде всего введём параметр t и сформируем массив его значений. Создадим функцию Surf. С помощью команды rect установим границы области
построения графика в графическом окне, чтобы совместить поверхность
с изолиниями.
Напомним, что при построении графика функции вида Z(x, y) с помощью
plot3d необходимо использовать команду feval для формирования мат­ри­цы
значений функции zij = f(xi, yj ).
Далее с помощью plot3d строим график поверхности Z = sin(x) · cos(y),
устанавливая углы обзора наблюдателя и подписи для координатных осей.
Определяем массив flag [2,1,4]: 2 – цвет графика – синий, 1 – границы области построения графика определяются вручную (далее указан параметр rect,
заданный выше), 4 – выводятся все оси и рамка вокруг графика.

227

4.16. Функция contour

Затем формируем изолинии, обратившись к функции contour, также устанавливаем углы обзора наблюдателя, подписи координатных осей, число
формируемых изолиний 10 и значения массива flag [1,1,4]: 1 – режим вывода
изолиний на отдельно построенный план, который задаётся тем же уравнением, что и поверхность (Z = sin(x) · cos(y)), 1 – границы области построения графика определяются вручную (далее указан параметр rect, заданный
выше), 4 – выводятся все оси и рамка вокруг графика. Число -5 устанавливает положение горизонтальной плоскости с изолиниями – 5 единиц ниже
графика поверхности.
С помощью команды xtitle выведем подпись для графика (см. лис­
тинг 4.56, рис. 4.86).
Листинг 4.56. Построение поверхности Z = sin(x) · cos(y) (функция plot3d) и вывод
её изолиний (функция contour) в одном графическом окне командой rect
t=%pi*(-10:10)/10;
function [z]=Surf(x,y)
z=sin(x)*cos(y);
end;
rect=[-%pi,%pi,-%pi,%pi,-5,1];
z=feval(t,t,Surf);
plot3d(t,t,z,35,45,'X@Y@Z',[2,1,4],rect);
contour(t,t,z,10,35,45,'X@Y@Z',[1,1,4],rect, -5);
xtitle('plot3d и contour');

Рис. 4.86. График поверхности Z = sin(x) · cos(y)
и её изолинии в одном окне

228

Глава 4. Построение графиков в Scilab

Однако и такое изображение поверхности и её изолиний не всегда бывает
удобным. Попробуем совместить график поверхности и линии уровня.
Задача 4.45
Совместить график поверхности Z = sin(x) · cos(y) с её изолиниями.
Как и в предыдущем примере, зададим массив значений параметра t, создадим функцию Surf, ограничим область для вывода графика внутри графического окна с помощью команды rect, а также вычислим значения функции
Z = sin(x) · cos(y), выполнив команду feval.
При построении поверхности оставим все параметры без изменений, кроме углов обзора наблюдателя (установим 75 и 45), а также цвета заливки
графика (установим значение параметра mode в массиве flag равным -19 –
коричневый цвет).
При обращении к функции contour для совмещения поверхности и её изолиний удалим значение параметра location -5 и установим для режима
mode в массиве flag значение 0 – изолинии наносятся непосредственно на
поверхность Z = sin(x) · cos(y).
С помощью команды xtitle также выводим подпись для графика (см. лис­
тинг 4.57, рис. 4.87).

Рис. 4.87. Совмещение поверхности и её изолиний

4.17. Функция contourf

229

Листинг 4.57. Пример совмещения графика поверхности с её изолиниями
t=%pi*(-10:10)/10;
function [z]=Surf(x,y)
z=sin(x)*cos(y)
end;
rect=[-%pi,%pi,-%pi,%pi,-1,1];
z=feval(t,t,Surf);
plot3d(t,t,z,35,45,'X@Y@Z',[-19,1,4],rect);
contour(t,t,z+0.1,10,35,45,'X@Y@Z',[0,1,4],rect); ...
xtitle('plot3d и contour');

4.17 Функция contourf
В Scilab существует функция contourf, которая не просто изображает поверхность на горизонтальной плоскости в виде изолиний, но и заливает интервалы между ними цветом в зависимости от конкретного уровня значений
показателя.
Обращение к функции имеет вид:
contourf (x,y,z,nz,[style,strf,leg,rect,nax])
Здесь:
z z x, y – массивы действительных чисел;
z z z – мат­ри­ца действительных чисел – значения функции, описывающей
поверхность Z(x, y);
z z nz – параметр, который устанавливает количество изолиний. Если nz –
целое число, то в диапазоне между минимальным и максимальным
значениями функции Z(x, y) через равные интервалы будет проведено
nz изолиний. Если же задать nz как массив, то изолинии будут проводиться через все указанные в этом массиве значения;
z z style – массив того же размера, что и nz, – устанавливает цвет для
каждого интервала уровней значений;
z z strf – строка, состоящая из трёх чисел – «сsa». Здесь с (Captions)
устанавливает режим отображения подписей графика (см. табл. 4.9);
s (Scaling) – режим масштабирования (см. табл. 4.10); a (Axes) определяет положение осей графика (см. табл. 4.11);
Таблица 4.9. Значение параметра с (Captions) строки strf
Значение

Описание

0
1

Нет подписей
Отображаются подписи, заданные параметром leg

230

Глава 4. Построение графиков в Scilab

Таблица 4.10. Значение параметра s (Scaling) строки strf
Значение Описание
0
1
2

Масштабирование по умолчанию
Устанавливается параметром rect
Масштаб зависит от минимального и максимального значений входных
данных
Выводятся изометрические оси, исходя из значений параметра rect
Выводятся изометрические оси, исходя из входных данных
Расширение осей для наилучшего вида в зависимости от значений
параметра rect
Расширение осей для наилучшего вида в зависимости от входных данных

3
4
5
6

Таблица 4.11. Значение параметра a (Axes) строки strf
Значение Описание
0
1
2
3
4
5

Нет осей
Выводятся оси, ось Y слева
Выводится рамка вокруг графика без делений
Выводятся оси, ось Y справа
Оси центрируются в графической области окна
Оси выводятся таким образом, чтобы они пересекались в точке (0; 0)
zz
zz
zz

leg – легенда графика, подпись каждой из кривых – символы, отделяе­
мые знаком @. По умолчанию – « »;
rect – вектор [xmin, ymin, xmax, ymax], который определяет границы
изменения x и y координат графической области окна;
nax – это массив из четырёх значений [nx, Nx, ny, Ny], определяющий
число основных и промежуточных делений координатных осей графика. Здесь Nx (Ny) – число основных делений c подписями под осью X (Y);
nx (ny) – число промежуточных делений.

Задача 4.46
Построить изображение поверхности Z = sin(x) · cos(y) с помощью функции
contourf.
Введём параметр t и создадим массив его значений, определим функцию
surf. Для наглядности приведём график поверхности Z = sin(x) · cos(y), построенный функцией plot3d1, и её изображение на горизонтальной плоскости, сформированное функцией contourf, в одном графическом окне. С этой
целью обратимся к команде subplot, которой разобьем графическое окно на
две области для вывода графиков.
Используя feval, вычислим значения функции Z = sin(x) · cos(y) и построим её график при помощи plot3d1, указав углы обозрения наблюдателя – 80
и 15, а также, вызвав команду xtitle, выведем подпись графика – «plot3d1».

231

4.17. Функция contourf

Теперь сформируем проекцию поверхности на горизонтальную плоскость
посредством функции contourf. В качестве параметров передаём ей X-, Yи Z-координаты, число изолиний (10), 10 : 20 – массив, определяющий цвет
каждого интервала между изолиниями, а также значения строки strf="121"
(1 – режим отображения подписей; 2 – выбор масштаба зависит от минимального и максимального значений входных данных; 1 – режим отображения
координатных осей, ось Y находится слева).
Выведем и для этого графика подписи осей и графика в целом – «contourf» –
при помощи команды xtitle (см. листинг 4.58, рис. 4.88).
Листинг 4.58. Построение поверхности Z = sin(x) · cos(y) (функция plot3d) и её
изображения на горизонтальной поверхности (функция contourf) в одном
графическом окне
t=-%pi:0.2:%pi;
function [z]=Surf(x,y)
z=sin(x)*cos(y)
end;
subplot(121);
z=feval(t,t,Surf);
plot3d1(t,t,z,80,15);
xtitle('plot3d1');
subplot(122);
contourf(t,t,z,10,10:20,strf="121");
colorbar(-%pi,%pi);
xtitle('contourf','X','Y');

Рис. 4.88. График функции Z = sin(x) · cos(y),
построенный функцией plot3d1 и contourf

232

4.18

Глава 4. Построение графиков в Scilab

Функция hist3d

Для построения трёхмерных гистограмм в Scilab используется функция
hist3d:
hist3d(f,[theta,alpha,leg,flag,ebox])
Здесь f – мат­ри­ца (m : n), задающая гистограмму f(i, j) = F(x(i ), y( j)).
Параметры theta,alpha,leg,flag,ebox управляют теми же свойствами,
что и у функции plot3d.
Задача 4.47
Построить трёхмерную гистограмму.
Для формирования мат­ри­цы входных данных воспользуемся командой
rand. Напомним, чтобы создать мат­ри­цу случайных значений размером
(m,n), необходимо использовать конструкцию rand(m,n) (см. листинг 4.59).
Листинг 4.59. Построение трёхмерной гистограммы при помощи функции hist3d
hist3d(9.7*rand(10,10),20,35);

Полученная гистограмма изображена на рис. 4.89.

Рис. 4.89. Трёхмерная гистограмма, построенная функцией hist3d

4.19. Примеры построения некоторых трёхмерных графиков в Scilab

233

4.19 Примеры построения некоторых трёхмерных
графиков в Scilab
В этом параграфе мы рассмотрим приёмы построения некоторых нестандартных трёхмерных графиков средствами Scilab.
Прежде всего научимся вырезать из графиков «ненужные» части.
Задача 4.48
Построить поверхность Z = sin(t) · cos(t), вырезать из графика области, где
|Z| > 0.5.
Сформируем массив значений параметра t, вычислим значения функции
Z = sin(t) · cos(t) и запишем их в массив Z.
В массив Z1 при помощи команды find запишем индексы тех элементов
массива Z, чье модальное значение больше 0,5.
find имеет синтаксис:
x1 = find(x)
где x – логическое выражение, с помощью которого задаётся условие поиска
элементов в массиве; x1 – результирующий массив индексов тех элементов,
которые удовлетворяют заданному условию.
Далее мы будем использовать %inf – машинный символ бесконечности.
Команда z(z1)=%inf*z1 сделает равными бесконечности те элементы массива z, чьи индексы содержатся в z1.
После формирования прямоугольной сетки plot3d1 зальёт ячейки элементов со значением «бесконечность» белым цветом. Таким образом нам удастся
создать эффект вырезания целых областей поверхности Z = sin(t) · cos(t) (см.
листинг 4.60, рис. 4.90).
Листинг 4.60. Пример вырезания из поверхности заданной области
t=linspace(-%pi,%pi,40);
z=sin(t)'*cos(t);
z1=find(abs(z)>0.5);
z(z1)=%inf*z1;
plot3d1(t,t,z);

Теперь поставим перед собой другую задачу: построить геометрическое
тело, полое внутри.
Задача 4.49
Построить полую сферу.

234

Глава 4. Построение графиков в Scilab

Рис. 4.90. Пример вырезания областей из трёхмерного графика

Cоздадим функцию sph, которая задаёт сферу тремя параметрическими
уравнениями X, Y, Z:
function [x,y,z]=sph(alp,tet)
x=r*cos(alp).*cos(tet)+orig(1)*ones(tet);
y=r*cos(alp).*sin(tet)+orig(2)*ones(tet);
z=r*sin(alp)+orig(3)*ones(tet);
end;

Далее задаём значения параметра r, вектора-строки orig, массивов x и y.
Уже известным нам способом, при помощи функции %inf, объявляем бесконечными величинами элементы массива x с индексами (5 : 8) и (30 : 35).
Таким образом мы добьёмся того, что в графическое окно будет выведена
сфера, имеющая две «шляпки», сверху и снизу (см. рис. 4.91). Под ними элементы, объявленные бесконечными, образуют два «окошка», через которые
мы сможем увидеть полость внутри сферы.
Саму же сферу построим при помощи команды eval3dp и функции plot3d1,
для лучшего обзора всех деталей графика укажем углы поворота наблюдателя
35 и 15.
Листинг 4.61. Построение сферы с полостью внутри и «срезанными» полюсами
function [x,y,z]=sph(alp,tet)
x=r*cos(alp).*cos(tet)+orig(1)*ones(tet);
y=r*cos(alp).*sin(tet)+orig(2)*ones(tet);
z=r*sin(alp)+orig(3)*ones(tet);
end;

4.19. Примеры построения некоторых трёхмерных графиков в Scilab

235

r=1;orig=[0 0 0];
x=linspace(-%pi/2,%pi/2,40);
y=linspace(0,%pi*2,20);
x(5:8)=%inf*ones(5:8);
x(30:35)=%inf*ones(30:35);
[x1,y1,z1]=eval3dp(sph,x,y);
plot3d1(x1,y1,z1,35,15);

Рис. 4.91. График полой сферы

Ранее мы уже познакомились с возможностями функции plot3d2. Теперь
рассмотрим ещё несколько примеров её применения.
Задача 4.50
Построить ракушкообразный график.
Такой график можно задать следующей системой уравнений:

236

Глава 4. Построение графиков в Scilab

Зададим массивы значений параметров u, v. Вычислим значения функций
x, y, z (см. листинг 4.62). Обратившись к функции plot3d2, получим график,
представленный на рис. 4.92.
Листинг 4.62. Построение ракушкообразного графика
u = linspace(0,2*%pi,40);
v = linspace(0,2*%pi,20);
x= (cos(u).*u)'*(1+cos(v)/2);
y= (u/2)'*sin(v);
z= (sin(u).*u)'*(1+cos(v)/2);
plot3d2(x,y,z);

Рис. 4.92. Ракушкообразный график,
построенный функцией plot3d2

Задача 4.51
Построить ленту Мёбиуса при помощи функции plot3d2.
Лента Мёбиуса – простейшая односторонняя поверхность с краем. Попасть из одной точки этой поверхности в любую другую можно, не пересекая
края.
В общем параметрическом виде лента Мёбиуса может быть представлена
системой уравнений:

4.19. Примеры построения некоторых трёхмерных графиков в Scilab

237

Здесь u принадлежит интервалу [0; 2π], а v – [-1; 1]. Эти формулы задают
ленту Мёбиуса шириной 1, чей центральный круг имеет радиус 1, лежит
в плоскости xy с центром в (0, 0, 0). Параметр u пробегает вдоль ленты, в то
время как v задаёт расстояние от края.
В листинге 4.63 предложен один из способов построения ленты Мёбиуса,
а её график представлен на рис. 4.93.
Листинг 4.63. Построение ленты Мёбиуса при помощи функции plot3d2
t=linspace(-1,1,20)';
x=linspace(0,%pi,40);
factor=2+t*cos(x);
X=factor*diag(cos(2*x));
Y=factor*diag(sin(2*x));
Z=t*sin(x);
plot3d2(X,Y,Z);

Рис. 4.93. Лента Мёбиуса

238

Глава 4. Построение графиков в Scilab

Задача 4.52
Построить тор с узкой и широкой сторонами при помощи функции plot3d2.
Тор – поверхность вращения в форме бублика, получаемая вращением
окружности вокруг оси, лежащей в плоскости окружности и не пересекающей
её. Уравнение тора может быть задано параметрически в виде:

Здесь u, v принадлежат интервалу [0; 2π], R – расстояние от центра окружности до оси вращения, r – радиус окружности.
В листинге 4.64 приведен способ построения тора с узкой и широкой сторонами подобно ленте Мёбиуса, график тора изображен на рис. 4.94.
Листинг 4.64. Построение тора с узкой и широкой сторонами при помощи функции
plot3d2
x=linspace(0,2*%pi,40);
y=linspace(0,2*%pi,20)';
fact=1.5+cos(y)*(cos(x)/2+0.6);
X=fact*diag(cos(x));
Y=fact*diag(sin(x));
Z=sin(y)*(cos(x)/2+0.6);
plot3d2(X,Y,Z,);

Рис. 4.94. Тор с узкой и широкой сторонами

239

4.20. Анимация

Задача 4.53
Построить деформированный тор при помощи функции plot3d2.
Листинг 4.65 демонстрирует один из возможных способов построения вогнутого тора при помощи функции plot3d2, график тора представлен на рис. 4.95.
Листинг 4.65. Построение деформирования тора при помощи функции plot3d2
x=linspace(0,2*%pi,40);
y=linspace(0,2*%pi,20)';
factor=1.5+cos(y);
X=factor*cos(x);
Y=factor*sin(x);
Z=sin(y)*ones(x)+ ones(y)*cos(2*x);
plot3d2(X,Y,Z);

Рис. 4.95. Деформированный тор

4.20 Анимация
При изучении движения точки на плоскости Scilab позволит построить график движения и проследить за движением. Построить анимационный ролик
можно с помощью функции comet(x, y), которая позволит увидеть движение
точки вдоль кривой y(x) на плоскости.
Для движения точки на плоскости вдоль синусоиды достаточно ввести
команды:
x=0:%pi/30:6*%pi;
y=sin(x);
comet(x,y);

240

Глава 4. Построение графиков в Scilab

Процесс движения точки вдоль синусоиды представлен на рис. 4.96, окончательный вид траектории движения точки вдоль синусоиды показан на рис. 4.97.

Рис. 4.96. Движение точки вдоль синусоиды

Рис. 4.97. Окончательный вид траектории движения точки

Глава 5

Создание графических
приложений в среде Scilab
Scilab позволяет создавать не только обычные программы для автоматизации расчётов, но и визуальные приложения, которые будут запускаться
в среде Scilab. Основным объектом в среде Scilab является графическое окно.

5.1

Работа с графическим окном

Для создания пустого графического окна служит функция figure:
F=figure();

В результате выполнения этой команды будет создано графическое окно
с именем Графическое окно n, где n – это номер окна. По умолчанию первое
окно получает имя Графическое окно 0, второе – Графическое окно 1 и т. д.
Объект созданного графического окна со всеми его свойствами записывается
в переменную F.
Пример: выведем на экран содержимое переменной F после создания графического окна.
Листинг 5.1. Свойства объекта
-->F=figure();
-->F
//Результат работы программы
F

=

Handle of type "Figure" with properties:
========================================
children: "Axes"
figure_position = [200,200]
figure_size = [616,577]
axes_size = [610,460]

242

Глава 5. Создание графических приложений в среде Scilab

auto_resize = «on»
viewport = [0,0]
figure_name = "Графическое окно %d"
figure_id = 0
info_message = ""
color_map = matrix 33x3
pixel_drawing_mode = "copy"
anti_aliasing = «off»
immediate_drawing = «on»
background = 33
visible = «on»
rotation_style = "unary"
event_handler = ""
event_handler_enable = «off»
user_data = []
resizefcn = ""
closerequestfcn = ""
resize = «on»
toolbar = "figure"
toolbar_visible = «on»
menubar = "figure"
menubar_visible = «on»
infobar_visible = «on»
dockable = «on»
layout = "none"
layout_options = "OptNoLayout"
default_axes = «on»
icon = ""
tag = ""

Описание свойств объекта F представлено ниже.
z z children: вектор дочерних элементов фигуры. Все дочерние элементы
относятся к типу Axes (Оси). При создании объекта figure одновременно создается и объект Axes;
z z figure_position: положение графического окна на экране в пикселях.
Это вектор [x,y], определяющий положение верхнего левого угла окна.
Позиция [0,0] находится в верхнем левом углу экрана;
z z figure_size: вектор [ширина, высота], задающий размер графического
окна в пикселях. Операционная система определяет некоторые минимальные размеры графического окна. Если указать значения меньше,
то фактически будут установлены минимальные;
z z axes_size: вектор [ширина, высота] размеров всей графической области в окне в пикселях;
z z auto_resize: автоматическое изменение размера дочерних осей при
изменении размера окна. Принимает значения «on» и «off». Если при
изменении размеров графического окна значение auto_resize = on, то
axes_size обновляется и содержимое осей масштабируется так, чтобы
полностью вмещаться в окно нового размера. Если при изменении
размеров графического окна значение auto_resize = off, то axes_size

5.1. Работа с графическим окном

zz
zz

zz
zz
zz

zz

zz

zz

zz
zz

zz

zz

zz

243

остаётся неизменным. Масштаб отображения дочерних осей не изменяется. Если размер окна становится меньше размеров осей, отображаются полосы прокрутки;
viewport: положение видимой части графика;
figure_name: название окна. Это имя представляет собой символьную
строку, отображаемую в верхней части окна. Имя по умолчанию содержит выражение %d, которое заменяется на figure_id;
figure_id: идентификатор рисунка. Это целое число, которое задаётся
при создании объекта;
info_message: текст, отображаемый в информационной строке графического окна;
color_map: свойство, определяющее цветовую схему, используемую
в этом окне. Цветовая карта представляет собой мат­ри­цу размером m
на 3; m – это количество цветов. Номер цвета i задаётся в виде 3-кратных значений R, G, B, задающих соответственно интенсивности красного, зелёного и синего цветов в диапазоне от 0 до 1;
pixel_drawing_mode: это поле определяет побитовую операцию, используемую для рендеринга пикселей. Режим по умолчанию – копирование;
anti_aliasing: это свойство управляет уровнем сглаживания, используемым для улучшения качества графики. Если для свойства задано
значение «off», сглаживание отключено. Чтобы включить сглаживание,
для свойства должно быть установлено значение 2×, 4×, 8× или 16×.
В данном случае это означает уровень сглаживания. Например, 16× –
это более высокий уровень качества, чем 2×. Указание более высокого
уровня сглаживания улучшает качество изображения, но снижает производительность графики;
immediate_drawing: это свойство управляет отображением окна. Принимаются значения «on» (режим по умолчанию) и «off». Используется
для задержки длинной последовательности графических команд (подразумевающих несколько рисунков или перерисовок);
background: цвет фона окна. Принимает в качестве значения индекс
относительно текущей цветовой карты;
visible: свойство отвечает за то, будет ли видно окно на экране
компью­тера. Значение «off» скрывает окно, но оно всё равно сущест­
вует, а значение «on» выводит окно на экран;
rotation_style: свойство связано с поворотом трёхмерных графиков.
Принимает значения «unary» – поворот одного графика и «multiple» –
поворот всех графиков одновременно;
event_handler: функция Scilab, которая предназначена для обработки
событий. Установка пустой строки приводит к отключению обработчика событий;
event_handler_enable: используется для включения или отключения
обработчика событий. Принимает значения «on» и «off»;

244
zz
zz

zz

zz

zz

zz
zz

zz
zz

zz

zz
zz
zz

Глава 5. Создание графических приложений в среде Scilab

user_data: это свойство можно использовать для хранения и извлечения любой переменной Scilab в структуре данных figure;
resizefcn: это поле может использоваться для хранения имени функции Scilab в виде символьной строки. Эта символьная строка будет
вычисляться при создании и изменении размеров графического окна;
closerequestfcn: это поле может использоваться для хранения имени
функции Scilab в виде символьной строки. Эта символьная строка будет вычисляться всякий раз, когда пользователь попытается закрыть
фигуру, используя крестик в правом верхнем углу;
resize: «on» (значение по умолчанию) позволяет пользователю изменять размер рисунка с помощью мыши, «off» запрещает это делать.
Но изменить размер по-прежнему можно с помощью свойства figu­
re_size;
toolbar: это свойство определяет тип панели инструментов в созданном окне. Если его значение «none», то в окне не будет никакой панели
меню. Если его значение «figure», то будет создано окно с панелью
инструментов для рисования по умолчанию. Это значение может быть
установлено только при создании окна;
toolbar_visible: это свойство управляет видимостью панели инструментов. Принимает значения «on» (значение по умолчанию) или «off»;
menubar: это свойство определяет тип строки меню в окне. Если его значение равно «none», то в окне не будет никакой панели меню. Если его
значение равно «figure», то будет создано окно со стандартной строкой
меню. Это значение может быть установлено только при создании.
menubar_visible: это свойство управляет видимостью панели меню рисунков. Принимает значения «on» (значение по умолчанию) или «off»;
infobar_visible: это свойство управляет видимостью строки состояния рисунка. Принимает значения «on» (значение по умолчанию) или
«off»;
dockable: это свойство определяет, может ли созданное окно быть закреплено внутри среды Scilab. Если его значение равно «on», то в окне
будет панель, позволяющая пользователю закрепить/отстыковать его.
В противном случае окно будет выглядеть как стандартное окно операционной системы. Это значение может быть установлено только при
создании;
layout: это свойство задаёт макет, используемый для размещения дочерних элементов окна;
layout_options: это свойство задаёт параметры макета, используемого
для размещения дочерних элементов окна;
default_axes: «on» (значение по умолчанию)означает, что окно по
умолчанию всегда имеет оси: они автоматически устанавливаются при
создании окна или автоматически сбрасываются, когда оси окна намеренно удаляются. «off» означает, что вновь созданная фигура не имеет
осей по умолчанию и для существующей фигуры можно фактически
удалить все её существующие оси;

5.1. Работа с графическим окном

245

icon: это поле можно использовать для настройки значка окна Scilab.
Его значение представляет собой символьную строку, содержащую
(абсолютный или относительный) путь к файлу изображения, содержащему значок;
z z tag: это свойство для хранения символьной строки, обычно используемой для идентификации элемента управления. В основном применяется в сочетании с findobj().
Установить или изменить свойство объекта можно несколькими способами.
1. Непосредственно при создании графического окна. В этом случае обращение к функции figure имеет вид:
zz

F=figure('Свойство1', 'Значение1', 'Свойство2', 'Значение2', ...,
'Свойствоn', 'Значениеn')
Здесь 'Свойство1' – название первого параметра, Значение1 – его значение, 'Свойство2' – название второго параметра, Значение2 1 – значение второго параметра и т. д.
Например, с помощью команды
f=figure('figure_size',[300,300],'figure_position',[0,0]);

в левом верхнем углу экрана будет создано окно шириной и высотой
по 300 пикселей.
2. После создания графического окна с помощью функции
set(f,'Свойство1', 'Значение1', 'Свойство2', 'Значение2', ...,
'Свойствоn', 'Значениеn')
устанавливается значение параметров. Здесь f – графическое окно,
'Свойство' – имя параметра, 'Значение' – его значение.
Например, с помощью команд
set(f,'figure_size',[400,500],'info_message','Это сообщение в графическом
окне');

можно задать размер окна и информационное сообщение.
3. Так как f – это объект, то к его свойствам можно обратиться напрямую,
не используя функцию set.
Например, вышеприведённые команды эквивалентны следующим:
f.figure_size = [400,500];
f.info_message = 'Это сообщение в графическом окне';

Получить значение свойства объекта также можно несколькими спосо­
бами.
1

Значение i будет использоваться в кавычках, если значением параметра является
строка, если же значением параметра является число, то кавычки использовать не
надо.

246

Глава 5. Создание графических приложений в среде Scilab

1. После создания графического окна с помощью функции
get(f,'Свойство')
Здесь f – графическое окно, 'Свойство' – имя параметра.
Например, с помощью команд
get(f,'figure_size'); get(f,'info_message');

можно получить данные о размерах окна и информационное сооб­
щение.
2. Так как f – это объект, то к его свойствам можно обратиться напрямую,
не используя функцию get.
Например, вышеприведённые команды эквивалентны следующим:
f.figure_size f.info_message

3. Результат работы функции get, как и результат обращения к свойству
объекта, можно записать в переменную:
fs=get(f,'figure_size') im=f.info_message

Задача 5.1
Создать окно с заголовком Первое окно, задать этому окну зелёный цвет
фона. Записать заголовок в переменную title, а цвет фона – в color.
Решение приведено в листинге 5.2.
Листинг 5.2. Решение задачи 5.1
Вариант 1
f=figure('background',3);
f.figure_name='Первое окно';
title=f.figure_name
color=f.background
Вариант 2
f=figure('figure_name','Первое окно','background',3);
title=f.figure_name
color=f.background
Вариант 3 f=figure('background',3);
set(f,'figure_name','Первое окно');
title=get(f,'figure_name')
color=get(f,'background')

Графическое окно можно закрыть с помощью функции close(f), где f –
графическое окно.
Удаляется окно с помощью функции delete(f), где f – графическое окно.

5.2. Динамическое создание интерфейсных элементов. Описание основных функций

247

5.2 Динамическое создание интерфейсных
элементов. Описание основных функций
В Scilab используется динамический способ создания интерфейсных компонентов. Он заключается в том, что на стадии выполнения программы могут
создаваться (и удаляться) те или иные элементы управления (кнопки, метки,
флажки и т. д.), а их свойствам – присваиваться соответствующие значения.
Для создания любого интерфейсного компонента с заданными свойствами
используется функция uicontrol. Обращение к ней имеет вид:
C=uicontrol(F, 'Style', 'тип_компонента', 'Свойство_1', Значение_1,
'Свойство_2', Значение_2,..., 'Свойство_k',Значение_k);
Здесь:
z z C – объект создаваемого компонента;
z z F – объект, внутри которого будет создаваться компонент (чаще всего
этим компонентом будет окно);
z z 'Style' – служебная строка Style указывает на стиль создаваемого
компонента;
z z 'тип_компонента' – определяет, к какому классу принадлежит созда­
вае­мый компонент. Возможные значения:
– Checkbox: кнопка с двумя состояниями (используется для нескольких
независимых вариантов выбора);
– E dit: редактируемая строковая зона;
– F rame: контейнер для других элементов uicontrols или осей;
– I mage: компонент, в котором отображается указанное изображение;
– L ayer: контейнер для элементов управления объектами типа frame,
позволяющий переключаться между ними программно с помощью
свойства value;
– Listbox: список элементов, которые можно прокручивать. Элементы
можно выбирать с помощью мыши;
– P opupmenu: кнопка, при нажатии на которую появляется меню;
– P ushbutton (стиль по умолчанию): прямоугольная кнопка, обычно
используемая для выполнения обратного вызова;
– R adiobutton: кнопка с двумя состояниями. В отличие от Checkbox
предполагает выбор только одного варианта из списка;
– Slider: ползунок, используемый для установки значения в заданном
интервале с помощью мыши;
– S pinner: компонент, который позволяет пользователю выбирать/
редактировать значение между границами с фиксированным шагом;
– T ab: контейнер для элементов управления объектами типа frame,
позволяющий переключаться между ними, щелкая по вкладке с заданным названием и/или значком;

248

zz

Глава 5. Создание графических приложений в среде Scilab

– T able: редактируемая таблица;
– T ext: текстовый элемент управления (обычно статический);
'Свойство_k', Значение_k – определяют свойства и значения отдельных
компонентов. Список свойств объектов uicontrol:
– BackgroundColor: цвет фона объекта. Задаётся в виде массива из трёх
значений: уровень красного в итоговом цвете, зелёного и синего.
Это вещественные числа в диапазоне от 0 до 1. Цвет может быть
задан как в виде вектора [R, G, B], так и в виде строки, где каждое
значение разделяется символом «|», т. е. «R|G|B». Установка этого
свойства в [-1 -1 -1] позволит внешнему виду задавать цвет фона
по умолчанию;
– B order: объект границы. Он используется только для frame. При установке этого значения на [] граница рамки удаляется;
– C allback: строка с инструкциями Scilab, которая выполняется при
активации объекта (например, при нажатии на кнопку). Это свойство
не используется для layer, frame и text;
– C allback_Type: тип обратного вызова, передаваемого в uicontrol:
–1 – нет (обратный вызов деактивирован);
0 (по умолчанию) – пользовательские инструкции Scilab, записанные в виде строки в свойстве Callback;
1 – функции Fortran;
– C onstraints: объект создается с помощью createConstraints и описывает ограничения на положение и размер объекта относительно
его родительского элемента. Установка этого значения на [] снимает
ограничения;
– Enable: если для этого свойства установлено значение «on» (по умолчанию), объект будет реагировать на действия мыши, если установлено «off» – нет (объект будет выделен серым цветом);
– F ontAngle: применяется для элементов, содержащих какой-либо
текст. Это свойство задаёт наклон шрифта. Есть возможность сделать
шрифт обычным, курсивным или наклонным. Значения «normal»,
«italic» и «oblique» соответственно;
– F ontSize: свойство задаёт размер шрифта текста. Принимает скалярное значение;
– F ontUnits: в этом свойстве можно указать единицы измерения,
с помощью которых задаётся размер шрифта: «points», «pixels»,
«normalized»;
– F ontWeight: свойство задаёт насыщенность шрифта. Можно указать
значения: «light», «normal», «demi», «bold»;
– F ontName: строка, в которой указывается название шрифта;
– F oregroundColor: цвет текста объекта. Задаётся в виде массива из
трёх значений: уровень красного в итоговом цвете, зелёного и синего. Это вещественные числа в диапазоне от 0 до 1. Цвет может быть

5.2. Динамическое создание интерфейсных элементов. Описание основных функций



















249

задан как в виде вектора [R, G, B], так и в виде строки, где каждое
значение разделяется символом «|», т. е. «R|G|B»;
G roupname: это свойство, используемое для типов radiobutton
и checkbox. Позволяет управлять всеми объектами одной и той же
группы. Например, для checkbox будет осуществляться автоматическая проверка уникальности выбора;
H orizontalAlignment: устанавливает выравнивание текста по горизонтали. Возможные значения: «left», «center», «right»;
I con: это свойство представляет собой строку, содержащую относительный (к рабочему каталогу Scilab) или абсолютный путь к файлу
изображения, который будет использоваться в качестве значка для
pushbutton или text;
L ayout: это свойство задаёт шаблон, используемый для удаления дочерних элементов frame;
L ayout_options: это свойство задаёт параметры шаблона, используемого для удаления дочерних элементов frame;
ListboxTop: это свойство используется только для listbox. Оно указывает, какой элемент списка отображается в первой строке видимой области списка. В качестве значения принимает номер элемента списка;
M argins: вектор [top, left, bottom, right]. Свойство задаёт пустое пространство вокруг элемента в пикселях;
M ax: указывает наибольшее значение, которое может принимать
свойство «value». Однако оно имеет разное значение для каждого
объекта:
• checkbox и radiobutton: значение max – это значение, которое
принимает свойство «value» при установке флажка;
• slider и spinner: максимальное значение, которое можно выбрать;
• listbox: если (max-min)>1, список допускает множественный выбор (Сtrl + клик левой кнопкой мыши по пункту списка);
M in: указывает наименьшее значение, на которое может быть установлено свойство «value». Однако оно имеет разное значение для
каждого объекта:
• checkbox и radiobutton: min – это значение, которое принимает
свойство «value», когда контроль снят;
• slider и spinner: минимальное значение компонента;
• listbox: если (max-min)>1, список допускает множественный выбор;
P arent: дескриптор родительского элемента uicontrol. Изменение
этого свойства позволяет перемещать элемент с одного графического окна на другое;
P osition: [x y w h] числовой вектор или строка «x|y|w|h». Задаёт или
получает положение и размер элемента:
• х – горизонтальное положение левой части компонента по отношению к левому краю ссылочного элемента;

250

Глава 5. Создание графических приложений в среде Scilab










• y – вертикальное положение нижней стороны компонента по отношению к нижнему краю ссылочного элемента;
• w и h – это ширина и высота объекта.
x, y, w, h также могут быть заданы с помощью отдельной строки
«x|y|w|h». В качестве разделителя используется «|». Единица измерения устанавливается с помощью свойства Units.
Для ползунков: w > h устанавливает ползунок по горизонтали, в противном случае – по вертикали;
R elief: внешний вид границы объекта. Принимает значения «de­
fault», «flat», «groove», «raised», «ridge», «solid», «sunken»;
S crollable: свойство, используемое для типов frame и edit, указывает, должен элемент иметь возможность прокрутки («on») или
нет («off»). Для frame это значение необходимо задать при создании
элемента;
S liderStep: [1,2] вещественный вектор для работы с масштабом:
• 1 – размер маленького шага. Срабатывает при нажатии на ползунок или при нажатии на клавиши со стрелками (когда ползунок
находится в фокусе);
• 2 – размер большого шага. Срабатывает при нажатии Ctrl + нажатие стрелки клавиатуры. Если большой шаг опущен, по умолчанию
он равен 1/10 от масштаба;
S tring: текст, отображаемый в объекте (за исключением Frame, Sli­
der и Spinner):
• для таблиц значением является строковая мат­ри­ца;
• для списков и всплывающего меню – вектор строк или одна строка,
элементы которой разделены символом «|»;
• для текстовых элементов эта строка может содержать HTML-код
для форматирования текста;
• для pushbutton или text, если текст заключен между двумя $ (знак
доллара), он будет рассматриваться как выражение LaTeX, а если
текст заключен между < и >, то он будет рассматриваться как выражение MathML;
• для layer и tab значение указывает тег выбранного дочернего элемента;
• для image значение указывает путь к файлу изображения;
• для table значение определяет данные таблицы:
[IGNORED COL1-HEADER...COLN-HEADER;
ROW1-HEADER, ROW1COL1-DATA, ... , ROW1COLN-DATA;
...
ROWM-HEADER, ROWMCOL1-DATA, ... , ROWMCOLN-DATA].
T ag: это свойство обычно используется для идентификации элемента управления. Оно позволяет присвоить ему «имя». В основном используется в сочетании с findobj();

5.2. Динамическое создание интерфейсных элементов. Описание основных функций

251

– T itle_position: расположение вкладок tab. Возможные значения:
«top», «left», «bottom», «right»;
– T itle_scroll: это свойство указывает, должны вкладки tab иметь
прокрутку («on») или нет («off»);
– T ooltipString: это свойство представляет текст всплывающей подсказки около элемента, появляющийся при наведении курсора мыши
на него;
– U nits: это свойство задаёт единицы измерения, используемые для
свойства «position». Нормализованные позиции и размеры указаны в пределах от 0 до 1. Возможные значения: «points», «pixels»,
«normalized»;
– U serdata: привязка некоторых объектов Scilab (string, string matrix,
matrix mxn) к uicontrol;
– V alue: скаляр или вектор. Значение объекта. Точное значение зависит от типа объекта:
• checkbox и radiobutton: значение устанавливается равным max
(см. выше) при включении и min при выключении флага;
• listbox и popupmenu: значение представляет собой вектор индексов, соответствующих индексам выбранных записей в списке.
1 – первый элемент списка;
• slider и spinner: числовое значение, указываемое элементом;
• layer и tab: индекс отображаемого элемента;
• image: установка некоторых свойств изображения [X-Scale Y-Scale
X-Shear Y-Shear RotationAngle];
– Verticalalignment: выравнивание текста по вертикали. Это свойство
действует только с объектами типа Text и CheckBox. Возможные значения: «top», «middle», «bottom»;
– V isible: видимость объекта. Если для этого свойства установлено
значение «on» (по умолчанию), объект виден, но если значение «off»,
объект не будет отображаться в родительском окне.

5.2.1 Командная кнопка
Командная кнопка типа PushButton создается с помощью функции uicont­
rol, в которой параметру 'Style' необходимо присвоить значение 'pushbutton'. По умолчанию она не снабжается никакой надписью, имеет серый цвет
и располагается в левом нижнем углу фигуры.
Листинг 5.3. Создание окна с кнопкой
//Создаем окно
d=figure();
//Создаем кнопку, устанавливая свойство Style.
dbt=uicontrol(d,'Style','pushbutton');

252

Глава 5. Создание графических приложений в среде Scilab

Рис. 5.1. Кнопка в окне

При щелчке по кнопке вокруг её надписи появляется синяя рамка, свидетельствующая о том, что кнопка «находится в фокусе». Модифицируем программу создания кнопки, задав дополнительно значения некоторых свойств:
z z месторасположение и заголовок окна;
z z надпись на кнопке;
z z месторасположение кнопки.
Текст программы приведен в листинге 5.4, а на рис. 5.2 можно увидеть
окно, которое получилось в результате работы этой программы.
Листинг 5.4. Определение свойств кнопки
//Создаем окно.
f=figure();
//Определяем месторасположение окна.
set(f,'position',[0,0,250,100])
//Определяем имя (заголовок) окна.
set(f,'figure_name','Окно с кнопкой');
//Создаем кнопку (style - pushbutton), надпись на кнопке - Кнопка,
//позиция кнопки определяется параметром position.
Button=uicontrol('style','pushbutton','string',...
'Кнопка', 'position',[50,50,100,20]);

5.2. Динамическое создание интерфейсных элементов. Описание основных функций

253

Рис. 5.2. Окно с кнопкой

Главным назначением командной кнопки является вызов функции, реагирующей на щелчок по кнопке.
Щелчок по кнопке генерирует событие CallBack, которое указывается как
параметр функции uicontrol. Значением параметра CallBack является строка с именем функции, вызываемой при щелчке по кнопке. В этом случае
функция uicontrol становится такой:
Button=uicontrol('style', 'pushbutton', 'string', 'Button', 'CallBack',
'Function');
Здесь Function – имя вызываемой при наступлении события CallBack
функции.
В качестве примера рассмотрим окно с кнопкой, при щелчке по которой
появляется окно с графиком функции y = sin(x) (см. листинг 5.5). После запус­
ка этой программы появится окно, представленное на рис. 5.3, при щелчке
по кнопке Button вызывается обработчик события – функция gr_sin, в результате появляется окно, изображенное на рис. 5.4.
Листинг 5.5. Пример кнопки с обработчиком события CallBack
f=figure();
set(f,'position',[0,0,400,400])
set(f,'figure_name','График');
//Создаем кнопку, которая при щелчке по ней мышкой вызывает
//функцию gr_sin.
Button=uicontrol('style','pushbutton','string','Button',...
'position',[0,0,100,20],'CallBack','gr_sin');
function y=gr_sin()
x=-5:0.2:5;
y=sin(x);
plot(x,y);
xgrid();
endfunction

254

Глава 5. Создание графических приложений в среде Scilab

Рис. 5.3. Окно программы

Рис. 5.4. График функции y = sin(x)

5.2.2 Метка
Следующим наиболее часто используемым компонентом является метка –
текстовое поле для отображения символьной информации. Для определения метки значения параметра 'Style' в функции uicontrol должно быть
значение 'text'. Компонент предназначен для вывода символьной строки
(или нескольких строк). Выводимый на метку текст – значение параметра
'String' – может быть изменён только программно.
Рассмотрим пример создания текстового поля (метки) с помощью функции uicontrol (см. листинг 5.6 и рис. 5.5).
Листинг 5.6. Создание метки
f=figure();
uicontrol('Style','text','Position',[10,130,150,20],...
'String', 'Метка');

Одним из основных свойств метки является горизонтальное выравнивание текста, которое определяется свойством HorizontalAlignment. В качестве примера рассмотрим окно, содержащее 4 текстовых поля с разными
значениями свойства HorizontalAlignment. Текст программы представлен
в листинге 5.7, а окно с четырьмя метками – на рис. 5.6.
Листинг 5.7. Создание нескольких меток
hFig=figure('figure_size',[300 300]);
hSt1=uicontrol('Style','text','Position',[30,30,150,20], ...
'String', 'Метка 1');
hSt1.BackgroundColor=[1 1 1]);

5.2. Динамическое создание интерфейсных элементов. Описание основных функций
hSt1.HorizontalAlignment='left';
hSt2=uicontrol('Style', 'text', 'Position', [30,60,150,20],...
'HorizontalAlignment', 'center', 'BackgroundColor', [1 1 1],...
'String', 'Метка 2');
hSt3=uicontrol('Style','text','Position',[30,90,150,20],...
'HorizontalAlignment','right','BackgroundColor',[1 1 1],...
'String','Метка 3');
hSt4=uicontrol('Style','text','Position',[30,120,150,20],...
'BackgroundColor',[1 1 1],'String','Метка 4');

Рис. 5.5. Окно с меткой

Рис. 5.6. Окно с несколькими метками

255

256

Глава 5. Создание графических приложений в среде Scilab

5.2.3 Переключатель и флажок
Рассмотрим ещё два компонента – переключатель и флажок, которые позволяют переключаться между состояниями кнопок или выбирать значения
из списка.
У флажка свойство 'Style' принимает значение 'checkbox', у переключателя – 'radiobutton'.
Оба объекта создаются с помощью функции uicontrol. Пример создания
переключателя представлен в листинге 5.8 и на рис. 5.7.
Листинг 5.8. Создание переключателя
hFig=figure('figure_size',[300 300]);
R=uicontrol('Style','radiobutton','String','имя',...
'value',1,'position', [25,50,70,30]);

Рис. 5.7. Окно с переключателем

При создании переключателя должно быть задано его состояние (параметр
'value'), переключатель может быть активен (значение 'value' равно 1) или
нет (значение 'value' равно 0). Задать значение свойства 'value' можно
также и с помощью функции set:
set(R,'value',0)

или напрямую обратиться к свойству объекта:
R.value=0

Получить значение свойства 'value' можно с помощью функции get.
Переключатель может реагировать на событие 'CallBack' и вызывать на
выполнение определённую функцию. В этом случае создать кнопку можно
с помощью вызова следующей функции uicontrol:
r1=uicontrol('Style','radiobutton','String','sin(x)','value',
0,'CallBack','F1');

5.2. Динамическое создание интерфейсных элементов. Описание основных функций

257

Здесь F1 – имя функции, которая будет вызываться при щелчке по переключателю (при этом автоматически происходит смена его состояния).
Пример: написать программу, в которой с помощью переключателя можно
выбрать функцию. Её график будет нарисован при щелчке по кнопке Plot.
Следует помнить, что переключатели обычно используются для выбора одного варианта из предложенных. Для этого присвоим свойству 'groupname'
обоих элементов одинаковые значения, объединив переключатели в одну
группу (см. листинг 5.9 и рис. 5.8).
Листинг 5.9. Пример работы с переключателями
//Создаем графическое окно.
hFig=figure('Position',[50,50,800,800]);
//Создаем переключатели
hRb1=uicontrol('Style','radiobutton','String','sin(x)',...
'value',1, 'Position',[120,40,80,20],'groupname','plotFunction');
hRb2=uicontrol('Style','radiobutton','String','cos(x)',...
'value',1, 'Position',[25,40,80,20],'groupname','plotFunction');
//Создаем кнопку с именем Plot, которая с помощью обработчика
//Radio строит график функции в соответствии с положением
//переключателей.
Button=uicontrol('style','pushbutton','string','Plot',...
'position',[25,10,80,20],'CallBack','Radio');
//Создаем кнопку с именем Close, которая с помощью обработчика
//Final закрывает окно.
Button1=uicontrol('style','pushbutton','string','Close',...
'position',[120,10,80,20],'CallBack','Final');
//Функция Radio, реагирующая на щелчок по кнопке
function Radio()
newaxes;
x=-2*%pi:0.1:2*%pi;
if get(hRb1,'value')==1 //Если активна первая кнопка,
y=sin(x);
plot(x,y,'-r');//то построение синусоиды
xgrid();
end;
if get(hRb2,'value')==1 //Если активна вторая кнопка,
y=cos(x);
plot(x,y,'-b');//то построение косинусоиды
xgrid();//Нанесение сетки на график
end;
endfunction
//Функция, отвечающая за кнопку Close и закрывающая окно.
function Final()
close(hFig);
endfunction

258

Глава 5. Создание графических приложений в среде Scilab

Рис. 5.8. Окно приложения

На рис. 5.8 представлено окно приложения. Кнопка Close закрывает его.
Изменение состояния переключателей происходит автоматически при щелчке по ним.
Элемент флажок используется для множественного выбора. Генерация
события 'CallBack' и автоматическое выделение кнопки происходят при
щелчке по квадратику или сопровождающей его надписи. Если флажок включён, то значение свойства 'value' равно 1. Щелчок по флажку автоматически
изменяет состояние на противоположное. Использование флажка аналогично переключателю.
Листинг 5.10. Пример работы с флажками
//Создание флажков вместо переключателей
//Остальной код не отличается от предыдущего

5.2. Динамическое создание интерфейсных элементов. Описание основных функций

259

hRb1=uicontrol('Style','checkbox','String','sin(x)',...
'value',1, 'Position',[120,40,80,20]);
hRb2=uicontrol('Style','checkbox','String','cos(x)',...
'value',1, 'Position',[25,40,80,20]);

Рис. 5.9. Построение графиков обеих функций

5.2.4 Окно редактирования
Интерфейсный элемент «окно редактирования» (у этого компонента свойство 'Style' должно принимать значение 'edit') может использоваться
для ввода и вывода символьной информации. Текст, набираемый в окне редактирования, можно корректировать. При работе с компонентом можно
использовать операции с буфером обмена. Процедура ввода, завершаемая
нажатием клавиши Enter, генерирует событие CallBack.

260

Глава 5. Создание графических приложений в среде Scilab

Строка ввода определяется параметром 'String', который определяет
находящийся в компоненте текст. Изменить значение этого свойства можно
с помощью функции set, а посчитать его значение – с помощью функции get.
Вводимый текст может быть прижат к левому или правому краю окна
ввода, если задать соответствующее значение свойства HorizontalAlignment
(по аналогии с компонентом «метка»). Если вводимый текст представляет
собой числовое значение, которое должно быть использовано в работе программы, то содержимое свойства 'String' переводится в числовой формат
с помощью функции eval (можно было воспользоваться и функцией evstr)
(будет рассмотрено далее на примере квадратного уравнения).
В качестве примера работы с несколькими компонентами рассмотрим
следующую задачу.
Задача 5.2
Написать программу решения квадратного или биквадратного уравнения.
Выбор типа уравнения будем проводить с помощью компонента «Переключатель».
Программа с комментариями представлена в листинге 5.11.
Листинг 5.11. Решение квадратного или биквадратного уравнения
f=figure(); //Создание графического объекта.
//Устанавливаем размер окна.
set(f,'position',[500,300,500,300])
//Устанавливаем заголовок окна.
set(f,'figure_name','УРАВНЕНИЕ');
//Создание текстовых полей для подписей полей ввода
//коэффициентов.
//Подпись A=
lab_a=uicontrol(f,'style','text','string','A=','position',... [0, 250, 100, 20]);
//Подпись B=
lab_b=uicontrol(f,'style','text','string','B=','position',... [100, 250, 100, 20]);
//Подпись C=
lab_c=uicontrol(f,'style','text','string','C=','position',... [200, 250, 100, 20]);
//Поле редактирования для ввода коэффициента a.
edit_a=uicontrol(f,'style','edit','string','1','position',... [0, 230, 100, 20]);
//Поле редактирования для ввода коэффициента b.
edit_b=uicontrol(f,'style','edit','string','2','position',... [100, 230, 100, 20]);
//Поле редактирования для ввода коэффициента c.
edit_c=uicontrol(f,'style','edit','string','1','position',... [200, 230, 100, 20]);
//Флажок, отвечающий за выбор типа уравнения.
radio_bikv=uicontrol('style','radiobutton','string',...
'Это биквадратное уравнение?', 'value',1,'position',... [0,200,300,20]);

5.2. Динамическое создание интерфейсных элементов. Описание основных функций

261

//Кнопки для решения уравнения и закрытия окна
BtSolve=uicontrol('style','pushbutton','string','Решить',...
'CallBack', 'Solve','position',[0,170,120,20]);
BtClose=uicontrol('style','pushbutton','string','Закрыть',...
'CallBack', '_Close','position',[150,170,120,20]);
//Текстовое поле, определяющее вывод результатов.
textresult=uicontrol(f,'style','text','string','','position',...[0, 100, 500, 20]);
//Функция решения уравнения.
function Solve()
//Считываем значения переменных из текстовых полей и
//преобразовываем их к числовому типу.
a=evstr(get(edit_a,'string'));
b=evstr(get(edit_b,'string'));
c=evstr(get(edit_c,'string'));
d=b*b-4*a*c;
//Проверяем значение флажка, если флажок выключен,
if get(radio_bikv,'value')==0
//то решаем квадратное уравнение,
if d 0 на обоих концах
интервала и в качестве начального приближения взять ту точку, где это условие выполняется. Для реализации данного алгоритма нужно найти первую
и вторую производные функции f(x).

6.1.1.4 Метод простой итерации
Для решения уравнения этим методом необходимо записать уравнение
f(x) = 0 в виде x = ϕ(x), задать начальное приближение x0 Î [a; b] и организовать следующий итерационный вычислительный процесс [1, 3, 10]:
xk+1 = ϕ(xk), k = 0, 1, 2, … .
Вычисление прекратить, если |xk+1 - xk| < ε (ε – точность).
Если неравенство |ϕ¢(x)| < 1 выполняется на всём интервале [a; b], то последовательность x0, x1, x2, ..., xn, ... сходится к решению x∗ (т. е.
xk = x∗).

Значение функции ϕ(x) должно удовлетворять условию |ϕ¢(x)| < 1, для того
чтобы можно было применить метод простых итераций. Условие |ϕ¢(x)| < 1
является достаточным условием сходимости метода простой итерации.
Уравнение f(x) = 0 можно привести к виду x = ϕ(x) следующим образом.
Умножить обе части уравнения f(x) = 0 на число λ. К обеим частям уравнения
λ · f(x) = 0 добавить число x. Получим x = x + λ · f(x). Это и есть уравнение вида
x = ϕ(x), где
ϕ(x) = x + λ · f(x).
Необходимо, чтобы неравенство |ϕ¢(x)| < 1 выполнялось на интервале
[a; b], следовательно, |ϕ¢(x)| = |1 + λ · f ¢(x)| и |1 + λ · f ¢(x)| < 1 (|1 + λ · f ¢(a)| < 1,
|1 + λ · f ¢(b)| < 1), а значит, с помощью подбора параметра λ можно добиться
выполнения условия сходимости.
Рассмотрим процесс нахождения λ на примере уже рассмотренного выше
уравнения x2 - cos(5 · x) = 0, один из корней находится на интервале изоляции
a = 0.2; b = 0.4. Подберём значение λ, решив неравенство |1 + λ · f ¢(x)| < 1:
|1 + λ · f ¢(a)| < 1 и |1 + λ · f ¢(b)| < 1,
f(x) = x2 - cos(5 · x), f ¢(x) = 2 · x + 5 · sin(5 · x),
f ¢(a) = 2 · 0.2 + 5 · sin(5 · 0.2) ≈ 4.6 , f ¢(b) = 2 · 0.4 + 5 · sin(5 · 0.4) ≈ 5.35,

272

Глава 6. Нелинейные уравнения и системы в Scilab

|1 + λ · 4.6| < 1 и |1 + λ · 5.35| < 1.

и, следовательно, λ Î (-0.37; 0).

6.1.1.5 Метод секущих
Суть метода секущих [10] в следующем. Если нам известны значения в двух
точках (xk, f(xk)), (xk+1, f(xk+1)) внутри интервала изоляции [a; b], то через эти
точки можно провести прямую до точки (xk+2) пересечения её с осью абсцисс
(см рис. 6.5 [10]). Выпишем формулу для вычисления xk+2.

Рис. 6.5. Графическая интерпретация метода секущих

Вычисления будем продолжать до тех пор, пока очередное значение f(xk+2)
не станет меньше точности ε.
Рассмотрим реализацию описанных выше методов в Scilab (см. лис­
тинг 6.2) на примере уравнения x2 - cos(5 · x) = 0.
Листинг 6.1. Функции решения нелинейных уравнений
//Левая часть уравнения
function y=f(x)
y=x.*x-cos(5*x)
endfunction
//Правая часть уравнения x=fi(x)
function y=fi(lyam,x)

6.1. Методы решения нелинейных уравнений
y=x+lyam*f(x)
endfunction
//Производная функции f(x)
function y=f1(x)
y=2*x+5*sin(5*x)
endfunction
//Вторая производная функции f(x)
function y=f2(x)
y=2+25*cos(5*x)
endfunction
//Функция уточнения корня методом половинного деления
//a,b - интервал изоляции
//eps - точность решения уравнения
//c - найденный корень уравнения
//k - количество итераций для нахождения корня
//с точностью eps
function [k,c]=dihot(a,b,eps)
k=0;
while abs(b-a)>eps
k=k+1;
c=(a+b)/2;
if f(a)*f(c)>0 then
a=c;
else
b=c;
end;
if abs(f(c))eps
k=k+1;
c=a-f(a)/(f(b)-f(a))*(b-a);
if f(a)*f(c)>0 then
a=c;
else
b=c;
end;
end;
endfunction

273

274

Глава 6. Нелинейные уравнения и системы в Scilab

//Функция уточнения корня методом секущих
//xo,x1 - две точки внутри интервала изоляции
//eps - точность решения уравнения
//c - найденный корень уравнения
//k - количество итераций для нахождения корня
//с точностью eps
function [k,x2]=sek(x0,x1,eps)
k=0;
while abs(f(x1))>eps
k=k+1;
x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
x0=x1;
x1=x2;
end
endfunction
//Функция уточнения корня методом касательных
//a,b - интервал изоляции
//eps - точность решения уравнения
//c - найденный корень уравнения
//k - количество итераций для нахождения корня
//с точностью eps
function [k,c]=kasat(a,b,eps)
k=0
if f(a)*f2(a)>0 then
c=a;
else
c=b
end
while abs(f(c))>eps
k=k+1;
c=c-f(c)/f1(c)
end
endfunction
//Функция уточнения корня методом половинного деления
//a,b - интервал изоляции
//layam - подобранный коэффициент для записи правой части
//уравнения в виде x=fi(x)=x+lyam*f(x))
//eps - точность решения уравнения
//c - найденный корень уравнения
//k - количество итераций для нахождения корня
//с точностью eps
function [k,x]=iter(a,b,lyam,eps)
x=(a+b)/2;
k=0
while abs(f(x))>eps
k=k+1;
x=fi(lyam,x)
end
endfunction
//Интервал изоляции корня уравнения x=f(x)=x^2-cos(5*x)
a=0.2;

6.1. Методы решения нелинейных уравнений

275

b=0.4;
//Точность решения уравнения
eps=%eps;
//Построение графика функции y=f(x)=x^2-cos(5x)
xx=-1:0.02:1;
plot(xx,f(xx))
xgrid;
xtitle("График функции x^2-cos(5x)","X","Y");
[k,c]=dihot(a,b,eps);
mprintf("Метод половинного деления\n");
mprintf("x=%e\tf(x)=%e\tk=%d\n",c,f(c),k);
[k,c]=hord(a,b,eps);
mprintf("Метод хорд\n");
mprintf("x=%e\tf(x)=%e\tk=%d\n",c,f(c),k);
[k,c]=sek(0.2,0.21,eps);
mprintf("Метод секущих\n");
mprintf("x=%e\tf(x)=%e\tk=%d\n",c,f(c),k);
mprintf("Метод касательных\n");
[k,c]=kasat(0.2,0.4,eps);
mprintf("x=%e\tf(x)=%e\tk=%d\n",c,f(c),k);
mprintf("Метод простой итерации\n");
[k,c]=iter(0.2,0.4,-0.2,eps);
mprintf("x=%e\tf(x)=%e\tk=%d\n",c,f(c),k);

График функции приводился ранее (см. рис. 6.1). Решение уравнения x2 cos(5 · x) = 0 с помощью написанных авторами функций решения нелинейных
уравнений приведено ниже.
Листинг 6.2. Решение уравнения x2 − cos(5x) = 0
Метод половинного деления
x=2.965483e-01 f(x)=3.330669e-16 k=50
Метод хорд
x=2.965483e-01 f(x)=8.326673e-17 k=5
Метод секущих
x=2.965483e-01 f(x)=8.326673e-17 k=6
Метод касательных
x=2.965483e-01 f(x)=8.326673e-17 k=4
Метод простой итерации
x=2.965483e-01 f(x)=-1.804112e-16 k=15

6.1.2 Особенности решения алгебраических уравнений
Любое уравнение f(x) = 0, где f(x) – это многочлен, отличный от нулевого, называется алгебраическим уравнением, или полиномом. Всякое алгебраическое
уравнение относительно x можно записать в виде:
P1x n + P2 x n-1 +  + Pn x + Pn+1 = 0,
где P1 ≠ 0, n ³ 1 и Pi – коэффициенты алгебраического уравнения n-й степени. Например, линейное уравнение – это алгебраическое уравнение первой
степени, квадратное – второй, кубическое – третьей и т. д.

276

Глава 6. Нелинейные уравнения и системы в Scilab

Рассмотрим алгоритм нахождения всех корней полинома n-й степени [6, 10].
В общем случае многочлен n-й степени имеет n корней. Однако некоторые из
них могут быть комплексными. Алгоритм состоит в многократном повторении (количество итераций определяется степенью многочлена) следующих
действий:
1) нахождение очередного корня α методом парабол. Выбор метода парабол обусловлен тем, что процесс сходится при любом начальном
приближении. Формально это не доказано, но ни разу никем не опровергнуто. Метод парабол будет представлен ниже;
2) понижение порядка полинома путём деления многочлена на x - α.
Деление полинома на x - α будет осуществляться методом Горнера,
который будет описан ниже.

6.1.2.1 Метод парабол
На практике используется метод параболы и обратной параболы. Метод параболы (или метод Мюллера) позволяет найти все (действительные и комп­
лексные) корни полинома, он сходится при любом начальном приближении.
Однако следует учитывать, что вычисления следует вести в комплексных
числах. Возможна даже парадоксальная ситуация нахождения действительных корней с использованием комплексных вычислений. Основная идея алгоритма состоит в следующем. Задаются три точки начального приближения
(x0, y0 = f(x0)), (x1, y1 = f(x1)) и (x2, y2 = f(x2)). Для практического использования
можно задать одну точку x∗, а ещё две вычислить по формулам 0.85 · x∗, 1.15 · x∗.
Через эти точки проводим параболу вида y = a · x2 + b · x + c. Точка пересечения параболы с осью абсцисс и будет точкой следующего приближения.
Подробно о методе парабол можно прочесть в [1, 10]. Расчётная формула для
вычисления следующего приближения корня имеет вид [6, 10]:
(6.4)
Здесь ω вычисляется по формуле ω = y01 + y02 - y12,

– разделённые разности первого порядка;

– разделённая разность второго порядка.
Знак «+» или «-» в формуле (6.4) выбирается таким образом, чтобы знаменатель в (6.4) был больше. Дальше отбрасываем x0 и имеем три точки x,
x1, x2. Процесс повторяем до тех пор, пока |f(x)| не станет меньше точности ε.
Если же необходимо найти только действительные корни полинома, то
для нахождения очередного корня можно использовать метод обратной параболы.

277

6.1. Методы решения нелинейных уравнений

6.1.2.2 Метод обратной параболы
В этом методе [6, 10] через точки (x0, f(x0)), (x1, f(x1)) и (x2, f(x2)) проводим параболу вида x = a · y2 + b · y + c [1, 10]. Коэффициент параболы c и будет следующим приближением:
(6.5)
(6.6)
c = xn+1 = x2 - a · f(x2)2 - b · f(x2).

(6.7)

Далее x0 = x1, x1 = x2, x2 = c, пересчитываем f(x0), f(x1), f(x2) и повторяем вычислительный процесс до тех пор, пока |f(x2)| не станет меньше точности ε.
К значительным минусам метода обратной параболы следует отнести чувст­
вительность к выбору точки начального приближения [6, 10].

6.1.2.3 Понижение порядка полинома
Рассмотрим алгоритм понижения порядка полинома
P1x n + P2 x n-1 +  + Pn x + Pn+1 = 0
путём деления многочлена на x - α, где α – корень многочлена.
P1x n + P2 x n-1 +  + Pn x + Pn+1 = (b1 x n-1 + b2 x n-2 +  + bn )(x - α) + bn+1,
bn+1 – остаток от деления, bn+1 = 0, если α – корень полинома. Алгоритм нахождения коэффициентов b можно записать так:
b(1)=P(1)
for i=2:n+1
b(i)=b(i-1)*alpha+P(i)
end

Этот алгоритм носит название процедуры синтетического деления.

6.1.2.4 Вычислительная схема Горнера
Для понимания алгоритма поиска корней полинома напомним схему Горнера, с помощью которой можно рассчитать значение полинома
f(x) = P1x n + P2 x n-1 +  + Pn x + Pn+1
в заданной точке.
Более подробно запишем вычислительную схему Горнера для полинома
4-й степени.
f(x) = P1 x 4 + P2 x 3 + P3 x 2 + P4 x + P5 = P5 + x(P4 + x(P3 + x(P2 + xP1))).

278

Глава 6. Нелинейные уравнения и системы в Scilab

Вычислительная схема Горнера для полинома 4-го порядка:
b=P(1)
b=P(2)
b=P(3)
b=P(4)
b=P(5)

+
+
+
+

x*b
x*b
x*b
x*b

Обобщим её на случай полинома n-й степени:
b=P(1)
for i=2:n
b=P(i) + x*b
end

Можно записать алгоритм даже так:
b=0
for i=1:n
b=P(i) + x*b
end

Здесь n – количество коэффициентов в полиноме.
Теперь рассмотрим программы нахождения корней полинома.
Задача 6.1
Написать программу нахождения всех корней полинома
P1 x n + P2 x n-1 +  + Pn x + Pn+1 = 0.
В качестве тестовой будем использовать задачу нахождения корней полинома [6]:
x4 - 35x 3 + 280x 2 - 1350x + 1000 = 0.
Ниже приведен код программы с комментариями1.
Листинг 6.3. Программа вычисления всех корней полинома
clear;
//Функция вычисления разделённой разности первого порядка
function y=razd(x1,x2,f1,f2)
y=(f2-f1)/(x2-x1);
endfunction
//Функция вычисления разделённой разности второго порядка
function y=razd2(x0,x1,x2,f0,f1,f2)

1

Авторы книги выражают благодарность студенткам факультета математики и компьютерных наук Кубанского государственного университета Горбуновой Ирине,
Маклаковой Анастасии, Марченко Алине за помощь в разработке алгоритма и написании кода программы нахождения корней полинома.

6.1. Методы решения нелинейных уравнений
y=(razd(x1,x2,f1,f2)-razd(x0,x1,f0,f1))/(x0-x2);
endfunction
//Функция вычисления значения полинома в точке
//Если pr=1, вычисление по схеме Горнера
//Если pr=2, вычисление по классической формуле полинома
function y0=gr(P,N,x0,pr)
if pr==1 then
y0=0;
for i=1:1:N y0=P(i)+x0*y0;
end
end
if pr==2 then
y0=0
for i=1:N
y0=y0+x0^(N-i-1)*P(i);
end
end
endfunction
//Функция понижения порядка полинома с помощью
//процедуры синтетического деления.
function B=delenie_gorner(P,N,alfa)
B(1)=P(1);
for i=2:1:N
B(i)=B(i-1)*alfa+P(i);
end
endfunction
//Функция нахождения очередного корня полинома
//методом Мюллера (парабол)
function x=Muller(P,N,x1)
x2=1.15*x1;
x0=0.85*x1;
f0=gr(P,N,x0,1);
f1=gr(P,N,x1,1);
f2=gr(P,N,x2,1);
x=x2;
while abs(gr(P,N,x,1))>abs(%eps)
u=razd(x0,x1,f0,f1)+razd(x0,x2,f0,f2)-razd(x1,x2,f1,f2);
t1=u-sqrt(u*u-4.*f0*razd2(x0, x1, x2,f0,f1,f2));
t2=u+sqrt(u*u-4.*f0*razd2(x0, x1, x2,f0,f1,f2));
if abs(t1)>abs(t2) then
t=t1;
else
t=t2;
end
x=x0-2*gr(P,N,x0,1)/t;
x2=x1;
x1=x0;
x0=x;
f0=gr(P,N,x0,1);
f1=gr(P,N,x1,1);
f2=gr(P,N,x2,1);
end

279

280

Глава 6. Нелинейные уравнения и системы в Scilab

endfunction
//Функция нахождения всех корней полинома
function r=korni_polynom(P,N)
t=1;
mprintf("Корни полинома:\n");
while(N>1)
x=1;
x=Muller(P,N, x);
mprintf("x=%10.7f\n",x);
r(t)=x;
P=delenie_gorner(P,N,x)
N=N-1;
t=t+1;
end
endfunction
//Задание коэффициентов тестового полинома
H=[1 -35 280 -1350 1000];
//Вызов функции нахождения корней полинома
Y=korni_polynom(H,5);
//построение графика полинома
L=0:0.1:18;
for i=1:length(L)
M(i)=gr(H,5,L(i),1);
end
plot(L',M);
xgrid;
xtitle("График функции x^4 -35x^3+280x^2-1350x+1000","OX","OY");

Результат работы программы представлен в листинге 6.4. На рис. 6.6 показан график полинома.
Листинг 6.4. Результат работы программы
Корни полинома:
x= 0.9942249
x= 5.0000000
x=11.4743548
x=17.5314203

Задача 6.2
Написать программу нахождения действительных корней многочлена
P1 x n + P2 x n-1 +  + Pn x + Pn+1 = 0.
В качестве тестового будем использовать тот же многочлен.
x4 - 35x3 + 280x2 - 1350x + 1000 = 0
В этой программе будем использовать метод обратной параболы. Код программы приведён ниже. Результаты работы этой программы и программы
из задачи 6.1 совпадают.

6.1. Методы решения нелинейных уравнений

Рис. 6.6. График полинома x4 − 35x3 + 280x2 − 1350x + 1000 = 0

Листинг 6.5. Программа вычисления корней полинома
//Функция вычисления разделённой разности первого порядка
function y=razd(x1,x2,f1,f2)
y=(f2-f1)/(x2-x1);
endfunction
//Функция вычисления разделённой разности первого порядка
function y=razd2(x0,x1,x2,f0,f1,f2)
y=(razd(x1,x2,f1,f2)-razd(x0,x1,f0,f1))/(x0-x2);
endfunction
//Функция вычисления значения полинома в точке по схеме Горнера
function y0=gorner(P,N,x0)
y0=0;
for i=1:1:N
y0=P(i)+x0*y0;
end
endfunction
//Функция понижения порядка полинома с помощью
//процедуры синтетического деления.
function B=delenie_gorner(P,N,alfa)
B(1)=P(1);
for i=2:1:N
B(i)=B(i-1)*alfa+P(i);
end
endfunction
//Функция нахождения очередного корня полинома
//методом обратной параболы

281

282

Глава 6. Нелинейные уравнения и системы в Scilab

function [pr,x]=obr_parabol(P,N,x1,K)
x2=1.15*x1;
x0=0.85*x1;
pr=%t;
f0=gorner(P,N,x0);
f1=gorner(P,N,x1);
f2=gorner(P,N,x2);
i=0;
while abs(f2)>%eps
i=i+1;
a=((x2-x1)*(f1-f0)-(x1-x0)*(f2-f1))/((f2-f1)*(f1-f0)*(f2-f0));
b=-a*(f2+f1)+(x2-x1)/(f2-f1);
c=x2-a*f2*f2-b*f2;
x0=x1;
x1=x2;
x2=c;
f0=gorner(P,N,x0);
f1=gorner(P,N,x1);
f2=gorner(P,N,x2);
if i>K then
pr=%f;
break;
end
end
x=x2;
endfunction
//Функция нахождения всех корней полинома
function r=korni_obr_parabola(P,N)
t=1;
while(N>1)
x=1;
[fl,x]=obr_parabol(P,N,x,500);
if fl then
mprintf("x2=%e\n",x);
r(t)=x;
P=delenie_gorner(P,N,x)
t=t+1;
else
break;
end;
N=N-1;
end
endfunction
//Задание коэффициентов тестового полинома
H=[1 -35 280 -1350 1000];
//Вызов функции нахождения корней полинома
Yobr=korni_obr_parabola(H,5);
//Вывод корней
disp(Yobr);

6.2. Встроенные функции Scilab для решения нелинейных уравнений

283

На взгляд авторов, следует пользоваться именно методом парабол, а если
вам нужны только действительные корни, то следует избавиться от комплексных уже после нахождения всех корней.
Задачи решения нелинейных уравнений и систем не являются тривиальными. Написание программ решения нестандартных уравнений требует значительного опыта программирования. Рассмотрим возможности Scilab [2]
для решения подобных задач.

6.2 Встроенные функции Scilab для решения
нелинейных уравнений
6.2.1 Решение алгебраических уравнений
Решение алгебраического уравнения в Scilab состоит из двух этапов. Необходимо задать полином P(x) с помощью функции poly, а затем найти его корни,
применив функцию roots.
Итак, определение полиномов в Scilab осуществляет функция
poly(a, 'х', ['fl'])
где a – это число или мат­ри­ца чисел; x – символьная переменная; fl – необязательная символьная переменная, определяющая способ задания полинома. Символьная переменная fl может принимать только два значения – «roots» или «coeff» (соответственно, «r» или «c»). Если fl=c, то будет
сформирован полином с коэффициентами, хранящимися в параметре a. Если
же fl=r, то значения параметра a воспринимаются функцией как корни, для
которых необходимо рассчитать коэффициенты соответствующего полинома. По умолчанию fl=r.
Следующий пример отражает создание полинома p, имеющего в качестве
корня тройку, и полинома f с коэффициентом 3.
Листинг 6.6. Полиномы первой степени
-->p=poly(3,'x','r');
-->f=poly(3,'x','c');
-->p
p =
- 3 + x
-->f
f =
3

Далее приведены примеры создания более сложных полиномов.
Листинг 6.7. Использование функции poly
-->//Полином с корнями 1, 0 и 2
-->poly([1 0 2],'x')

284
ans

Глава 6. Нелинейные уравнения и системы в Scilab
=

2
3
2x - 3x + x
-->//Полином с коэффициентами 1, 0 и 2
-->poly([1 0 2],'x','c')
ans =
2
1 + 2x

Рассмотрим примеры символьных операций с полиномами.
Листинг 6.8. Примеры символьных операций с полиномами
-->p1=poly([-1 2],'x','c')
p1 =
- 1 + 2x
-->p2=poly([3 -7 2],'x','c')
p2 =
2
3 - 7x + 2x
-->p1+p2 //Сложение
ans =
2
2 - 5x + 2x
-->p1-p2 //Вычитание
ans =
2
4 + 9x - 2x
-->p1*p2 //Умножение
ans =
2
3
- 3 + 13x - 16x + 4x
-->p1/p2 //Деление
ans =
1
-----3 + x
-->p1^2 //Возведение в степень
ans =
2
1 - 4x + 4x
-->p2^(-1) //Возведение в отрицательную степень
ans =
1
----------2
3 - 7x + 2x

Функция roots(p) предназначена для решения алгебраического уравнения. Здесь p – это полином, созданный функцией poly и представляющий
собой левую часть уравнения P(x) = 0. Решим несколько алгебраических уравнений.

6.2. Встроенные функции Scilab для решения нелинейных уравнений

285

Задача 6.3
Найти корни полинома 2x 4 - 8x 3 + 8x 2 - 1 = 0.
Для решения этой задачи необходимо задать полином p. Сделаем это при
помощи функции poly, предварительно определив вектор коэффициентов V.
Обратите внимание, что в уравнении отсутствует переменная x в первой
степени, это означает, что соответствующий коэффициент равен нулю.
Листинг 6.9. Формирование полинома
-->V=[-1 0 8 -8 2];
-->p=poly(V,'x','c')
p =
2
3
4
1 + 8x - 8x + 2x

Теперь найдем корни полинома.
Листинг 6.10. Использование функции roots
-->X=roots(p)
X =
!
0.4588039
! - 0.306 5630
!
1.5411961
!
2.306563

!
!
!
!

Графическое решение задачи1,показанное на рис. 6.7, позволяет убедиться, что корни найдены верно.

Рис. 6.7. Графическое решение задачи 6.3

1

Графическим решением уравнения f(x) = 0 является точка пересечения линии f(x)
с осью абсцисс.

286

Глава 6. Нелинейные уравнения и системы в Scilab

Задача 6.4
Найти корни полинома x3 + 0.4x2 + 0.6x - 1 = 0.
Решение этой задачи аналогично решению предыдущей, разница заключается в способе вызова необходимых для этого функций.
Листинг 6.11. Решение задачи 6.4
-->roots(poly([-1 0.6 0.4 1],'x','c'))
ans =
!
0.7153636
!
! - 0.5576818 + 1.0425361i !
! - 0.5576818 - 1.0425361i !

Нетрудно заметить, что полином имеет один действительный (рис. 6.8)
и два комплексных корня.

Рис. 6.8. Графическое решение задачи 6.4

Задача 6.5
Найти решение уравнения y(x) = 0, если y(x) = x4 - 18x2 + 6.
Решение этой задачи представлено в листинге 6.12 и отличается от предыдущих лишь способом определения полинома. Графическое решение представлено на рис. 6.9.
Листинг 6.12. Решение задачи 6.5
-->x=poly(0,'x');
-->y=x^4-18*x^2+.6;
-->roots(y)
ans =
!
0.1827438 !

6.2. Встроенные функции Scilab для решения нелинейных уравнений

287

! - 0.1827438 !
! - 4.2387032 !
!
4.2387032 !

Рис. 6.9. Графическое решение задачи 6.5

6.2.2 Решение трансцендентных уравнений
Для решения трансцендентных уравнений в Scilab применяют функцию
fsolve(x0,f)
где x0 – начальное приближение; f – функция, описывающая левую часть
уравнения y(x) = 0.
Рассмотрим применение этой функции на примерах.
Задача 6.6
Найти решение уравнения
Определим интервал изоляции корня заданного уравнения. Воспользуемся
графическим методом отделения корней. Если выражение, стоящее в правой
части уравнения, представить в виде разности двух функций f(x) - g(x) = 0,
то абсцисса точки пересечения линий f(x) и g(x) – корень данного уравнения.
На рис. 6.10 видно, что корень
В нашем случае
данного уравнения лежит в интервале [0; 1].
Выберем ноль в качестве начального приближения, зададим функцию,
описывающую уравнение, и решим его.
Листинг 6.13. Решение задачи 6.6
-->deff('[y]=f1(x)','y1=((x-1)^2)^(1/3),y2=(x^2)^(1/3),y=y1-y2')
-->fsolve(0,f1)
ans =
0.5

288

Глава 6. Нелинейные уравнения и системы в Scilab

Рис. 6.10. Графическое решение задачи 6.6

Задача 6.7
Найти все корни уравнения f(x) = e x/5 - 2(x - 1)2.
На рис. 6.11 видно, что график функции f(x) трижды пересекает ось абс­
цисс, т. е. уравнение имеет три корня.

Рис. 6.11. Графическое решение задачи 6.7

Вызовем функцию fsolve, передавая в качестве первого параметра массив
значений начальных приближений корней уравнений, получим все решения
заданного уравнения.
Листинг 6.14. Решение задачи 6.7
function y=f(x)
y=exp(x)/5-2*(x-1)^2

6.2. Встроенные функции Scilab для решения нелинейных уравнений

289

end
x=fsolve([0 2 5],f)
for i=1:3
mprintf("x=%7.4f\n",x(i))
end
x= 0.5778
x= 1.7639
x= 5.1477

Задача 6.8
Найти решение уравнения y(x) = 0, если y(x) = x5 - x3 + 1.
Нетрудно заметить, что заданное уравнение – полином пятой степени,
который имеет один действительный корень (рис. 6.12).

Рис. 6.12. Графическое решение задачи 6.8

Решим эту задачу при помощи функции fsolve.
Листинг 6.15. Решение задачи 6.8
-->deff('[f]=y(x)','f=x^5-x^3+1')
-->X=fsolve(-2,y)
X = 1.2365057

Теперь применим функцию roots.
Листинг 6.16. Решение задачи 6.8 с использованием функции roots
-->roots(poly([1 0 0 -1 0 1],'x','c'))
ans =
!
0.9590477 + 0.4283660i !
!
0.9590477 - 0.4283660i !
! - 0.3407949 + 0.7854231i !
! - 0.3407949 - 0.7854231i !
! - 1.2365057
!

290

Глава 6. Нелинейные уравнения и системы в Scilab

Как видим, заданное уравнение, кроме действительного корня (лис­
тинг 6.15), имеет и мнимые (листинг 6.16). Поэтому для отыскания всех корней полинома лучше использовать функцию roots.

6.3

Решение систем нелинейных уравнений в Scilab

Если задано m уравнений с n неизвестными и требуется найти последовательность из n чисел, которые одновременно удовлетворяют каждому из
m уравнений, то говорят о системе уравнений. Для решения систем уравнений
в Scilab также применяют функцию fsolve(x0,f).
Задача 6.9
Решить систему уравнений:

Графическое решение системы (рис. 6.13) показывает, что она имеет две
пары корней.
Окружность и гипербола пересекаются в точках [0.8; 0.6] и [-0.8; -0.6]. Эти
значения приблизительны. Для того чтобы уточнить их, применим функцию
fsolve, предварительно определив систему с помощью файл-функции.
Листинг 6.17. Решение задачи 6.9
function [y]=fun(x)
y(1)=x(1)^2+x(2)^2-1;
y(2)=x(1)^3-x(2);
endfunction
fsolve([0.5 0.5],fun)
ans = 0.8260314
0.5636242
fsolve([-0.5 -0.5],fun)
ans = - 0.8260314 - 0.5636242

Рис. 6.13. Графическое решение системы уравнений

6.3. Решение систем нелинейных уравнений в Scilab

291

Задача 6.10
Исследовать систему из трёх нелинейных уравнений с тремя неизвестными:

Решение системы представлено ниже (листинг 6.18).
Листинг 6.18. Решение задачи 6.10
function [y]=fun(x)
y(1)=x(1)^2+x(2)^2+x(3)^2-1
y(2)=2*x(1)^2+x(2)^2-4*x(3)
y(3)=3*x(1)^2-4*x(2)+x(3)^2
endfunction
fsolve([0.5 0.5 0.5],fun)//решение системы
ans = !
0.7851969
0.4966114
0.3699228 !

Как видно из приведённых примеров решения систем нелинейных уравнений, вызов функции fsolve довольно прост. Самой большой сложностью
при решении систем нелинейных уравнений является выбор начального
приближения. Эта проблема выходит далеко за рамки книги, и авторы советуют интересующимся читателям подробно изучить данный вопрос в классической и современной литературе по численным методам [5, 6, 10].

Глава 7

Численное интегрирование
и дифференцирование
В данной главе рассмотрены численные алгоритмы интегрирования и дифференцирования, которые реализованы в функциях в Scilab. Также описаны
основные встроенные функции Scilab численного интегрирования и дифференцирования.

7.1

Основные методы численного интегрирования

Пусть дана функция f(x), известно, что она непрерывна на интервале [a, b] и уже
определена её первообразная F(x), тогда определённый интеграл от этой функции можно вычислить в пределах от a до b по формуле Ньютона–Лейбница:
(7.1)
На практике часто встречаются интегралы с первообразной, которая не
может быть выражена через элементарные функции или является слишком
сложной, что затрудняет или делает невозможным вычисления по формуле
Ньютона–Лейбница. Кроме того, нередко подынтегральная функция задаётся таблицей или графиком, и тогда понятие первообразной вообще теряет
смысл. В этом случае большое значение имеют численные методы интегрирования, основная задача которых заключается в вычислении значения определённого интеграла на основании значений подынтегральной функции.
Численное вычисление определённого интеграла называют механической
квадратурой. Формулы, соответствующие тому или иному численному методу приближённого интегрирования, называют квадратурными. Подобное
название связано с геометрическим смыслом определённого интеграла: значение определённого интеграла

равно площади криволинейной трапеции с основаниями [a, b] и f(x).

7.1. Основные методы численного интегрирования

293

7.1.1 Интегрирование по методу трапеций
Изложим геометрическую интерпретацию интегрирования по методу трапеций [1, 3, 5, 8]. Для этого участок интегрирования [a, b] разобьём точками
на n равных частей (рис. 7.1), причём x0 = a, xn = b.

Рис. 7.1. Геометрическая интерпретация метода трапеций

Тогда длина каждой части будет равна
а значение абсциссы каждой
из точек разбиения можно вычислить по формуле: xi = x0 + ih, i = 1, 2, …, n - 1.
Теперь из каждой точки xi проведём перпендикуляр до пересечения с кривой f(x), а затем заменим каждую из полученных криволинейных трапеций
прямоугольной. Приближённое значение интеграла будем рассматривать
как сумму площадей прямолинейных трапеций, причём площадь отдельной
трапеции составляет

следовательно, площадь искомой фигуры вычисляют по формуле:

Таким образом, получена квадратурная формула трапеций для численного
интегрирования:
(7.2)

7.1.2 Интегрирование по методу Симпсона
Идея интегрирования по методу Симпсона [1, 3, 5, 8] заключается в следующем. Пусть n = 2m – чётное число, а yi = f(xi ) (i = 0, 1, …, n) – значения функции
y = f(x) для равноотстоящих точек a = x0, x1, x2, …, xn = b с шагом

294

Глава 7. Численное интегрирование и дифференцирование

На паре соседних участков (рис. 7.2) кривая y = f(x) заменяется параболой
y = L(x), коэффициенты которой подобраны так, что она проходит через
точки Y0, Y1, Y2.

Рис. 7.2. Геометрическая интерпретация интегрирования
по методу Симпсона

Площадь криволинейной трапеции, ограниченной сверху параболой, составит:

Суммируя площади всех криволинейных трапеций, получим:

где p = 2 при чётном i и p = 4 при нечётном i.
Следовательно, формула Симпсона для численного интегрирования имеет
вид:
(7.3)
Методы трапеций и Симпсона являются частными случаями квадратурных
формул Ньютона–Котеса [1, 3, 5, 8], которые, вообще говоря, имеют вид:

где Hi – это некоторые константы, называемые постоянными Ньютона–Котеса. Если для квадратурных формул Ньютона–Котеса принять n = 1, то получим метод трапеций, а при n = 2 – метод Симпсона. Поэтому эти методы
называют квадратурными методами низших порядков. Для n > 2 получают

7.1. Основные методы численного интегрирования

295

квадратурные формулы Ньютона–Котеса высших порядков. При n = 3 квадратурная формула Ньютона–Котеса имеет вид [1]:

Эта формула носит название квадратурной формулы Ньютона, или правила
трёх восьмых. Более подробно о квадратурных формулах Ньютона–Котеса
можно прочитать в [1].
При вычислении интеграла любым из вышеперечисленных методов возникает вопрос: насколько точно был вычислен интеграл? Для ответа на этот
вопрос можно воспользоваться правилом Рунге [5].

7.1.3 Правило Рунге оценки точности интегрирования
Необходимо вычислить определённый интеграл от функции f(x) на интервале
[a; b]. Для этого участок интегрирования [a, b] разобьём точками на n равных
частей, причём x0 = a; xi = x0 + ih, i = 1, 2, …, n - 1; xn = b.
Вычислим интеграл на интервале [xi; xi+1] c шагом h и обозначим [10]

где Ih,i – любая из рассмотренных ранее квадратурных формул; Ri = Ci hk +
O(kk+1) – ошибка квадратурной формулы на интервале [xi; xi+1]; k – порядок
точности формулы численного интегрирования (k = 1 – для метода прямоугольников, k = 2 – в случае метода трапеций, k = 4 – при использовании
метода Симпсона).
Вычислим этот же интеграл на интервале [xi; xi+1] c шагом и обозначим
Ih/2,i. Оценку точности интегрирования на интервале [xi; xi+1] (с помощью любой квадратурной формулы) можно провести с помощью правила Рунге [5,
8, 10].
Если
(7.4)
то вычисления на этом интервале прекращаем. Иначе уменьшаем шаг вдвое
и повторяем вычисления до тех пор, пока неравенство не будет выполнено.

7.1.4 Квадратурные формулы Гаусса и Чебышёва
На практике высокую точность интегрирования обеспечивают квадратурные
формулы Гаусса и Чебышёва.
Квадратурная формула Гаусса численного интегрирования имеет вид [1]:
(7.5)

296

Глава 7. Численное интегрирование и дифференцирование

На практике эта формула используется при n = 2, 3, 4, 5, 6, 7, 8, значения
коэффициентов представлены в табл. 7.1.
Таблица 7.1. Значения ti и Ai для квадратурной формулы Гаусса
n
2
3
4
5
6
7
8

Массив t
-0.57735027, 0.57735027
-0.77459667, 0, 0.77459667
-0.86113631, -0.33998104, 0.33998104,
0.86113631
-0.90617985, -0.53846931, 0, 0.53846931,
0.90617985
-0.93246951, -0.66120939, -0.23861919,
0.23861919, 0.66120939, 0.93246951
-0.94910791, -0.74153119, -0.40584515,
0, 0.40584515, 0.74153119, 0.94910791
-0.96028986, -0.79666648, -0.52553242,
-0.18343464, 0.18343464, 0.52553242,
0.79666648, 0.96028986

Массив A
1, 1
5/9, 8/9, 5/9
0.34785484, 0.65214516, 0.65214516,
0.34785484
0.23692688, 0.47862868, 0.568888889,
0.47862868, 0.23692688
0.17132450, 0.36076158, 0.46791394,
0.46791394, 0.36076158, 0.17132450
0.12948496, 0.27970540, 0.38183006,
0.41795918, 0.38183006, 0.27970540,
0.12948496
0.10122854, 0.22238104, 0.31370664,
0.36268378, 0.36268378, 0.31370664,
0.22238104, 0.10122854

Квадратурная формула Чебышёва численного интегрирования имеет вид [1]:
(7.6)
На практике формула Чебышёва используется при n = 2, 3, 4, 5, 6, 7, 9, значения коэффициентов представлены в табл. 7.2.
Таблица 7.2. Значения ti для квадратурной формулы Чебышёва
n
2
3
4
5
6
7
9

Массив t
-0.577350, 0.577350
-0.707107, 0, -0.707107
-0.794654, -0.187592, 0.187592, 0.794654
0.832498, -0.374541, 0, 0.374541, 0.832498
-0.866247, -0.422519, -0.266635, 0.266635, 0.422519, 0.866247
-0.883862, -0.529657, -0.323912, 0, 0.323912, 0.529657, 0.883862
-0.911589, -0.601019, -0.528762, -0.167906, 0, 0.167906, 0.528762, 0.601019,
0.911589

Рассмотрим реализацию описанных выше квадратурных формул (методы
трапеций и Симпсона, формулы Гаусса и Чебышёва) в Scilab (см. листинг 7.1)
на примере вычисления определённого интеграла

7.1. Основные методы численного интегрирования

Листинг 7.1. Функции вычисления определённого интеграла
function y=f(x)
// подынтегральная функция
y=x.^2/sqrt(3+sin(x))
endfunction
//Вычисление интеграла методом трапеций см. (7.2)
function integral=trap(a,b,n)
//[a;b] - интервал интегрирования,
//n - количество участков.
h=(b-a)/n;
integral=(f(a)+f(b))/2;
for i=1:n-1
integral=integral+f(a+i*h)
end
integral=integral*h;
endfunction
//вычисление интеграла методом трапеций с заданной точностью eps
//Оценка точности проводится по правилу Рунге (7.4) для
//метода трапеций
function [k,integral]=trap2(a,b,eps)
//[a;b] - интервал интегрирования,
//eps - точность интегрирования.
//Функция возвращает
//k - количество итераций для достижения точности
//integral - значение интеграла с точностью eps
n=5;
Ih=trap(a,b,n);
tochnost=100*eps;
k=1;
while tochnost>eps
Ih2=trap(a,b,2*n);
tochnost=abs(Ih-Ih2)/3;
k=k+1;
n=2*n;
Ih=Ih2;
end
integral=Ih2;
endfunction
//Вычисление интеграла методом Симпсона
function integral=simpson(a,b,m)
//[a;b] - интервал интегрирования,
//2*n - количество участков, число интервалов должно быть чётным.
n=2*m
h=(b-a)/n;
integral=f(a)+f(b);
p=4;

297

298

Глава 7. Численное интегрирование и дифференцирование

for i=1:n-1
integral=integral+p*f(a+i*h)
//p - меняющийся коэффициент в формуле 4,2,4,2,....
p=6-p;
end
integral=integral*h/3;
endfunction
//вычисление интеграла методом трапеций с заданной точностью eps
//Оценка точности проводится по правилу Рунге (7.4) для метода
//Симпсона
function [k,integral]=simpson2(a,b,eps)
//[a;b] - интервал интегрирования,
//eps - точность интегрирования.
//Функция возвращает
//k - количество итераций для достижения точности
//integral - значение интеграла с точностью eps
n=3;
Ih=simpson(a,b,n);
tochnost=100*eps;
k=1;
while tochnost>eps
Ih2=simpson(a,b,2*n);
tochnost=abs(Ih-Ih2)/15;
k=k+1;
Ih=Ih2;
n=2*n;
end
integral=Ih2;
endfunction
//Интегрирование по формуле Гаусса (7.5) при n=8
function integral=gauss(a,b)
t=[-0.96028986, -0.79666648, -0.52553242, -0.18343464,..
0.18343464, 0.52553242, 0.79666648, 0.96028986];
A=[0.10122854, 0.22238104, 0.31370664, 0.36268378, 0.36268378,..
0.31370664, 0.22238104, 0.10122854];
integral=0;
for i=1:length(t)
integral=integral+A(i)*f((a+b)/2+(a-b)/2*t(i))
end
integral=integral*(b-a)/2;
endfunction
//Интегрирование по формуле Чебышёва (7.6) при n=9
function integral=chebishev(a,b)
t=[-0.911589, -0.601019, -0.528762, -0.167906, 0, 0.167906,..
0.528762, 0.601019, 0.911589]
integral=0;
for i=1:length(t)
integral=integral+f((a+b)/2+(a-b)/2*t(i))
end

299

7.2. Встроенные функции интегрирования Scilab
integral=integral*(b-a)/length(t);
endfunction

//Интервал интегрирования
a=0;
b=1;
//Точность интегирования
eps=1D-9
[m,integra]=trap2(a,b,eps)
mprintf("Точность интегрирования =%14.12le\n",eps);
mprintf("Метод трапеций, интеграл=%14.12le\t сделано %d шагов\n",... integra,m);
mprintf("Точность интегрирования =%14.12le\n",eps); [m,integra]=simpson2(a,b,eps)
mprintf("Метод Симпсона, интеграл=%14.12le\t сделано %d шагов\n",... integra,m);
integra=gauss(a,b)
mprintf("Метод Гаусса, интеграл=%14.12le\n",integra); integra=chebishev(a,b)
mprintf("Метод Чебышёва, интеграл=%14.12lf\n",integra);

Результат работы программы представлен ниже.
Листинг 7.2. Результат работы программы вычисления определённого интеграла
Точность интегрирования =1.000000000000e-09
Метод трапеций, интеграл=1.741192413368e-01
Точность интегрирования =1.000000000000e-09
Метод Симпсона, интеграл=1.741192413296e-01
Метод Гаусса, интеграл=1.741192417391e-01
Метод Чебышёва, интеграл=0.174119240869

7.2

сделано 12 шагов
сделано 4 шага

Встроенные функции интегрирования Scilab

В Scilab численное интегрирование по методу трапеций реализовано с помощью функции inttrap([x,]y). Эта функция вычисляет площадь фигуры под
графиком функции y(x), которая описана набором точек (x, y). Параметр x
является необязательным. Для функции inttrap(y) элементы вектора x принимают значения номеров элементов вектора y.
Задача 7.1
Вычислить определённый интеграл

Этот интеграл легко сводится к табличному
этому вычислить его по формуле Ньютона–Лейбница не составит труда:
Листинг 7.3. Точное решение задачи 7.1
-->a=5;b=13;
-->I=1/3*(2*b-1)^(3/2)-1/3*(2*a-1)^(3/2)
I = 32.666667

по-

300

Глава 7. Численное интегрирование и дифференцирование

Теперь применим для отыскания заданного определённого интеграла метод трапеций. Рассмотрим несколько вариантов решения данной задачи, используя функцию inttrap. В первом случае интервал интегрирования делится на отрезки с шагом 1, во втором – 0.5 и в третьем – 0.1. Нетрудно заметить,
что чем больше точек разбиения, тем точнее значение искомого интеграла.
Листинг 7.4. Приближённое решение задачи 7.1 с использованием функции
inttrap
-->x=a:b;y=sqrt(2*x-1);
-->inttrap(x,y)
ans =
32.655571
-->h=0.5; x=a:h:b; y=sqrt(2*x-1);
-->inttrap(x,y)
ans =
32.66389
-->h=0.1; x=a:h:b; y=sqrt(2*x-1);
-->inttrap(x,y)
ans =
32.666556

Вычислительный алгоритм квадратурных формул реализован в Scilab
функцией
integrate(fun, x, a, b, [,er1 [,er2]])
где fun – функция, задающая подынтегральное выражение в символьном
виде; x – переменная интегрирования, также задаётся в виде символа; a, b –
пределы интегрирования, действительные числа; er1 и er2 – параметры,
отражающие абсолютную и относительную точности вычислений (действительные числа). Рассмотрим решение задачи 7.1 с использованием функции
integrate.
Листинг 7.5. Использование функции integrate
-->integrate('(2*x-1)^0.5','x',5,13)
ans =
32.666667

Наиболее универсальной командой интегрирования в Scilab является
[I,err]=intg(a, b, name [,er1 [,er2]])
где I – результат интегрирования; err – погрешность вычислений; name –
имя функции, задающей подынтегральное выражение (здесь функция может
быть задана в виде набора дискретных точек (как таблица) или с помощью
внешней функции); a и b – пределы интегрирования; er1 и er2 – абсолютная
и относительная точности вычислений (необязательные параметры).
Рассмотрим решение задачи 7.1 с использованием функции intg (лис­
тинг 7.6).

7.3. Численное дифференцирование в Scilab

301

Листинг 7.6. Использование функции intg
-->deff('y=G(x)','y=sqrt(2*x-1)'); intg(5,13,G)
ans =
32.666667

Задача 7.2
Вычислить интеграл
Численное решение интеграла показано в листинге 7.7.
Листинг 7.7. Решение задачи 7.2
-->function y=f(t),y=t^2/sqrt(3+sin(t)),endfunction;
-->[I,er]=intg(0,1,f)
er = 1.933D-15
I =
0.1741192

7.3

Численное дифференцирование в Scilab

Идея численного дифференцирования заключается в том, что функцию y(x),
заданную в равноотстоящих точках xi (i = 0, 1, …, n) отрезка [a, b] с помощью
значений yi = f(xi), приближённо заменяют интерполяционным полиномом
Ньютона, построенным для системы узлов x0, x1, …, xk (k £ n), и вычисляют
производные y¢ = f ¢(x), y² = f ²(x) и т. д. [2].
(7.7)
На практике приближённое дифференцирование применяют в основном
для функций, заданных в виде таблицы.
В Scilab численное дифференцирование реализовано командой
dy=diff(y[,n]), где y – значения функции y(x) в виде вектора вещественных
чисел; n – порядок дифференцирования. Результат работы функции – вектор
вещественных чисел dy, представляющий собой разности порядка n интерполяционного полинома Ньютона ∆y, ∆2 y, …, ∆k y. Рассмотрим работу функции
на примере.
Задача 7.3
Найти y¢(50), y¢(52), y¢(54) функции y = lg(x), заданной в виде таблицы.
Программа решения данной задачи с комментариями представлена в лис­
тинге 7.8.

302

Глава 7. Численное интегрирование и дифференцирование

Листинг 7.8. Использование функции diff
h=2;x=50:2:60;
y=log10(x)
mprintf("Массив значений у\n");
for i=1:length(y)
mprintf("%lf, ",y(i))
end
mprintf("\n");
//Вычисление массива разделённых разностей первого порядка
dy=diff(y)
mprintf("Массив разделённых разностей первого порядка\n");
for i=1:length(dy)
mprintf("%lf, ",dy(i))
end
mprintf("\n");
//Вычисление массива разделённых разностей второго порядка
dy2=diff(y,2)
mprintf("Массив разделённых разностей второго порядка\n");
for i=1:length(dy2)
mprintf("%lf, ",dy2(i))
end
mprintf("\n");
//Вычисление массива разделённых разностей третьего порядка
dy3=diff(y,3)
mprintf("Массив разделённых разностей третьего порядка\n");
for i=1:length(dy3)
mprintf("%lf, ",dy3(i))
end
mprintf("\n");
//Приближённое значение y'(50),y'(52),y'(54) по формуле (7.7)
for i=1:3
//Учёт одного слагаемого
Y1(i)=dy(i)/h
//Учёт двух слагаемых
Y2(i)=(dy(i)-dy2(i)/2)/h
//Учёт трёх слагаемых
Y3(i)=(dy(i)-dy2(i)/2+dy3(i)/3)/h
//Точное значение производной
//Значение y'(50),y'(52), y'(54) для lg'(x)=1/ln(10)/x
Y(i)=1/log(10)/x(i)
mprintf("Y1=%lf, Y2=%lf, Y3=%lf, Y=%lf\n",Y1(i), Y2(i), Y3(i),.. Y(i));
end

Результаты работы программы представлены в листинге 7.9. Как видно из
результатов, для вычисления производной в данном случае вполне достаточно трёх слагаемых формулы (7.7).
Листинг 7.9. Вычисление производной функции lgx в точках 50, 52, 54 с помощью
функции diff
1.698970, 1.716003, 1.732394, 1.748188, 1.763428, 1.778151,
Массив разделённых разностей первого порядка
0.017033, 0.016390, 0.015794, 0.015240, 0.014723,

7.3. Численное дифференцирование в Scilab

303

Массив разделённых разностей второго порядка
-0.000643, -0.000596, -0.000554, -0.000517,
Массив разделённых разностей третьего порядка
0.000047, 0.000042, 0.000038,
Y1=0.008517, Y2=0.008677, Y3=0.008685, Y=0.008686
Y1=0.008195, Y2=0.008344, Y3=0.008351, Y=0.008352
Y1=0.007897, Y2=0.008036, Y3=0.008042, Y=0.008042

Более универсальной командой дифференцирования является команда
g=numderivative(fun,x)
Здесь fun – имя функции, задающей выражение для дифференцирования.
Функция должна быть задана в виде y=fun(x [, p1, p2, ..., pn]), где x – переменная, по которой будет проводиться дифференцирование.
Если параметры p1, p2, ..., pn присутствуют в описании функции, то они
должны быть обязательно определены при вызове, например так:
g=numderivative(list(fun,p1,p2,...pn),x)
Результат работы функции – мат­ри­ца

Рассмотрим решение задачи 7.3 с помощью функции numderivative. Лис­
тинг 7.10 содержит программу решения данной задачи, а листинг 7.11 – результаты её работы.
Листинг 7.10. Программа решения задачи 7.3 с помощью функции numderivative
function y=f(x)
y=log10(x)
endfunction
X=[50 52 54]
G=numderivative(f,X);
disp(G);
for i=1:length(X)
g(i)=G(i,i)
end
mprintf("Вычисленные значения производной в точках\n");
for i=1:length(X)
mprintf("df/dx(%lf)=%lf\t",X(i),g(i))
end

Листинг 7.11. Решение задачи 7.3 с помощью функции numderivative
0.0086859
0.
0.
0.
0.0083518
0.
0.
0.
0.0080425
Вычисленные значения производной в точках
df/dx(50.0)=0.008686 df/dx(52.0)=0.008352 df/dx(54.0)=0.008042

304

Глава 7. Численное интегрирование и дифференцирование

В завершение этой главы решим следующую задачу с использованием
функции numderivative.
Задача 7.4
Задана функция многих переменных y(x1, x2, x3) = x1x2x + x12 x3. Вычислить
3

в точке (1, 2, 3).

Программа решения задачи представлена в листинге 7.12. Результаты работы программы – в листинге 7.13.
Листинг 7.12. Решение задачи 7.4
//Исходная функция
function Y=f(X)
Y=X(1)*X(2)^X(3)+X(1)^2*X(3)
endfunction
//Функция частных производных
function Y=f1(X)
Y(1)=X(2)^X(3)+2*X(1)*X(3)
Y(2)=X(1)*X(3)*X(2)^(X(3)-1)
Y(3)=X(1)*X(2)^X(3)*log(X(2))+X(1)^2
endfunction
X=[1 2 3];
//Вычисление частных производных функции f
//в точке (1,2,3) с помощью функции
//numderivative
G=numderivative(f,X)
mprintf("Частные производные функции f в точке (1,2,3),\n");
mprintf("найденные с помощью функции numderivative\n");
for i=1:length(X)
mprintf("%lf\t",G(i))
end
mprintf("\n");
//Вычисление точного значения частных производных
//функции f в точке (1,2,3) g=f1(X)
mprintf("Точные значения частных производных функции f\n");
mprintf("в точке (1,2,3)\n");
for i=1:length(X)
mprintf("%lf\t",g(i))
end
mprintf("\n");

Листинг 7.13. Результаты решения задачи 7.4
Частные производные функции f в точке (1,2,3),
найденные с помощью функции numderivative
14.000000 12.000000 6.545177
Точные значения частных производных функции f
в точке (1,2,3)
14.000000 12.000000 6.545177

7.4. Примеры решения некоторых задач

7.4

305

Примеры решения некоторых задач

Задача 7.5
Найти производную от функции вида f(x) = a0 + a1 · x + a2 · x2 + ... + an · xn.
Чтобы найти производную от функции вида f(x) = a0 + a1 · x + a2 · x2 + ... +
an · xn, представляющую собой полином (многочлен), применяют команду
derivat(p), где p – полином, определённый ранее.
//Найти первую и вторую производные
//f(x)=x^4-3x^2+1
p=poly([1 0 -3 0 1],'x','c');
p1=derivat(p)
p2=derivat(p1)
disp(p,p1,p2)
//Найти первую и вторую производные
//f(x)=(3x-2)/(x^2+1)
u=poly([-2 3],'x','c');
v=poly([1 0 1],'x','c');
P=u/v
P1=derivat(P)
P2=derivat(P1)
disp(P,P1,P2)
//Результат работы программы
2
-6 +12x
3
-6x +4x
2 4
1 -3x +x
2
3
4
5
4 - 18x - 8x - 12x - 12x + 6x
-----------------------------2
4
6
8
1 + 4x + 6x + 4x + x
2
3 + 4x - 3x
-----------2
4
1 + 2x + x
-2 + 3x
-------2
1 + x

306

Глава 7. Численное интегрирование и дифференцирование

Задача 7.6
Построить касательную к графику функции
x0 = -1.
Решение задачи представлено в листинге 7.14 и на рис. 7.3.
Листинг 7.14. Результаты решения задачи 7.6
clf
clear
function y=f(x)
y=exp(x)/5-2*(x-1)^2
endfunction
function y=f1(x,X0)
y=f(X0)+numderivative(f,X0)*(x-X0)
endfunction
x0=-1;
t=-3:0.1:3
plot(t,f(t),t,f1(t,x0),x0,f(x0),'o')
xgrid

Рис. 7.3. Решение задачи 7.6

в точке

307

7.4. Примеры решения некоторых задач

Задача 7.7
Оценить ошибку вычисления функции
7.45 ± 0.01, t = 0.7854 ± 0.0001.

при a = 28.3 ± 0.02, b =

Абсолютная погрешность функции y для малых D(xi) вычисляется по формуле:

В нашем случае формула имеет вид:

Относительную погрешность вычислим по формуле:

Листинг 7.15. Решение задачи 7.7
clear
a=28.3;Da=0.02;b=7.45;Db=0.01;t=0.7854;Dt=0.0001;
X=[a b t];D=[Da Db Dt]
function [Y]=F(x)
Y=(x(1)^2+x(2)^3)/cos(x(3))
end
U=numderivative(F,X)
DF=sum(U.*D)
dF=DF/F(X)
disp('Относительная погрешность',dF)
disp('Абсолютная погрешность',DF)
//Результат работы программы
"Относительная погрешность"
0.0024033
"Абсолютная погрешность"
4.1274094

Задача 7.8
Найти площадь фигуры, ограниченной линиями y = f(x), x = π/7, x = π/3.
Решение задачи представлено в листинге 7.16 и на рис. 7.4.

308

Глава 7. Численное интегрирование и дифференцирование

Листинг 7.16. Решение задачи 7.8
clear clf;
function y=f(x)
y=1./((1+sin(x)-cos(x)).^2)
endfunction
a=%pi/7;b=%pi/3;h=0.01
t=a:h:b;
plot2d3(t,f(t))
plot2d(t,f(t))
//Площадь фигуры, ограниченной
//кривой f(x) на отрезке [a;b]
S=intg(a,b,f)
//Преобразование вещественного
//числа в строку символов
S1=string(S)
xset("font",0,3)
xstring(0.5,3,["Площадь фигуры S = ", S1],0,1)

Рис. 7.4. Результаты решения задачи 7.8

Глава 8

Решение обыкновенных
дифференциальных уравнений
и систем

Дифференциальные уравнения и системы описывают многие динамические
процессы и возникают при решении различных задач физики, электротехники, химии и других наук. Данная глава посвящена численному решению
дифференциальных уравнений и систем средствами Scilab.

8.1 Общие сведения о дифференциальных
уравнениях
Дифференциальным уравнением n-го порядка называется соотношение вида
H(t, x, x¢, x², …, x(n) ) = 0.

(8.1)

Решением дифференциального уравнения называется функция x(t), которая
обращает уравнение в тождество.
Системой дифференциальных уравнений n-го порядка называется система
вида

(8.2)

310

Глава 8. Решение обыкновенных дифференциальных уравнений и систем

Системой линейных дифференциальных уравнений называется система
вида

(8.3)

Решением системы называется вектор

который обращает

уравнения систем (8.2), (8.3) в тождества.
Каждое дифференциальное уравнение, так же как и система, имеет бесконечное множество решений, которые отличаются друг от друга константами. Для однозначного определения решения необходимо определить дополнительные начальные или граничные условия. Количество таких условий
должно совпадать с порядком дифференциального уравнения или системы.
В зависимости от вида дополнительных условий в дифференциальных уравнениях различают:
zz

задачу Коши, в случае если все дополнительные условия заданы в одной
(чаще начальной) точке интервала;

zz

краевую задачу, в случае когда дополнительные условия заданы на границах интервала.

Различают точные (аналитические) и приближённые (численные) методы
решения дифференциальных уравнений. Большое количество уравнений
может быть решено точно. Однако есть уравнения, а особенно системы уравнений, для которых нельзя записать точное решение. Но даже для уравнений
с известным аналитическим решением очень часто необходимо вычислить
числовое значение при определённых исходных данных. Поэтому широкое
распространение получили численные методы решения обыкновенных дифференциальных уравнений.

8.2 Численные методы решения
дифференциальных уравнений
Численные методы решения дифференциального уравнения первого порядка будем рассматривать для следующей задачи Коши. Найти решение
дифференциального уравнения:
x¢ = f(x, t),

(8.4)

311

8.2. Численные методы решения дифференциальных уравнений

удовлетворяющего начальному условию
x(t0 ) = x0.

(8.5)

Иными словами, требуется найти интегральную кривую x = x(t), проходящую через заданную точку M0(t0, x0) (рис. 8.1).

Рис. 8.1. Интегральная кривая, проходящая через точку M0(t0, x0 )

Для дифференциального уравнения n-го порядка
x(n) = f(t, x, x¢, x², …, x(n-1))

(8.6)

задача Коши состоит в нахождении решения x = x(t ), удовлетворяющего
уравнению (8.6) и начальным условиям
x(t0 ) = x0, x¢(t0 ) = x¢0, …, x(n-1)(t0 ) = x0(n-1).

(8.7)

Рассмотрим основные численные методы решения задачи Коши [8, 3].

8.2.1 Решение дифференциальных уравнений методом Эйлера
При решении задачи Коши (8.3), (8.4) на интервале [t0, tn], выбрав достаточно
малый шаг h, построим систему точек
(8.8)
Для вычисления значения функции в точке t1 разложим функцию x = x(t)
в окрестности точки t0 в ряд Тейлора [8]:
(8.9)
При достаточно малом значении h членами выше второго порядка можно
пренебречь, и с учётом x¢(t0) = f(x0, t0) получим следующую формулу для вычисления приближённого значения функции x(t) в точке t1:
x1 = x0 + hf(x0, t0).

(8.10)

312

Глава 8. Решение обыкновенных дифференциальных уравнений и систем

Рассматривая найденную точку (x1, t1) как начальное условие задачи Ко­
ши, запишем аналогичную формулу для нахождения значения функции x(t)
в точке t2:
x2 = x1 + hf(x1, t1).
Повторяя этот процесс, сформируем последовательность значений xi в точках ti по формуле [8, 3]:
xi+1 = xi + hf(xi, ti ), i = 0, 1, …, n - 1.

(8.11)

Процесс нахождения значений функции xi в узловых точках ti по формуле
(8.11) называется методом Эйлера. Геометрическая интерпретация метода
Эйлера состоит в замене интегральной кривой x(t) ломаной M0, M1, M2, …, Mn
с вершинами Mi(xi, yi ). Звенья ломаной Эйлера Mi Mi+1 в каждой вершине Mi
имеют направление yi = f(ti, xi ), совпадающее с направлением интегральной
кривой x(t), проходящей через точку Mi (рис. 8.2). Последовательность ломаных Эйлера при h → 0 на достаточно малом отрезке [xi, xi + h] стремится
к искомой интегральной кривой.

Рис. 8.2. Геометрическая интерпретация метода Эйлера

На каждом шаге решение x(t) определяется с ошибкой за счёт отбрасывания членов ряда Тейлора выше первой степени, что в случае быстро меняющейся функции f(t, x) может привести к быстрому накапливанию ошибки.
В методе Эйлера следует выбирать достаточно малый шаг h.

8.2.2 Решение дифференциальных уравнений при помощи
модифицированного метода Эйлера
Более точным методом решения задачи (8.3)–(8.4) является модифицированный метод Эйлера, при котором сначала вычисляют промежуточные значения [8]:
(8.12)
после чего находят значение xi+1 по формуле
xi+1 = xi + hf(xp, tp ), i = 0, 1, …, n - 1.

(8.13)

8.2. Численные методы решения дифференциальных уравнений

313

8.2.3 Решение дифференциальных уравнений методами
Рунге–Кутта
Рассмотренные выше методы Эйлера (как обычный, так и модифицированный) являются частными случаями явного метода Рунге–Кутта k-го порядка. В общем случае формула вычисления очередного приближения методом
Рунге–Кутта имеет вид [8]:
xi+1 = xi + hφ(ti, xi, h), i = 0, 1, …, n - 1.

(8.14)

Функция φ(t, x, h) приближает отрезок ряда Тейлора до k-го порядка и не
содержит частных производных f(t, x) [8].
Метод Эйлера является методом Рунге–Кутта первого порядка (k = 1) и получается при φ(t, x, h) = f(t, x).
Семейство методов Рунге–Кутта второго порядка имеет вид [8]:
(8.15)

Два наиболее известных среди методов Рунге–Кутта второго порядка [8] –
это метод Хойна (α = ) и модифицированный метод Эйлера (α = 1).
Подставив α = в формулу (8.15), получаем расчётную формулу метода
Хойна [8]:

Подставив α = 1 в формулу (8.15), получаем расчётную формулу уже рассмотренного выше модифицированного метода Эйлера:

Наиболее известным является метод Рунге–Кутта четвёртого порядка,
расчётные формулы которого можно записать в виде [8]:

Одной из модификаций метода Рунге–Кутта является метод Кутта–Мерсона (или пятиэтапный метод Рунге–Кутта четвёртого порядка), который
состоит в следующем [8].

314

Глава 8. Решение обыкновенных дифференциальных уравнений и систем

1. На i-м шаге рассчитываются коэффициенты

(8.16)

2. Вычисляем приближённое значение x(ti+1) по формуле
(8.17)
3. Вычисляем приближённое значение x(ti+1) по формуле
(8.18)
4. Вычисляем оценочный коэффициент по формуле
R = 0.2|xi+1 - x̃ i+1|.

(8.19)

5. Сравниваем R с точностью вычислений ε. Если R ³ ε, то уменьшаем шаг
вдвое и возвращаемся к п. 1. Если R < ε, то значение, вычисленное по
формуле (8.18), и будет вычисленным значением x(ti+1)(с точностью ε).
6. Перед переходом к вычислению следующего значения x сравниваем R
с . Если R < , то дальнейшие вычисления можно проводить с удвоенным шагом h = 2h.
Рассмотренные методы Рунге–Кутта относятся к классу одношаговых методов, в которых для вычисления значения в очередной точке xk+1 нужно
знать значение в предыдущей точке xk.
Ещё один класс методов решения задачи Коши – многошаговые методы,
в которых используются точки xk-3, xk-2, xk-1, xk для вычисления xk+1. В многошаговых методах первые четыре начальные точки (t0, x0 ), (t1, x1), (t2, x2), (t3, x3)
должны быть получены заранее любым из одношаговых методов (метод Эйлера, Рунге–Кутта и т. д.). Наиболее известными многошаговыми методами
являются методы прогноза-коррекции Адамса и Милна.

8.2.4 Решение дифференциальных уравнений методом
прогноза-коррекции Адамса
Рассмотрим решение уравнения (8.3), (8.4) на интервале [ti, ti+1]. Будем считать, что решение в точках t0, t1, t2, …, ti уже найдено, и значения в этих точках
будем использовать для нахождения значения x(ti+1 ).

8.2. Численные методы решения дифференциальных уравнений

315

Проинтегрируем уравнение (8.4) на интервале [ti, ti+1] и получим соотношение [8]
(8.20)
При вычислении интеграла, входящего в (8.20), вместо функции f(t, x(t))
будем использовать интерполяционный полином Лагранжа, построенный
по точкам (ti-3, xi-3), (ti-2, xi-2), (ti-1, xi-1), (ti, xi). Подставив полином Лагранжа
в (8.20), получаем первое приближение (прогноз) x̃ i+1 для значения функции
в точке ti+1
(8.21)
Как только x̃ i+1 вычислено, его можно использовать. Следующий полином
Лагранжа для функции f(t, x(t)) построим по точкам (ti-2, xi-2), (ti-1, xi-1), (ti, xi )
и новой точке (ti+1, x̃ i+1), после чего подставляем его в (9.20) и получаем второе
приближение (корректор):
(8.22)
Таким образом, для вычисления значения x(ti+1) методом Адамса необходимо последовательно применять формулы (8.21), (8.22), а первые четыре
точки можно получить методом Рунге–Кутта.

8.2.5 Решение дифференциальных уравнений методом Милна
Отличие метода Милна от метода Адамса состоит в использовании в качестве
интерполяционного полинома Ньютона.
Подставив в (8.20) вместо функции f(t, x(t)) интерполяционный полином
Ньютона, построенный по точкам (tk-3, xk-3), (tk-2, xk-2), (tk-1, xk-1), (tk, xk ), получаем первое приближение – прогноз Милна x̃ k+1 для значения функции в точке
tk+1 [8]:
(8.23)
Следующий полином Ньютона для функции f(t, x(t)) построим по точкам
(tk-2, xk-2), (tk-1, xk-1), (tk, xk) и новой точке (tk+1, x̃ k+1), после чего подставляем его
в (8.22) и получаем второе приближение – корректор Милна [8]:
(8.24)

316

Глава 8. Решение обыкновенных дифференциальных уравнений и систем

В методе Милна для вычисления значения x(tk+1) необходимо последовательно применять формулы (8.23), (8.24), а первые четыре точки можно
получить методом Рунге–Кутта.
Существует модифицированный метод Милна. В нём сначала вычисляется
первое приближение по формуле (8.23), затем вычисляется управляющий
параметр [8]
(8.25)
после чего вычисляется значение второго приближения – корректор Милна
по формуле
(8.26)
В модифицированном методе Милна первые четыре точки можно получить методом Рунге–Кутта, а для вычисления значения x(tk+1) необходимо
последовательно применять формулы (8.23), (8.25), (8.26).
Рассмотрим использование приведённых выше методов на примере решения следующей задачи Коши.
Задача 8.1
Решить задачу Коши
(8.27)

Известно точное решение задачи:

В листинге 8.1 представлено решение задачи 8.1 методами:
z z модифицированным методом Эйлера;
z z Рунге–Кутта;
z z Кутта–Мерсона;
z z Адамса;
z z Милна.
Графическое решение задачи представлено на рис. 8.3.

8.2. Численные методы решения дифференциальных уравнений

Рис. 8.3. Графическое решение задачи 8.1

Листинг 8.1. Решение задачи 8.1
//Точное решение
function q=fi(x)
q=119/296*exp(6*x)+1/24*(52*x.^3+114*x.^2-30*x+39)6*sin(x)/37-cos(x)/37;
end
//Правая часть дифференциального уравнения.
function y=g(t,x)
y=6*x-13*t^3-22*t^2+17*t-11+sin(t);
end
//Функция решения задачи Коши модифицированным методом Эйлера.
function [x,t]=eiler_m(a,b,n,x0)
h=(b-a)/n;
x(1)=x0;
//Формула (8.8)
for i=1:n+1
t(i)=a+(i-1)*h;
end
//Формулы (8.12)-(8.13)
for i=2:n+1
tp=t(i-1)+h/2;
xp=x(i-1)+h/2*g(t(i-1),x(i-1));
x(i)=x(i-1)+h*g(tp,xp);
end
end

317

318

Глава 8. Решение обыкновенных дифференциальных уравнений и систем

//Функция решения задачи Коши методом Рунге-Кутта, п. 8.2.3
function [x,t]=runge_kut(a,b,n,x0)
h=(b-a)/n;
x(1)=x0;
for i=1:n+1
t(i)=a+(i-1)*h;
end
for i=2:n+1
K1=g(t(i-1),x(i-1));
K2=g(t(i-1)+h/2,x(i-1)+h/2*K1);
K3=g(t(i-1)+h/2,x(i-1)+h/2*K2);
K4=g(t(i-1)+h,x(i-1)+h*K3);
delt=h/6*(K1+2*K2+2*K3+K4);
x(i)=x(i-1)+delt;
end
end
//Функция решения задачи Коши методом Кутта-Мерсона.
function [x,t,j]=kut_merson(a,b,n,eps,x0)
h=(b-a)/n;
x(1)=x0;t(1)=a;i=2;
while (t(i-1)+h)eps
//Формулы (8.16)
K1=g(t(i-1),x(i-1));
K2=g(t(i-1)+h/3,x(i-1)+h/3*K1);
K3=g(t(i-1)+h/3,x(i-1)+h/6*K1+h/6*K2);
K4=g(t(i-1)+h/2,x(i-1)+h/8*K1+3*h/8*K2);
K5=g(t(i-1)+h,x(i-1)+h/2*K1-3*h/2*K3+2*h*K4);
//Формула (8.17)
X1=x(i-1)+h/2*(K1-3*K3+4*K4);
//Формула (8.18)
X2=x(i-1)+h/6*(K1+4*K4+K5);
//Оценочный коэффициент R (8.19)
R=0.2*abs(X1-X2);
if R>eps
h=h/2;
else
t(i)=t(i-1)+h;
x(i)=X2;
i=i+1;
if Reps
h=h/2;
else
t(i)=t(i-1)+h;
x(i)=X2;
i=i+1;
if R 10), если часть xi больше 1,
а часть меньше.

353

9.3. Интерполяция функций

Решив эту систему линейных алгебраических уравнений, найдём коэффициенты интерполяционного полинома a1, a1, …, an+1. Однако следует учитывать, что при решении системы (9.26) могут возникнуть значительные
вычислительные сложности. Поэтому рассмотрим методы построения интерполяционных полиномов, не связанные с решением систем линейных
алгебраических уравнений.

9.3.2 Полином Ньютона
И. Ньютон предложил интерполирующую функцию записать в виде следующего полинома n-й степени [8, 3]:
F(t) = A1 + A2(t - x1) + A3(t - x1)(t - x2)
+  + An+1(t - x1)(t - x2)…(t - xn).

(9.28)

Подставим F(x1) = y1 в (9.28) и вычислим значение коэффициента A1:
A 1 = y 1.
Подставим F(x2) = y2 в (9.28), после чего получим соотношение для вычисления A2: F(x2) = A1 + A2(x1 - x0) = y1.
Отсюда коэффициент A2 рассчитывается по формуле

где y12 – разделённая разность первого порядка, которая стремится к первой
производной функции при x2 → x1. По аналогии вводятся и другие разделённые разности первого порядка:

Отметим, что количество разделённых разностей первого порядка равно n. Подставим соотношение F(x3) = y3 в (9.28), в результате чего получим:
A1 + A2(x3 - x1) + A3(x3 - x1)(x3 - x2) = y3,
y1 + y12(x3 - x1) + A3(x3 - x1)(x3 - x2) = y3.
Отсюда A3 вычисляется по формуле

здесь y123 – разделённая разность второго порядка, эта величина стремится
ко второй производной при x2 → x3.

354

Глава 9. Обработка экспериментальных данных

Аналогично вводятся

…,

Всего имеем n - 1 разделённых разностей второго порядка.
Подставим F(x4) = y4 в (9.28), после чего получим

Аналогично можно ввести коэффициенты

Этот процесс будем продолжать до тех пор, пока не вычислим

Полученные результаты запишем в табл. 9.5 [8, 3].
Таблица 9.5. Таблица разделённых разностей полинома Ньютона
1

2

3

4



n







y1234n+1



y123…n+1

x

f(x)

x1

y1

x2

y2

y12

x3

y3

y13

y123

x4

y4

y14

y124

y1234

x5

y5

y15

y125

y1235

y12345











xn+1

yn+1

y1n+1

y12n+1

y123n+1

В вычислении по формуле (9.28) будут участвовать только диагональные
элементы таблицы (т. е. коэффициенты Ai ), а все остальные элементы таб­
лицы являются промежуточными и нужны для вычисления диагональных
элементов. Рассмотрим более подробно алгоритм построения полинома.
Этап 1. Формирование коэффициентов полинома Ньютона A.
1. Переписываем в массив A значения y.

9.3. Интерполяция функций

355

2. Определяем j=2, формируем массив разделённых разностей j-1 порядка следующим образом:
for i=j:N
A(i)=(A(i)-A(j-1))/(x(i)-x(j-1));
end

3. Повторяем пункт 2 при j=3:N.
Пример реализации подобного алгоритма приведён ниже.
Листинг 9.9. Вычисление коэффицентов полинома Ньютона
function A=newton(x,y)
N=length(y);
for i=1:N
A(i)=y(i)
end
for j=2:N
for i=j:N
A(i)=(A(i)-A(j-1))/(x(i)-x(j-1));
end
end
endfunction

Этап 2. Вычисление значения полинома Ньютона в точке t. Используем
вычислительную схему, аналогичную схеме Горнера.
Листинг 9.10. Вычисление полинома Ньютона в точке t
function b=calc_newton(x,A,t)
N=length(x)
b=A(N)
for i=N-1:-1:1
b=A(i)+(t-x(i))*b
end
endfunction

9.3.3 Полином Лагранжа
Ещё одно представление интерполяционного полинома степени n предложил Лагранж [8, 3]:
(9.29)
Напомним читателю, что рассмотренные три способа построения полинома – это три различные формы записи одной и той же функции.
Совет. Полином Лагранжа лучше использовать, если необходимо вычислить значение в небольшом количестве точек. Для расчёта во многих точках
рационально использовать полином Ньютона, в котором можно один раз вычислить значения коэффициентов Ai, после чего можно рассчитать ожидае-

356

Глава 9. Обработка экспериментальных данных

мое значение в точках по формуле (9.28). При использовании канонического
полинома приходится решать систему линейных алгебраических уравнений
(9.26), поэтому он используется значительно реже.
Полиномиальная интерполяция не всегда даёт удовлетворительные результаты при аппроксимации зависимостей. При представлении полиномами возможна большая погрешность на концах этих кривых. Несмотря
на выполнение условий в узлах, интерполяционная функция может иметь
значительное отклонение от аппроксимируемой кривой между узлами.
При этом повышение степени интерполяционного полинома приводит не
к уменьшению, а к увеличению погрешности. Решение этой проблемы предложено теорией сплайн-интерполяции (от анг. spline – рейка, линейка).

9.3.4 Интерполяция сплайнами
Рассмотрим один из наиболее распространённых вариантов интерполяции –
интерполяцию кубическими сплайнами. Было установлено [8], что недеформируемая линейка между соседними углами проходит по линии, удовлетворяющей уравнению [8, 3]:
φIV(x) = 0.

(9.30)

Функцию φ(x) будем использовать для интерполяции зависимости y(x), заданной на интервале (a, b) в узлах a = x1, x2, …, xn = b значениями y1, y2, …, yn.
Кубическим сплайном, интерполирующим на отрезке [a, b] данную функцию y(x), называется функция [8]
gk(s) = ak + bk(s - xk ) + ck(s - xk )2 + dk(s - xk )3,
s Î [xk-1, xk ], k = 2, 3, …, n,

(9.31)

удовлетворяющая следующим условиям [8, 3]:
z z gk(xk ) = yk; gk(xk-1) = yk-1 (условие интерполяции в узлах сплайна);
z z функция g(x)дважды непрерывно дифференцируема на интервале
[a, b];
z z на концах интервала функция g должна удовлетворять следующим соотношениям: g1²(a) = gn²(b) = 0.
Для построения интерполяционного сплайна необходимо найти 4(n - 1)
коэффициентов ak, bk, ck, dk (k = 2, 3, …, n).
Из определения сплайна получаем n соотношений (9.33) [8, 3]:
g2(x1) = y1, gk(xk ) = yk, k = 2, 3, …, n.

(9.32)

Из условий гладкой стыковки звеньев сплайна (во внутренних узловых
точках совпадают значения двух соседних звеньев сплайна1, их первые и вторые производные) получаем ещё ряд соотношений (9.33)–(9.34) [8]:
gk-1(xk-1) = gk(xk ),
1

Звеном сплайна называется функция gi(x) на интервале [xi-1, xi].

357

9.3. Интерполяция функций

g¢k-1(xk-1) = g k¢(xk ),
g²k-1(xk-1) = g k²(xk ),

(9.33)

k = 2, 3, …, n;
g1²(x0 ) = 0, gn(xn ) = 0.

(9.34)

Соотношения (9.32)–(9.34) образуют 4(n - 1) соотношений для нахождения
коэффициентов сплайна [8, 3]. Подставляя выражения функций (9.31) и их
производных (9.35)
g¢k (s) = bk + 2ck(s - xk ) + 3dk(s - xk )2,
gk²(s) = 2ck + 6dk(s - xk )

(9.35)

в соотношения (9.32)–(9.34) и принимая во внимание соотношение
hk = xk - xk-1, k = 2, 3, …, n,

(9.36)

получим следующую систему уравнений (9.37)–(9.43):
a2 - b2h2 + c2h22 - d2h23 = y1,

(9.37)

ak = yk, k = 2, 3, …, n,

(9.38)

ak-1 = ak - bk hk + ck h - dk h , k = 3, 4, …, n,

(9.39)

bk-1 = bk - 2ck hk + 3dk hk2, k = 3, 4, …, n,

(9.40)

ck-1 = ck - 3dk hk, k = 3, 4, …, n,

(9.41)

c2 - 3d2 h2 = 0,

(9.42)

cn = 0.

(9.43)

2
k

3
k

Задача интерполяции свелась к решению системы (9.37)–(9.43) [8, 3]. Из
соотношения (9.38) следует, что все коэффициенты ak = yk, k = 2, 3, …, n. Подставив соотношения (9.37), (9.38) в (9.39) и используя фиктивный коэффициент c1 = 0, получим соотношение между bk, ck и dk : bk hk - ck hk2 + dk hk3 = yk - yk-1.
Отсюда коэффициенты bk вычисляются по формуле [8, 3]
(9.44)
Из (9.41) и (9.42) выразим dk через ck (с учётом коэффициента c1 = 0) [8, 3]:
(9.45)
Подставим (9.45) в (9.44):
(9.46)

358

Глава 9. Обработка экспериментальных данных

Введём обозначение
(9.47)
после чего соотношение (9.44) примет вид:
(9.48)
Подставим (9.48) и (9.45) в соотношение (9.40), получим систему относительно ck [8, 3]:
hk-1ck-2 + 2(hk-1 + hk )ck = 3(lk - lk-1), k = 3, 4, …, n,

(9.49)

c0 = 0, cn = 0.

(9.50)

Систему (9.49) можно решить, используя метод прогонки (http://ru.wikipedia.
org/wiki/Метод_прогонки). Этот метод сводится к нахождению прогоночных
коэффициентов по формулам прямой прогонки [8, 3]:
(9.51)

k = 4, 5 …, n,

(9.52)

а затем к нахождению искомых коэффициентов ck по формулам обратной
прогонки [8, 3]:
ck-1 = δk-1ck + λk-1, k = n, n - 1, …, 3.

(9.53)

После нахождения коэффициентов c по формуле (9.53) находим b и d по
формулам (9.48), (9.45) [8, 3].
Таким образом, алгоритм расчёта коэффициентов интерполяционного
сплайна можно свести к следующим шагам [8, 3].
Шаг 1. Ввод значений табличной зависимости y(x), массивов x и y.
Шаг 2. Расчёт элементов массивов h и l по формулам (9.36) и (9.47).
Шаг 3. Расчёт массивов прогоночных коэффициентов δ и λ по формулам
(9.51), (9.52).
Шаг 4. Расчёт массивов коэффициентов c по формуле (9.53).
Шаг 5. Расчёт массивов коэффициентов b по формуле (9.48).
Шаг 6. Расчёт массивов коэффициентов d по формуле (9.45).
После этого в формулу (9.31) можно подставлять любую точку s и вычислять ожидаемое значение.

359

9.3. Интерполяция функций

Задача 9.4
Найти приближённое значение функции при заданном значении аргумента с помощью интерполяции кубическими сплайнами в точках x1 = 150,
x2 = 160, x3 = 165. Функция задана таблично (табл. 9.6).
Таблица 9.6. Исходные данные к задаче 9.4
132
330

140
350

162
385

170
425

175
150

180
485

Код программы с комментариями приведён ниже.
clear;
//Функция вычисления коэффициентов сплайна b,c,d
function [b, c,d]=koef_spline(x,y)
n=length(x);
//Вычисление элементов массива h (11.36)
for k=2:n
h(k)=x(k)-x(k-1);
end
//Вычисление элементов массива l (11.47)
for k=2:n
l(k)=(y(k)-y(k-1))/h(k);
end
//Вычисление прогоночных коэффициентов (11.52)-(11.53)
delt(2)=-h(3)/(2*(h(3)+h(2)));
lyam(2)=1.5*(l(3)-l(2))/(h(3)+h(2));
for k=4:n
delt(k-1)=-h(k)/(2*(h(k-1)+h(k))+h(k-1)*delt(k-2));
lyam(k-1)=(3*(l(k)-l(k-1))-h(k-1)*lyam(k-2))/...
(2*(h(k-1)+h(k))+h(k-1)*delt(k-2));
end
//Вычисление коэффициентов сплайна с (11.49)-(11-50)
c(n)=0;
for k=n:-1:3
c(k-1)=delt(k-1)*c(k)+lyam(k-1);
end
//Расчёт коэффициентов сплайна b,d (11.48), (11.45)
for k=2:n
d(k)=(c(k)-c(k-1))/3/h(k);
b(k)=l(k)+(2*c(k)*h(k)+h(k)*c(k-1))/3;
end
endfunction
//Расчёт ожидаемого значения в точке t
function z=my_spline(x,y,t)
//Вычисление коэффициентов сплайна
//Рекомендуем читателю подумать, имеет ли смысл перенести вызов этой
//функции в главную программу. В каких случаях?
[b,c,d]=koef_spline(x,y);
n=length(x);
a=y;

360

Глава 9. Обработка экспериментальных данных

//Определяем номер интервала j, в котором находится точка t
if t>x(n-1)
j=n;
else
for i=2:n-1
if t 0, то (10.2) – это гиперболическое уравнение, если
B 2 - 4AC = 0 – параболическое уравнение. В случае когда B 2 - 4AC не имеет
постоянного знака, это уравнение смешанного типа.
С помощью преобразования переменных x, y (или x, t) уравнение можно
привести к виду, когда B = 0. В этом случае очень просто определяется тип
уравнения. Если A и C имеют один и тот же знак, то уравнение (10.2) – эллиптическое уравнение, если разные, то гиперболическое, а если A или C равно 0,
то уравнение относится к параболическим [9].
К классическим эллиптическим уравнениям относятся [8, 9]:
1
z z уравнение Лапласа Du = 0 , которое используется для описания магнитных и стационарных тепловых полей;
z z уравнение Пуассона Du = f, которое применяется в электростатике,
теории упругости и т. д.;
z z уравнение Гельмгольца Du + cu = f, описывающее установившиеся колебательные процессы.
Среди гиперболических уравнений можно выделить [13]:
zz

волновые уравнения: одномерное волновое уравнение
f (x, t), которое описывает вынужденные колебания струны; двумерное
волновое уравнение

описывает колеба-

ния мембраны2;
zz

телеграфное уравнение

, описы-

вает изменение потенциала u в линиях электропередачи; L, C, R, G –
коэффициент самоиндукции, ёмкость, сопротивление, характеристика
потерь на единицу длины линии.

1

В двумерном случае оператор Лапласа имеет вид

, в трёхмерном –

2

При f = 0 уравнение описывает свободные колебания струны или мембраны.

10.2. Использование метода сеток для решения параболических уравнений

367

К классическим параболическим уравнениям относится уравнение теплопроводности
Для нахождения единственного решения дифференциального уравнения
в частных производных необходимо задать начальные и граничные условия.
Начальными условиями принято называть условия, заданные в начальный
момент времени t. Граничные условия задаются при различных значениях пространственных переменных. Для эллиптических уравнений задаются
только граничные условия, которые можно разделить на три класса [13]:
z z условие Дирихле u(x, y, z) Î Γ = φ(x, y, z), в этом случае на границе области Γ,
в которой ищут решение, задана некая непрерывная функция φ. В одномерном случае это условие принимает вид u(0, t ) = φ1(t ), u(L, t ) =
φ2(t ), (0, L) – интервал, на котором ищется решение одномерной задачи;
zz

условие Неймана

= φ(x, y, z), в этом случае на границе области

задана производная по направлению n внешней нормали;
zz

смешанное условие

= φ(x, y, z).

Для параболических уравнений, кроме граничных условий, необходимо
определить одно начальное, которое может быть таким: u(x, t0) = ψ(x).
В случае гиперболических уравнений начальные условия могут быть следующими: u(x, t0 ) = ψ1(x) и
Существуют аналитические методы решения уравнений в частных производных, такие так как метод Фурье (метод разделения переменных), в результате применения которых решение записывается в виде суммы бесконечного ряда довольно сложной структуры и нахождение численного значения
функции в конкретной точке представляет собой отдельную математическую
задачу. Поэтому широкое распространение получили численные методы решения уравнений в частных производных.

10.2 Использование метода сеток для решения
параболических уравненийв частных
производных
Одним из наиболее распространенных численных методов решения уравнений является метод сеток1 [8]. В методе сеток область Ω, в которой необходимо найти решение уравнения, прямыми, параллельными осям t = tj и x = xi,
разобьем на прямоугольные области (см. рис. 10.1), где xi = x0 + ih,

1

Метод сеток в литературе также называют методом конечных разностей.

368

Глава 10. Решение дифференциальных уравнений в частных производных

i = 0, 1, 2, …, n; tj = t0 + jD,

j = 0, 1, …, k. Точки, которые лежат на

границе Γ области Ω, называются внешними, остальные точки – внутренними.
Совокупность всех точек называется сеткой ΩhD, величины h и D – шагами
сетки по x и t соответственно.
Идея метода сеток состоит в том, что вместо любой непрерывной функции
w(x, t) будем рассматривать дискретную функцию wj = w(xi, tj ), которая определена в узлах сетки ΩhD, вместо производных функции будем рассматривать
их простейшие разностные аппроксимации в узлах сетки. Таким образом,
вместо системы дифференциальных уравнений в частных производных получим систему алгебраических уравнений. Чем меньше величины h и D,
тем точнее получаемые алгебраические уравнения моделируют исходное
дифференциальное уравнение в частных производных. В этом и последующих параграфах данной главы будет рассмотрен метод сеток для каждого из
трёх типов уравнений и его реализация в Scilab. Знакомство с численными
методами решения дифференциальных уравнений в частных производных
начнем с разностных схем решения параболических уравнений.
Разностные схемы решения параболических уравнений будем рассматривать на примере следующего одномерного уравнения (10.3):
0 £ x £ L, 0 £ t £ T,
u(0, t ) = µ(t ), u(L, t ) = η(t), 0 £ t £ T,

(10.3)

u(x, 0) = φ(x), 0 £ x £ L.
Построим сетку ΩhD (см. рис. 10.1). Для получения сеточного уравнения за-

меним производную

приближённой разностной формулой [8]:

(10.4)
В этой и последующих формулах ui, j – это значение функции u в точке
(xi, tj ), ui+1, j – в точке (xi+1, tj ), ui-1, j – в точке (xi-1, tj ), ui, j+1 – в точке (xi, tj+1) и ui, j-1 –
в точке (xi, tj-1).
Для замены

можно воспользоваться одной из приближённых разност-

ных формул [8]:
(10.5)
(10.6)
Кроме того, заменим начальные и граничные условия их разностной аппроксимацией:

10.2. Использование метода сеток для решения параболических уравнений

369

ui,0 = φ(xi ) = φi, i = 0, 1, …, n,

(10.7)

u0, j = µ(tj ) = µj, un, j = ν(tj ) = νj, j = 0, 1, …, k.

(10.8)

Заменив частные производные в задаче (10.3) соотношениями (10.4)
и (10.5) и учитывая условия (10.7)–(10.8), получим следующую вычислительную схему для расчёта значений функции u в узлах сетки ΩhD:
ui, j+1 = γui,j-1 + (1 - 2γ)ui, j + γui, j+1 + Df i, j,
u0, j = µj, un, j = νj, ui,0 = φi,

Рис. 10.1. Сетка ΩhD для области Ω с границей Γ

Это явная двухслойная разностная схема (см. рис. 10.2).

Рис. 10.2. Шаблон явной двухслойной разностной схемы

(10.9)

(10.10)

370

Глава 10. Решение дифференциальных уравнений в частных производных

Учитывая, что на нулевом слое (при i = 0) все значения ui,0 (как, впрочем,
и u0, j, un, j ) известны, по формуле (10.8) можно сначала явно рассчитать значения ui,1, затем ui,2 и так до ui,k. Для устойчивости разностной схемы (10.8)
значения шагов по t и x должны удовлетворять следующему условию:
(10.11)
Рассмотрим решение параболического уравнения на примере следующей
задачи.
Задача 10.1
Решить параболическое уравнение, описывающее распределение температуры в стержне длиной L, начальная температура стержня задаётся произвольной функцией φ(x). Температуры концов стержня равны u(0, t) =
U1 = const, u(L, t ) = U2 = const.
0 £ x £ L, 0 £ t < ¥,
u(0, t) = U1 = const, u(L, t ) = U2 = const, 0 £ t < ¥,

(10.12)

u(x, 0) = φ(x), 0 £ x £ L.
Здесь a – коэффициент температуропроводности, λ – коэффициент теплопроводности материала стержня, c – удельная теплоёмкость, ρ – плотность.
Подпрограмма решения задачи 10.1 с помощью явной разностной схемы
(10.9)–(10.10) в Scilab представлена в листинге 10.11.
Листинг 10.1. Подпрограмма решения задачи 10.1 с помощью явной разностной
схемы
//Правая часть дифференциального уравнения.
function y=f(x,t)
y=sin(x*t)
endfunction
//Начальное условие
function y=fi(x)
y=exp(0.15*x)
endfunction
//Условие на левой границе
function y=myu(t)
y=1
endfunction
//Условие на правой границе
function y=nyu(x)
y=2.117
1

В листинге 10.1 и во всех последующих уже учтен тот факт, что массивы в Scilab
нумеруются с 1.

10.2. Использование метода сеток для решения параболических уравнений

371

endfunction
function [u,x,t]=parabol(N,K,L,T,a)
//Функция решения параболического уравнения методом сеток
//с помощью явной разностной схемы. N - количество участков,
//на которые разбивается интервал по х (0,L); K - количество
//участков, на которые разбивается интервал по t (0,T); a //параметр дифференциального уравнения теплопроводности.
//Функция возвращает матрицу решений u и вектора x, t
//Вычисляем шаг по х
h=L/N;
//Вычисляем шаг по t
delta=T/K;
//Формируем массив x и первый столбец матрицы решений U
//из начального условия
for i=1:N+1
x(i)=(i-1)*h;
u(i,1)=fi(x(i));
end
//Формируем массив t, первую и последнюю строки
//матрицы решений
//U из граничных условий
for j=1:K+1
t(j)=(j-1)*delta;
u(1,j)=myu(t(j));
u(N+1,j)=nyu(t(j));
end
gam=a^2*delta/h^2;
//Формируем матрицу решений u с помощью явной разностной схемы
//(12.9)
for j=1:K
for i=2:N
u(i,j+1)=gam*u(i-1,j)+(1-2*gam)*u(i,j)+gam*u(i+1,j)+delta*...
f(x(i),t(j));
end
end
end

Входными данными подпрограммы parabol решения задачи 10.1 являются: N – количество интервалов, на которые разбивается отрезок (0, L);
K – количество интервалов, на которые разбивается отрезок (0, T ); L – длина
стержня, T – интервал времени, a – параметр дифференциального уравнения.
Функция возвращает три параметра: решение – сеточная функция u, определённая на сетке ΩhD, массивы x и t.
В листинге 10.2 представлено обращение к функции parabol для решения
задачи 10.1 и построение графика решения, который изображен на рис. 10.3.
Листинг 10.2. Вызов функции parabol
[U,X,T]=parabol(50,200,5,3,0.4);
surf(X,T,U');
title('Явная схема');
xlabel('X');
ylabel('T');

372

Глава 10. Решение дифференциальных уравнений в частных производных

Рис. 10.3. График решения задачи 10.1 при f (x, t ) = sin(xt )

При решении параболических уравнений с помощью явной разностной
схемы основной проблемой является устойчивость решения и правильный
выбор шага по t, удовлетворяющего соотношению (10.11).
Для решения этой проблемы были предложены неявные разностные схемы [8]. Эти схемы абсолютно устойчивы, но алгоритм решения получаемого
сеточного уравнения несколько сложнее, чем простой пересчёт по формуле
(10.9). Рассмотрим неявную разностную схему для параболического уравнения. Для построения неявной разностной схемы заменим частные производные в задаче (10.1) соотношениями (10.4), (10.61) и с учётом условий
(10.7)–(10.8) получим следующую вычислительную схему для расчёта значений функции u в узлах сетки ΩhD.
γui-1, j - (1 + 2γ)ui, j + γui+1, j = -ui, j-1 - Df i, j,
i = 1, 2, …, n - 1, j = 1, 2, …, k.

(10.13)

Соотношения (10.13) вместе с равенствами (10.10) – неявная двухслойная
разностная схема (см. рис. 10.4). Схема (10.10), (10.13) не позволяет явно выписать решение, и для нахождения ui, j при каждом значении j необходимо
решить трёхдиагональную систему линейных алгебраических уравнений,
для чего можно воспользоваться одним из итерационных методов (например, методом Зейделя [8] или прогонки [8]). Преобразуем систему (10.13)
к следующему виду:
(10.14)

1

Вместо (10.5) для явной схемы.

10.2. Использование метода сеток для решения параболических уравнений

373

Рис. 10.4. Шаблон неявной двухслойной разностной схемы

Формула (10.14) позволит запрограммировать решение системы, получаемой с помощью неявной разностной схемы, одним из численных методов,
например методом Зейделя.
Решение параболического уравнения с помощью неявной разностной схемы (c помощью функции neyavn) представлено в листинге 10.3.
Входными данными функции neyavn являются: N – количество участков,
на которые разбивается интервал по x (0, L); K – количество участков, на
которые разбивается интервал по t (0, T ); a – параметр дифференциального
уравнения теплопроводности; eps – точность решения СЛАУ (10.14) методом Зейделя1. Функция neyavn возвращает мат­ри­цу решений u задачи 10.1;
массивы x и t; r – точность решения системы (10.14) методом Зейделя; количество итераций k.
Листинг 10.3. Решение задачи 10.1 с помощью неявной разностной схемы
//Правая часть дифференциального уравнения.
function y=f(x,t)
y=sin(x*t)
//y=0;
endfunction
//Начальное условие
function y=fi(x)
y=exp(0.15*x)
endfunction
//Условие на левой границе
function y=myu(t)
y=1
endfunction
//Условие на правой границе
function y=nyu(x)
y=2.117
endfunction
1

Выбор метода Зейделя при программировании трёхдиагональной системы линейных алгебраических уравнений вида (10.13)–(10.14) – субъективный выбор
авторов. Читатель может использовать и другой итерационный метод или специа­
лизированный метод решения подобных систем типа метода прогонки.

374

Глава 10. Решение дифференциальных уравнений в частных производных

function [u,x,t,r,k]=neyavn(N,K,L,T,a,eps)
//Функция решения параболического уравнения методом сеток
//с помощью неявной разностной схемы.
//Вычисляем шаг по х
h=L/N;
//Вычисляем шаг по t
delta=T/K;
//Формируем массив x и первый столбец матрицы решений U
//из начального условия
for i=1:N+1
x(i)=(i-1)*h;
u(i,1)=fi(x(i));
end
//Формируем массив t, первую и последнюю строки матрицы
//решений U из граничных условий
for j=1:K+1
t(j)=(j-1)*delta;
u(1,j)=myu(t(j));
u(N+1,j)=nyu(t(j));
end
//Определяем матрицу ошибок R и заполняем её нулями
R(N+1,K+1)=0;
//Вычисляем коэффициент gamma
gam=a^2*delta/h^2;
r=1;
k=0;
//Цикл while для организации итерационного процесса
//при решении системы уравнений методом Зейделя
//с точностью eps
while r>eps
//Вычисление матрицы ошибок R во внутренних точках
//и пересчёт значений u во внутренних точках при решении СЛАУ
// методом Зейделя for i=2:N
for j=2:K+1
R(i,j)=abs(u(i,j)-gam/(1+2*gam)*(u(i-1,j)+u(i+1,j))-u(i,j-1)...
/(1+2*gam)-delta*f(x(i),t(j))/(1+2*gam));
u(i,j)=gam/(1+2*gam)*(u(i-1,j)+u(i+1,j))+u(i,j-1)...
/(1+2*gam)+delta*f(x(i),t(j))/(1+2*gam); end
end
//Поиск максимума в матрице ошибок
r=R(1,1);
for i=1:N+1
for j=1:K+1
if R(i,j)>r
r=R(i,j);
end
end
end
//Увеличение количества итерации.
k=k+1;
end disp(k)
endfunction
[U,X,T]=neyavn(50,200,5,3,0.4,0.1);

10.2. Использование метода сеток для решения параболических уравнений

375

surf(X,T,U');
title('Неявная схема');
xlabel('X');
ylabel('T');

На рис. 10.5 представлен график решения задачи, которое было получено
с помощью неявной разностной схемы.

Рис. 10.5. График решения задачи 10.1 при f (x, t) = sin(xt)

Как и ожидалось, разница между решениями, полученными с помощью
явной и неявной разностных схем, начинает расти при увеличении x и t (см.
рис. 10.6).
Обратите внимание, что функции, приведённые на листингах 10.1 и 10.3,
позволяют решать уравнения вида (10.3) с различными функциями f(x, t),
µ(t), η(t), φ(x).
Использование неявной разностной схемы в случае, когда f(x, t) ≠ 0, рассмотрим на примере ещё одной задачи.
Задача 10.2
Найти распределение температуры в стержне длиной L, начальная температура стержня задаётся произвольной функцией f(x). Температуры концов стержня равны u(0, t) = U1 = const, u(L, t) = U2 = const. На боковой поверхности стержня происходит теплообмен по закону Ньютона со средой,
температура которой равна u0.

376

Глава 10. Решение дифференциальных уравнений в частных производных

Рис. 10.6. Разность между решениями,
найденными с помощью явной и неявной схем

Начально-граничная задача, описывающая распределение температуры
стержня, имеет вид:

0 £ x £ L, 0 £ t < ¥,

(10.15)

u(0, t) = U1 = const, u(L, t) = U2 = const, 0 £ t < ¥,
u(x, 0) = φ(x), 0 £ x £ L.
Здесь α – коэффициент теплообмена, σ – площадь поперечного сечения
стержня, p – периметр поперечного сечения стержня.
Построим сетку ΩhD (xi = ih,

i = 0, 1, 2, …, n), (tj = jD,

…, k). Для получения сеточного уравнения заменим производные

j = 0, 1,
и

приближёнными разностными формулами (10.4) и (10.6). Получится следую­
щая неявная разностная схема (10.16)–(10.18):

10.2. Использование метода сеток для решения параболических уравнений

ui,0 = φ(xi), i = 0, 1, …, N,
u0, j = U1, UN, j = U2, j = 0, 1, …, K,

i = 1, 2, …, N - 1; j = 1, 2, …, k,

377

(10.16)

(10.17)
(10.18)

Применение неявной разностной схемы для решения задачи 10.2 представлено в листинге 10.4.
Листинг 10.4. Функция neiav решения задачи 10.2 с помощью неявной разностной
схемы
//Начальное условие
function y=fi(x)
y=exp(0.15*x)
endfunction
function [u,x,t,r,k]=neiav(N,K,L,T,a,h,U1,U2,u0,eps)
//Функция решения параболического уравнения методом сеток
//с помощью неявной разностной схемы.
//N - количество участков, на которые разбивается интервал по х
//(0,L); K - количество участков, на которые разбивается
// интервал по t (0,T);
//a, h - параметры диффренциального уравнения теплопроводности;
//eps - точность решения СЛАУ методом Зейделя;
//U1 - температура на левом конце стержня;
//U2 - температура на правом конце стержня.
//Функция neiav возвращает:
//u - матрицу решений в узлах сетки, массив x, массив t,
//r - точность решения системы методом Зейделя,
//к - количество итераций при решении системы методом Зейделя.
//Вычисляем шаг по х
hx=L/N;
//Вычисляем шаг по t
delta=T/K;
//Формируем массив x и первый столбец матрицы решений U
//из начального условия
for i=1:N+1
x(i)=(i-1)*hx;
u(i,1)=fi(x(i));
end
//Формируем массив t, первую и последнюю строки матрицы
//решений U из граничных условий
for j=1:K+1
t(j)=(j-1)*delta;
u(1,j)=U1;
u(N+1,j)=U2;
end

378

Глава 10. Решение дифференциальных уравнений в частных производных

//Определяем матрицу ошибок R и заполняем её нулями
R(N+1,K+1)=0;
//Вычисляем коэффициент gamma
gam=a^2*delta/hx^2;
r=1;
k=0;
//Цикл while для организации итерационного процесса при решении
//системы уравнений методом Зейделя с точностью eps
while r>eps
//Вычисление матрицы ошибок R во внутренних точках
//и пересчёт значений u во внутренних точках при решениии СЛАУ
// методом Зейделя
for j=2:K+1
for i=2:N
V=gam*(u(i-1,j)+u(i+1,j))/(1+2*gam+delta*hx)+u(i,j-1)/...
(1+2*gam+delta*hx)+delta*h*u0/(1+2*gam+delta*hx);
R(i,j)=abs(V-u(i,j));
u(i,j)=V;
end
end
//Поиск максимума в матрице ошибок
r=R(1,1);
for i=1:N+1
for j=1:K+1
if R(i,j)>r
r=R(i,j);
end
end
end
//Увеличение количества итераций
k=k+1;
end
endfunction
//Вызов функции
[U,X,T,R,K]=neiav(50,200,5,3,0.4,0.5,1,2.117,30,0.001);
//Построение графика функции
surf(X,T,U');
xlabel('X');
ylabel('T');

Входные и выходные данные функции neiav решения задачи 10.2 описаны в комментариях листинга 10.4. На рис. 10.7 представлены результаты
решения задачи.
Для решения получаемого алгебраического уравнения методом Зейделя
потребовалось 1079 итераций. Поэтому для уменьшения количества итераций имеет смысл попробовать ускорить итерационный процесс с помощью
методов релаксации или градиентных методов решения систем алгебраических уравнений. Методика, изложенная в этом параграфе, может быть
использована и при решении других параболических уравнений.

379

10.3. Использование метода сеток для решения гиперболических уравнений

Рис. 10.7. График решения задачи 10.2

10.3 Использование метода сеток для решения
гиперболических уравнений
Решение гиперболических уравнений также можно осуществить с помощью
разностных схем. Разностные схемы решения одномерного гиперболического уравнения рассмотрим на примере следующего уравнения:
0 £ x £ L, 0 £ t £ T,
u(0, t) = µ(t), u(L, t ) = η(t ), 0 £ t £ T,
u(x, 0) = φ(x),

(10.19)

0 £ x £ L.

Построим сетку ΩhD (см. рис. 10.1), в которой будем искать решение уравне-

ния (10.19). Частную производную
(10.4), а производную

заменим разностным соотношением

– соотношением (10.20) [8].
(10.20)

380

Глава 10. Решение дифференциальных уравнений в частных производных

Подставляя (10.20), (10.4), (10.5) в гранично-начальную задачу (10.19), получим следующую явную разностную схему решения уравнения:
ui, j+1 = -ui, j-1 + γ(ui-1, j + ui+1, j ) = (2 - 2γ)ui, j + D2 f i, j,
i = 1, 2, …, N - 1, j = 1, 2, …, K - 1,
ui,0 = φ(xi ),

i = 0, 1, …, N,

(10.21)

u0, j = µj, uN, j = νj, j = 0, 1, …, K,

которая устойчива при γ < 1 и по аналогии с разностной схемой (10.9)–(10.10)
может быть легко запрограммирована в Scilab.
В качестве примера рассмотрим следующую начально-граничную задачу.
Задача 10.3
Решить начально-граничную задачу
0 £ x £ L, t ³ 0,
ω(0, t) = φ(0), ω(L, t) = φ(L),

(10.22)

ω(x, 0) = φ(x), ωt(x, 0) = ψ(x).
В листинге 10.5 представлена функция ggg решения уравнения (10.22).
Параметры функции ggg аналогичны рассмотренным ранее подпрограммам
решения параболических уравнений.
Листинг 10.5. Функция ggg решения задачи 10.3 с помощью явной разностной
схемы
function [u,x,t]=ggg(N,K,L,T,a)
//Функция решения гиперболического уравнения с помощью явной
//разностной схемы. Входные данные:
//N - количество участков, на которые разбивается интервал по
//х (0,L); K - количество участков, на которые разбивается
//интервал по t (0,T); a - параметр дифференциального
//уравнения теплопроводности. Выходные данные:
//u - матрица решений в узлах сетки, массив x, массив t,
//Вычисляем шаг по х
h=L/N;
//Вычисляем шаг по t
delta=T/K;
//Формируем массив x, первый и второй столбцы матрицы решений u
//из начального условия

381

10.4. Использование метода сеток для решения эллиптических уравнений
for i=1:N+1
x(i)=(i-1)*h;
u(i,1)=fi(x(i));
u(i,2)=u(i,1)+delta*psi(x(i));
end
//Формируем массив t, первую и последнюю строки матрицы решений
//U из граничных условий
for j=1:K+1
t(j)=(j-1)*delta;
end
//Формируем первую и последнюю строки матрицы решений U
//из граничных условий
for j=2:K+1
u(1,j)=0;
u(N+1,j)=fi(L);
end
gam=a^2*delta^2/h^2;
//Формируем матрицу решений u с помощью явной разностной схемы
for j=2:K
for i=2:N
u(i,j+1)=-u(i,j-1)+gam*u(i-1,j)+(2-2*gam)*...
u(i,j)+gam*u(i+1,j)+delta^2*f(x(i),t(j));
end
end
end

Для решения гиперболических уравнений можно построить и неявные
схемы, однако в связи с тем, что у них нет таких преимуществ перед явными,
как в параболических уравнениях, их имеет смысл использовать, только когда нельзя построить явную (например, при смешанных условиях на границе
области).

10.4 Использование метода сеток для решения
эллиптических уравнений
Рассмотрим разностную схему для эллиптического уравнения в прямоугольной области Ω(R - b £ x £ R + b, -a £ y £ a) с граничными условиями Дирихле
на границе Γ.
Задача 10.4

(10.23)
Ψ(x,y)ÎΓ = 0.

, для чего проведем в области Ω прямые, параллельные
Построим сетку Ω hy
hx

осям y = yj и x = xi, где xi = R - b + i · hx,

i = 0, 1, 2, …, Nx; yj = -a + j · hy,

382

Глава 10. Решение дифференциальных уравнений в частных производных

j = 0, 1, …, Ny. Для построения разностного уравнения заменим
частные производные и граничные условия следующими соотношениями:

(10.24)

Ψi,0 = Ψi,Ny = 0, i = 0, 1, …, Nx,
Ψ0,j = ΨNx, j = 0, j = 0, 1, …, Ny.

(10.25)

С помощью соотношений (10.24)–(10.25) преобразуем эллиптическую краевую задачу к следующей системе разностных уравнений:

i = 1, 2, …, Nx - 1; j = 1, 2, …, Ny - 1,

(10.26)

Ψi,0 = Ψi, Ny = 0, i = 0, 1, …, Nx,

Ψ0, j = ΨNx, j = 0, i = 0, 1, …, Ny.

Эту систему можно решать итерационными методами (например, методом Зейделя). В случае медленной сходимости итерационных процессов при
решении сеточных уравнений, получаемых при аппроксимации гиперболических и эллиптических задач, имеет смысл попробовать заменить метод
Зейделя градиентными методами (или методами релаксации). В листинге 10.6 представлено решение уравнения (10.23) сеточным методом, а на
рис. 10.8 – график найденного решения.
Листинг 10.6. Решение задачи 10.4
function [psi,x,y,k]=ellip(R,a,b,Nx,Ny,eps)
//Функция ellip.
//Входные данные:
//R, a, b - значения, определяющие область решения задачи,
//Nx - количество участков, на которые разбивается интервал по
//х(R-b,R+b);
//Ny - количество участков, на которые разбивается интервал по
//y (-a,a);
//eps - точность решения уравнения методом Зейделя.
//Выходные данные:
//psi - матрица решений в узлах сетки, массив x, массив y,
//k - количество итераций при решении разностного уравнения
// методом Зейделя.

10.4. Использование метода сеток для решения эллиптических уравнений
//Вычисляем шаг по y
hy=2*a/Ny;
//Вычисляем шаг по x
hx=2*b/Nx;
//Формируем массив x, первый и последний столбцы матрицы
//решений psi из граничного условия
for i=1:Nx+1
x(i)=R-b+(i-1)*hx;
psi(i,1)=0;
psi(i,Ny+1)=0;
end;
//Формируем массив y, первую и последнюю строки матрицы
//решений psi из граничного условия
for j=1:Ny+1
y(j)=-a+(j-1)*hy;
psi(1,j)=0;
psi(Nx+1,1)=0;
end;
//Вычисляем коэффициенты разностного уравнения
A=2/hy^2+2/hx^2;
D=1/hy^2;
for i=2:Nx+1
B(i)=1/hx^2+5/(2*hx*x(i));
C(i)=1/hx^2-5/(2*hx*x(i));
end
//Решение разностного уравнения методом Зейделя
//с точностью eps
p=1;
k=0;
while p>eps
for i=2:Nx
for j=2:Ny
V=1/A*(B(i)*psi(i-1,j)+C(i)*psi(i+1,j)+D*(psi(i,j-1)...
+psi(i,j+1))+2);
R(i,j)=abs(V-psi(i,j));
psi(i,j)=V;
end
end
p=R(2,2);
for i=2:Nx
for j=2:Ny
if R(i,j)>p
p=R(i,j);
end
end
end
k=k+1;
end
endfunction
//Вызов функции решения задачи 12.4.
[PSI,X,Y,K]=ellip(18,3,6,32,16,0.01);
//Построение графика функции

383

384

Глава 10. Решение дифференциальных уравнений в частных производных

surf(X,Y,PSI');
title('Example 12.4');
xlabel('X');
ylabel('Y');

Рис. 10.8. График решения уравнения (10.23) сеточным методом

Авторы надеются, что читатель, разобравшийся с решением уравнения
(10.23), без проблем построит разностную схему и для других эллиптических уравнений. Метод сеток позволяет решить широкий класс уравнений
в частных производных. Однако при сложной геометрии области, уравнениях с переменными коэффициентами, сложными условиями на границе
области использование этого метода нецелесообразно, в подобных случаях можно использовать метод конечных элементов, который реализован
в кросс-платформенном свободно распространяемом пакете freefem [16].

Глава 11

Решение задач оптимизации
Эта глава посвящена решению оптимизационных задач средствами пакета
Scilab. Будут рассмотрены:
z z задачи поиска минимума функции;
z z задачи линейного программирования;
z z задачи квадратичного программирования.

11.1

Поиск минимума функции

В качестве простейшей оптимизационной задачи рассмотрим поиск локального минимума функции одной переменной.
Для нахождения значения минимума любой функции в Scilab служит функция [12]:
[fopt, xopt, [gopt, work, iters, evals, err]]
= optim(costf [,contr] ,x0 [,algo] [,df0 [,mem]] [,work] [,stop]
[,params] [,iprint=iflag]),
Входные параметры:
z z x0 – вектор-столбец начальных приближений длиной n;
z z функция costf определяет функцию, минимум которой нужно найти
(подробнее об этом ниже);
z z contr – необязательный параметр, который определяется как "b", binf,
bsup и содержит ограничения на х: binfi £ xi £ bsupi; если эти границы
задаются, то binf и bsup являются векторами той же размерности, что
и x0;
z z algo – строка, с помощью которой задаётся алгоритм оптимизации
("qn" – квазиньютоновский, "gc" – сопряженных градиентов или "nd" –
без дифференцирования) (по умолчанию algo="qn");
z z df0 – скаляр, предположение об убывании целевой функции на первой
итерации (по умолчанию df0=1);

386

Глава 11. Решение задач оптимизации

mem – целое число, которое определяет количество переменных, используемых для аппроксимации гессиана (Hessian); по умолчанию
установлено значение, равное 10; опция доступна для безусловной
оптимизации при значениях параметра algo "gc" или "nd";
z z stop – совокупность переменных, контролирующих сходимость алгоритма, можно задать значения параметров nap, iter, epsg, epsf, epsx:
– nap – максимальное число вызовов функции costf (по умолчанию
100);
– iter – максимальное количество итераций (по умолчанию iter=100);
– epsg – ограничение на норму градиента (по умолчанию epsg=
%eps=2.220D-16);
– epsf – пороговое значение, контролирующее убывание f (по умолчанию epsf=0);
z z epsx – пороговое значение, контролирующее разброс х. Это вектор
(возможно, мат­ри­ца) той же размерности, что и х0. Может быть использован для масштабирования;
z z params – в случае когда целевая функция является подпрограммой на
C или Fortran, последовательность аргументов задаёт порядок обращения к целевой функции; параметр не имеет смысла, когда целевая
функция задана в Scilab;
z z "iprint=iflag" – аргумент задаёт режим трассировки, по умолчанию
принимает значение 0: не печатается никаких дополнительных сообщений. В случае если значение аргумента не меньше единицы, на
экран выводится больше информации; вид и количество информации
определяются типом используемого алгоритма ("qn", "gc" или "nd").
Выходные результаты:
z z fopt – минимальное значение функции;
z z xopt – точка, в которой функция достигает этого значения xopt;
z z gopt – значение градиента целевой функции в точке xopt;
z z work – рабочий массив для работы квазиньютоновского метода оптимизации, который автоматически создается, когда происходит вызов
функции optim; может быть задан как входной параметр функции для
ускорения расчётов;
z z iters – скаляр, определяющий число итераций, выводимых на печать,
при значении iprint=2;
z z evals – скаляр, который определяет число вызовов функции, выводимых на печать, при значении iprint=2;
z z err – целое число, индикатор успешности решения задачи, может принимать значения от 1 до 10: err=1 – норма вычисленного градиента
ниже допустимого; err=2 – на последней итерации f уменьшается;
err=3 – оптимизация останавливается из-за слишком малых изменений для x; err=4 – остановка из-за превышения количества обращений
к f; err=5 – остановка из-за превышения количества итераций; err=6 –
остановка: слишком маленькие изменения в направлении градиента;
zz

11.1. Поиск минимума функции

387

err=7 – остановка во время расчёта направления спуска; err=8 – остановка во время расчёта оценки мат­ри­цы Гессе; err=9 – окончание оптимизации, задача решена, успешное завершение; err=10 – успешное
окончание оптимизации (линейный поиск не выполняется).
Главной особенностью функции optim является структура функции costf,
которая должна быть следующей:
function [f,g,ind]=costf(x,ind)
//Функция costf должна возвращать функцию f, её градиент g.
//f - функция от вектора неизвестных х, минимум которой надо найти
f=gg(x);
//g - градиент функции f (вектор частной производной f по x),
g=numderivative(gg,x);
endfunction

Для функции одной переменной в качестве f возвращается функция, минимум которой надо найти, в качестве функции g – её производная.
Обратите внимание, что если возвращаемое сформированной функцией
costf значение ind равно 2, 3 или 4, то функция costf обеспечивает поиск
минимума, т. е. в качестве результата функции optim возвращается f и xopt.
Если ind=1, то в функциии optim ничего не считается, условие ind 1.
Задание 3. Найти корень пятнадцатой степени из произведения первых
n чётных чисел, но не кратных 8. Программа должна работать при n = 13.
Задание 4. Составить программу вычисления значения суммы

и функции

в диапазоне от 0 до 1 с произвольным шагом h. Значение n для вычисления
суммы вводится с клавиатуры. Вывести на экран таблицу значений функции
Y(x) и её разложение в ряд S(x). Близость значений Y(x) и S(x) во всём диапазоне значений x указывает на правильность их вычисления.
Задание 5. Написать программу для вычисления y по формуле:

418

Глава 13. Задания для самостоятельной работы в Scilab

Натуральное значение n введите с клавиатуры. Значение x (|x| < 1) также
вводится с клавиатуры.

Вариант 15
Задание 1. Вводится последовательность целых чисел, которая заканчивается после ввода 17-го числа-палиндрома. Найти наибольшее и наименьшее
значения из введённых чисел.
Задание 2. Вводится последовательность целых чисел, которая заканчивается после ввода n простых чисел. Для каждого введённого числа проверить,
является ли сумма делителей числа простым числом.
Задание 3. Найти косинус суммы первых n (100 £ n £ 1000) простых чисел.
Задание 4. Составить программу вычисления значения суммы

и функции

в диапазоне от 0 до 1 с произвольным шагом h. S(x) накапливать до тех пор,
пока модуль очередного слагаемого не станет меньше ϵ, вводимого с клавиа­
туры. Вывести на экран таблицу значений функции Y(x) и её разложение
в ряд S(x). Близость значений Y(x) и S(x) во всём диапазоне значений x указывает на правильность их вычисления.
Задание 5. Написать программу для вычисления y по формуле:

Натуральное значение n введите с клавиатуры. Значение x (|x| < 1) также
вводится с клавиатуры.

13.1.2 Программирование задач обработки массивов в Scilab
Задание 1
1. Упорядочить по убыванию элементы целочисленного массива, расположенные между двумя наибольшими чётными значениями.
2. Упорядочить в порядке возрастания модулей элементы массива, расположенные между наибольшим и наименьшим значениями.
3. Упорядочить в порядке убывания модулей элементы, расположенные
между первым и последним отрицательными значениями массива.
4. Упорядочить в порядке убывания элементы, расположенные между вторым положительным и предпоследним отрицательным значениями массива.

13.1. Программирование в Scilab

419

5. Упорядочить по возрастанию элементы целочисленного массива, расположенные между первым числом-палиндромом и последним отрицательным значением.
6. Упорядочить в порядке возрастания суммы цифр элементы целочисленного массива, расположенные между последним числом-палиндромом
и первым простым числом.
7. Упорядочить по возрастанию модулей элементы целочисленного массива, расположенные между третьим и пятым простыми числами.
8. Упорядочить по убыванию элементы целочисленного массива, расположенные после минимального числа-палиндрома.
9. Удалить из целочисленного массива простые числа. В полученном массиве упорядочить по возрастанию модулей элементы, расположенные
после наибольшего числа.
10. Удалить из целочисленного массива числа-палиндромы. В полученном
массиве упорядочить по возрастанию модулей элементы, расположенные до наименьшего простого числа.
11. Удалить из целочисленного массива все составные числа. Упорядочить
элементы массива в порядке возрастания суммы цифр чисел.
12. Удалить из целочисленного массива все числа, состоящие из одинаковых
цифр. Упорядочить элементы массива в порядке убывания суммы их
цифр.
13. Задан массив целых положительных чисел. Сформировать новый массив,
куда записать элементы исходного массива, состоящие из одинаковых
цифр. Упорядочить элементы полученного массива в порядке возрастания суммы цифр чисел.
14. Упорядочить по возрастанию модулей элементы, расположенные между
двумя наименьшими значениями массива.
15. Упорядочить в порядке возрастания элементы, расположенные между
четвёртым и девятым отрицательными числами массива.
Задание 2
1. Задан массив целых чисел X(n). Все простые числа переписать в массив Y.
Из массива Y удалить 5 наибольших элементов массива.
2. Заданы массивы целых чисел X(n) и Y(k). Все совершенные числа из этих
массивов переписать в массив Z. В массиве Z найти четыре наименьших
элемента. Удалить из массива Z все нулевые элементы.
3. Заданы массивы целых чисел X(n) и Y(k). Два наибольших элемента из
массива X и пять последних простых чисел из массива Y переписать в массив Z. Проверить, содержит ли массив Z числа, в которых есть цифра 7.
4. Заданы массивы целых чисел X(n) и Y(k). Три наименьших простых числа
из массива Y и числа из массива X, в которых есть цифры 1 и 9, переписать в массив Z. Из массива Z удалить все нечётные числа.
5. Задан массив целых чисел X(n). Шесть наибольших чисел этого массива
переписать в массив Z. Удалить из массива Z все чётные числа.

420

Глава 13. Задания для самостоятельной работы в Scilab

6. Заданы массивы целых чисел X(n) и Y(k). Числа из массива X, в которых
нет нулей, и составные числа из массива Y, переписать в массив Z. Найти
в массиве Z пять наибольших нечётных чисел. Выполнить сортировку
массивов X, Y и Z в порядке возрастания их элементов.
7. В целочисленном массиве Z найти пять наибольших простых чисел. Удалить из массива Z все составные числа.
8. Задан массив целых положительных чисел X(n). Все простые числа длиной не более пяти цифр переписать в массив Y. Удалить из массива два
наибольших и три наименьших числа.
9. Найти сумму трёх наименьших и четырёх наибольших чисел целочисленного массива Z.
10. Заданы массивы целых положительных чисел X(n), Y(k), Z(m). Сформировать массив U из таких элементов массивов X, Y, Z, которые представляют
собой возрастающую последовательность цифр. Найти пять наибольших
чисел в массиве U.
11. Задан массив целых положительных чисел X(n). Все числа, в которых
нет цифр 1, 2 и 3, переписать в массив Y. Найти сумму двух наибольших
и трёх наименьших простых чисел в массиве Y.
12. Заданы массивы целых положительных чисел X(n), Y(k), Z(m). Сформировать массив U из таких элементов массивов X, Y, Z, которые состоят
из одинаковых цифр. Удалить из массива U наибольшее и наименьшее
числа. Выполнить сортировку массивов X(n), Y(k), Z(m) в порядке возрастания их элементов.
13. Задан массив целых положительных чисел X(n). Все числа, в которых
нет цифры ноль, а их длина не менее трёх цифр, переписать в массив Z.
Поменять местами наибольшее составное число и наименьшее простое
число в массиве Z.
14. Задан массив целых чисел X(n). Все положительные числа, состоящие из
одинаковых цифр, переписать в массив Z. Удалить из массива Z числа
с чётной суммой цифр.
15. Заданы массивы целых чисел X(n) и Y(k). Все числа с нечётной суммой
цифр переписать в массив Z. Найти три наибольших простых числа
в массиве Z.

13.1.3 Программирование задач обработки матриц в Scilab
Задание
1. Задана мат­ри­ца целых чисел A(n×m). Сформировать массив B(m), в который записать среднее арифметическое элементов каждого столбца заданной мат­ри­цы. Вывести номера строк мат­ри­цы, в которых находится
более двух простых чисел.
2. Задана мат­ри­ца вещественных чисел B(n×m). Сформировать массив A(n),
в который записать среднее геометрическое положительных элементов
каждой строки заданной мат­ри­цы. Определить количество столбцов,
упорядоченных по возрастанию.

13.1. Программирование в Scilab

421

3. Задана мат­ри­ца целых чисел A(n×n). Все простые числа, расположенные
на побочной диагонали, заменить суммой цифр максимального элемента
соответствующей строки мат­ри­цы. Сформировать массив B(n), в который
записать произведения элементов нечётных строк заданной мат­ри­цы.
4. В мат­ри­це целых чисел X(n×n) поменять местами диагональные элементы, упорядоченные по убыванию строк. Сформировать массив Y(n), в который записать суммы элементов чётных столбцов заданной мат­ри­цы.
5. Задана мат­ри­ца целых чисел A(n×n). Максимальный элемент каждого столбца заменить суммой цифр максимального элемента мат­ри­цы.
Сформировать массив B(n), в который записать количество чётных элементов в каждой строке заданной мат­ри­цы.
6. Задана мат­ри­ца целых чисел B(n×m). Максимальный элемент каждого
столбца заменить суммой цифр модуля минимального элемента мат­ри­
цы. Сформировать массив A(n), в который записать количество нечётных
элементов в каждой строке заданной мат­ри­цы.
7. Задана мат­ри­ца целых чисел A(n×n). Сформировать массив B(n) из максимальных элементов столбцов заданной мат­ри­цы. Вывести номера строк,
в которых числа-палиндромы находятся на диагоналях мат­ри­цы.
8. Задана мат­ри­ца вещественных чисел Р(n×m). Сформировать массив R(k)
из номеров столбцов мат­ри­цы, в которых есть хотя бы один ноль. Найти
строку с максимальной суммой элементов и поменять её с первой строкой.
9. Задана мат­ри­ца вещественных чисел C(k×m). Сформировать вектор D(k)
из средних арифметических положительных значений строк мат­ри­цы
ивектор G(n) из номеров столбцов, которые представляют собой знакочередующийся ряд.
10. В каждом столбце мат­ри­цы вещественных чисел Р(k×m) заменить минимальный элемент суммой положительных элементов этого же столбца.
Сформировать вектор D(n) из номеров строк, представляющих собой
знакочередующийся ряд.
11. В мат­ри­це целых чисел A(n×m) обнулить строки, в которых более двух
простых чисел. Сформировать вектор D(m) из минимальных значений
столбцов мат­ри­цы.
12. В мат­ри­це вещественных чисел Р(n×m) найти и вывести номера столбцов,
упорядоченных по убыванию элементов. Сформировать вектор R(n) из
максимальных значений строк мат­ри­цы.
13. В мат­ри­це вещественных чисел D(n×m) найти и вывести номера строк,
упорядоченных по возрастанию элементов. Сформировать вектор С(m×2)
из номеров минимальных и максимальных значений столбцов мат­ри­цы.
14. В мат­ри­це вещественных чисел Р(n×m) найти и вывести номера столбцов,
упорядоченных по возрастанию. Сформировать вектор R(n×2) из номеров минимальных и максимальных значений строк мат­ри­цы.
15. В мат­ри­це вещественных чисел D(n×m) найти и вывести номера строк,
упорядоченных по убыванию. Сформировать вектор С(m×2) из максимальных и минимальных значений столбцов мат­ри­цы.

422

Глава 13. Задания для самостоятельной работы в Scilab

13.2 Задания по теме «Решение задач линейной
алгебры»
Задание 1. Решить систему линейных алгебраических уравнений, сделать
проверку.

1.

.

9.

2.

.

10.

3.

.

11.

4.

.

5.

.

6.

7.

.

.

.

.

.

12.

.

13.

.

14.

15.

.

.

13.2. Задания по теме «Решение задач линейной алгебры»

8.

.

Задание 2. Если возможно, вычислить мат­ри­цу, обратную к мат­ри­це D.
1. D = 2(A2 + B)(2B - A), где

2. D = 3A - (A + 2B)B2, где

3. D = 3A2 - (A + 2B)B, где

4. D = (A - B2)(2A + B 3), где

5. D = 2(3A - 5B)(A2 + B2 ), где

6. D = (A - B)2A + 2B, где

423

424

7. D = (A2 - B 2 )(A + B 2 ), где

8. D = 2(A - B)(A2 + B), где

9. D = 2A - (A2 + B)B, где

10. D = 2(A - 0,5B) + A3B, где

11. D = (A - B)A2 + 3B, где

12. D = 3(A2 + B 2 ) - 2AB, где

13. D = 2A3 + 3B(AB - 2A), где

Глава 13. Задания для самостоятельной работы в Scilab

13.3. Задания по теме «Построение двумерных графиков»

14. D = A(A2 - B) - 2(B + A)B, где

15. D = (2A - B)(3A + B) - 2A2B, где

13.3 Задания по теме «Построение двумерных
графиков»
Задание 1. Изобразить график функции f(x).
1.

9.

2.

10.

3.

11.

4.

12.

5.

13.

6.

14.

7.

15.

8.
Задание 2. Изобразить график функции в полярных координатах.
1. ρ(φ) = -2sin(6φ).
2. ρ(φ) = 2cos6(φ).

9. ρ(φ) = 2φ2.
10. ρ(φ) = cos(φ) - sin(φ).

425

426

Глава 13. Задания для самостоятельной работы в Scilab

3. ρ(φ) = 2φ + 1.

11. ρ(φ) = cos(φ) + sin(φ).

4. ρ(φ) = 2cos23φ

12. ρ(φ) = 10cos(φ) + 5sin(φ).

5. ρ(φ) = 3φ + 2.

13. ρ(φ) = 2cos(φ) - 6sin(φ).

6. ρ(φ) = 3φ2 + φ.

14.

7. ρ(φ) = 3sin4φ.

15.

8. ρ(φ) = 1 + cos(φ).
Задание 3. Изобразить график функции, заданный параметрически [7, 11].
1.

9.

2.

10.

3.

11.

4.

12.

5.

13.

6.

14.

7.

15.

8.

427

13.4. Задания по теме «Построение трёхмерных графиков»

13.4 Задания по теме «Построение трёхмерных
графиков»
Задание 1. Построить трёхмерный график, заданный параметрически:

,

при помощи функции plot3d2.
1. 0 £ u £ 2π, 0 £ v £ 2π.

9. 0 £ u £ 4π, 0 £ v £ 6π.

2. 0 £ u £ 2π, 0 £ v £ 8π.

10. 0 £ u £ 72π, 0 £ v £ 72π.

3. 0 £ u £ 2π, 0 £ v £ 4π.

11. 0 £ u £ 2π, 0 £ v £ 5π.

4. 0 £ u £ 8π, 0 £ v £ 2π.

12. 0 £ u £ 4π, 0 £ v £ 78π.

5. 0 £ u £ 4π, 0 £ v £ 42π.

13. 0 £ u £ 3π, 0 £ v £ 8π.

6. 0 £ u £ 8π, 0 £ v £ 4π.

14. 0 £ u £ 2π, 0 £ v £ 32π.

7. 0 £ u £ 2π, 0 £ v £ 36π.

15. 0 £ u £ 2π, 0 £ v £ 96π.

8. 0 £ u £ 8π, 0 £ v £ 8π.
Задание 2. Изобразить линии, заданные параметрически:
,
с помощью функции param3d.


t



1

[0; 7π]

6

2

[π; 4π]

7

[0; 5π]

12

8

[2π; 9π]

13

9

[0; 2π]

14

10

[π; 7π]

15

3
4
5

[2π; 8π]

t



t

11

[0; 4π]

[π; 8π]

[0; 9π]

428

Глава 13. Задания для самостоятельной работы в Scilab

13.5 Задания по теме «Нелинейные уравнения
и системы»
Задание 1. Найти корни полиномов.
1. 1.1x4 - x - 0.9 = 0.
   x3 + x - 4 = 0.

9. 3.25x4 + 7.67x3 + 5x2 - 11 = 0.
   2x3 + 5x2 + 11x + 7 = 0.

2. 2х4 - x - 1.5 = 0.
   3x3 - 5x2 + 9x - 10 = 0.

10. 2.2x4 - 1.2x2 - 11 = 0.
   3x3 - 0.42x2 + 0.95x - 2 = 0.

3. 2х4 - 9.25x2 - 63x + 5 = 0.
   3x3 - 21x + 2 = 0.

11. -x4 - 18x2 + 6 = 0.
   2x3 - 0.08x2 + 0.94x + 1.3 = 0.

4. 0.9x4 + 4.2x3 - 8.5x2 - 13 = 0.
   5x3 + 13x - 11 = 0.

12. -1.21x4 + x3 + 2x2 - 3x - 5 = 0.
   3x3 - 13x2 + 16x - 15 = 0.

5. 3x4 + 4x3 - 12x2 - 5 = 0.
   x3 + 2x2 + 2 = 0.

13. 0.89x4 + 3.67x3 - 7.92x2 - 13 = 0.
   2x3 - 0.35x2 + 0.47x - 1.43 = 0.

6. 3.2x4 + 7.75x3 + 6.3x2 - 10.5 = 0.
   2x3 + 0.48x2 + 1.6x - 2.6 = 0.

14. 6x4 + 8x3 - 23x2 + 2.1 = 0.
   5x3 + 20x2 + 5x + 8 = 0.

7. 2x4 - 3x2 - 5 = 0.
   2x3 - 0.52x2 + 5.4x - 7.4 = 0.

15. 2x4 - 2x3 - 4x2 + 6x - 7 = 0.
   1.9x3 + 7x - 11 = 0.

8. 1.05x4 - 17x2 + 6 = 0.
   2x3 - 0.35x2 + 0.85x + 1 = 0.
Задание 2. Решить нелинейное уравнение.
1. x - cos x = 0.

9. 2 - x = ln x.

2. e-x - x2 = 0.

10. ex + x2 = 2.3.

3. x - 0.2sin(x + 0.5) = 0.

11. 3x - cos x = 1.

4. x2 - lg(x + 2) = 0.

12. 1.8x2 - sin 10x = 0.

5. x2 - cos x2 = 6.

13. 2ln x -

6. x2 - 20sin x = 0,14.

14.

7. (x - 1)2 - 0.5e x = 0.

15. x ln x - 100 = 0.

8.

x - 2cos x = 0.

= 0.

- lg x = 0.

429

13.6. Задания по теме «Численное интегрирование»

Задание 3. Решить систему уравнений.
1.

9.

2.

10.

3.

11.

4.

12.

5.

13.

6.

14.

7.

15.

8.

13.6

Задания по теме «Численное интегрирование»

Задание. Вычислить определённый интеграл.
1.

6.

11.

2.

7.

12.

3.

8.

13.

4.

9.

14.

5.

10.

15.

430

Глава 13. Задания для самостоятельной работы в Scilab

13.7 Задания по теме «Обработка
экспериментальных данных»
Задание 1. В результате эксперимента была определена некоторая табличная зависимость. С помощью метода наименьших квадратов определить
линию регрессии, рассчитать коэффициент корреляции, подобрать функциональную зависимость заданного вида, вычислить коэффициент регрессии. Построить график экспериментальной зависимости, линию регрессии
и график подобранной зависимости. Определить суммарную квадратичную
ошибку, среднюю и относительные ошибки для линии регрессии и подобранной функциональной зависимости. Написать программу на языке Scilab
для решения задачи. Исходные данные для программы хранятся в файле.
Структуру файла разработать самостоятельно. Решение проверить с по­
мощью встроенных функций Scilab.
1. P(s) = As3 + Bs2 + D.
s
P

0
12

1
10.1

1.5
11.58

2
17.4

2.5
30.68

3
53.6

3.5
87.78

4
136.9

4.5
202.5

2.5
6.71

3
7.215

3.5
7.611

4
7.83

4.5
8.19

5
8.3

5
287

2. G(s) = As3 + Bs + D.
s
G

0.5
3.99

1.5
5.65

2
6.41

3. V(s) = AsbeCs.
s
V

0.2
0.7
1.2
1.7
2.2
2.7
3.2
2.3198 2.8569 3.5999 4.4357 5.5781 6.9459 8.6621

4. W(s) = As3 + Bs2 + Cs + D.
s
W

1
0.529

2
0.298

3
0.267

4
0.171

5
0.156

6
0.124

7
0.1

8
0.078

9
0.075

1.75
3.672

2
4.592

2.25
4.621

2.5
5.758

2.75
7.173

3
9.269

5. Q(s) = As2 + Bs + C.
s
Q

1
5.21

1.25
4.196

1.5
3.759

6. Y(x) = Ax4 + Bx2 + Cx + D.
x
Y

3
0.61

3.1
0.6

3.2
0.592

3.3
0.58

3.4
0.585

3.5
0.583

3.6
0.582

3.7
0.57

3.8
0.572

3.9
0.571

U
V

0
12

1
10.1

1.5
11.58

2
17.4

2.5
30.68

3
53.6

3.5
87.78

4
136.9

4.5
202.5

5
287

1.74
59.36

2.08
82.6

2.63
90.63

3.12
113.5

7.

8. Z(t) = At4 + Bt3 + Ct2 + Dt + K.
t
Z

0.66
38.9

0.9
68.8

1.17
64.4

1.47
66.5

1.7
64.95

431

13.7. Задания по теме «Обработка экспериментальных данных»

9. R(h) = Ch2 + Dh + K.
h
R

2
0.035

4
0.09

6
0.147

8
0.2

10
0.24

12
0.28

14
0.31

16
0.34

1.8
5.5

2
7.1

2.2
9.1

2.4
11.1

2.6
12.9

0.8
3.0

1.2
6.0

1.6
7.7

2
13.6

0.86
7.5

0.14
13.33

1.43
16.67

1.71
23.33

1.82
27.8

2
33.35

1.43
12.5

1.57
17.1

1.71
22.2

1.86
28.3

1.92
35.3

2
36.5

2.38
22.86

2.5
26.71

2.63
31.86

2.75
37.0

2.88
43.43

3
49.86

0.93
0.31

0.94
0.43

0.96
0.57

0.97
0.71

0.99
0.86

1
0.97

10. Y(x) = Ax3 + Bx2 + Cx + D.
x
Y

1.2
1.5

1.4
2.7

1.6
3.9

2.8
15.5

3
17.9

11. Y(x) = Ax3 + Cx + D.
x
Y

0
1.2

0.4
2.2

12. R(h) = Ch2 + K.
h
R

0.29
3.33

0.57
6.67

13. Z(t ) = At 4 + Ct 2 + K.
t
Z

1
6.2

1.14
7.2

1.29
9.6

14. Z(t) = At 4 + Bt 3 + Dt + K.
t
Z

2
12.57

2.13
16.43

2.25
19

15. Z(t) = At 4 + Dt + K.
t
Z

0.88
0.029

0.9
0.086

0.91
0.17

Задание 2. В результате эксперимента была определена некоторая табличная зависимость. Вычислить ожидаемое значение функции в указанных точках. Построить график, на котором изобразить экспериментальные точки,
график интерполяционной зависимости, ожидаемое значение в указанных
точках. Реализовать следующие методы интерполяции:
z z интерполяционный полином Лагранжа;
z z интерполяционный полином Ньютона;
z z канонический полином;
z z функцию линейной интерполяции;
z z функцию сплайн-интерполяции.
Написать программу на языке Scilab для решения задачи. Исходные данные для программы хранятся в файле. Структуру файла разработать самостоятельно. Решение проверить с помощью встроенных функций Scilab.
1. x1 = 0.702, x2 = 0.512, x3 = 608.
x
y

0.43
1.63597

0.48
1.73234

0.55
1.87686

0.62
2.03345

0.7
2.22846

0.75
2.35973

432

Глава 13. Задания для самостоятельной работы в Scilab

2. x1 = 0.102, x2 = 0.203, x3 = 0.154.
x
y

0.02
1.02316

0.08
1.09509

0.12
1.14725

0.17
1.21423

0.23
1.30120

0.30
1.40907

0.56
1.59502

0.64
1.34310

0.65
1.74926

0.72
1.62098

0.93
1.34087

0.99
1.52368

0.35
2.73951

0.40
2.36522

1.395
5.62968

1.400
5.79788

0.323
2.98755

0.330
2.91950

0.619
0.55043

0.627
0.55598

0.135
1.16712

0.146
1.18191

3. x1 = 0.526, x2 = 0.453, x3 = 0.436.
x
y

0.35
2.73951

0.41
2.30080

0.47
1.96864

0.51
1.78776

4. x1 = 0.616, x2 = 0.478, x3 = 0.537.
x
y

0.41
2.57418

0.46
2.32513

0.52
2.09336

0.6
1.86203

5. x1 = 0.896, x2 = 0.774, x3 = 0.955.
x
y

0.68
0.80866

0.73
0.89492

0.80
1.02964

0.88
1.20966

6. x1 = 0.314, x2 = 0.235, x3 = 0.186.
x
y

0.11
9.05421

0.15
6.61659

0.21
4.69170

0.29
3.35106

7. x1 = 1.3832, x2 = 1.3926, x3 = 1.3866.
x
y

1.375
5.04192

1.380
5.17744

1.385
5.32016

1.390
5.47069

8. x1 = 0.308, x2 = 0.325, x3 = 0.312.
x
y

0.298
3.25578

0.303
3.17639

0.310
3.12180

0.317
3.04819

9. x1 = 0.608, x2 = 0.594, x3 = 0.631.
x
y

0.593
0.53205

0.598
0.53562

0.605
0.54059

0.613
0.54623

10. x1 = 0.115, x2 = 0.130, x3 = 0.164.
x
y

0.100
1.12128

0.108
1.13160

0.119
1.14594

0.127
1.15648

11. x1 = 0.720, x2 = 0.777, x3 = 0.700.
x
y

0
12

1
10.1

1.5
11.58

2
17.4

2.5
30.68

3
53.6

3.5
87.78

4
136.9

4.5
202.5

12. x1 = 0.238, x2 = 0.261, x3 = 0.275.
x
y

0.235
1.20800

0.240
1.21256

0.250
1.22169

0.255
1.22628

0.265
1.23547

0.280
1.24933

0.110
1.42815

0.112
1.48256

13. x1 = 0.105, x2 = 0.109, x3 = 0.111.
x
y

0.095
1.09131

0.102
1.23490

0.104
1.27994

0.107
1.35142

5
287

433

13.8. Задания по теме «Решение задач оптимизации»

14. x1 = 0.1817, x2 = 0.2275, x3 = 0.175.
x
y

0.180
5.61543

0.185
5.46693

0.190
5.32634

0.195
5.19304

0.200
5.06642

0.205
4.94619

3.70
40.4473

3.75
42.5211

15. x1 = 3.522, x2 = 4.176, x3 = 3.475.
x
y

3.50
33.1154

3.55
34.8133

3.60
36.5982

3.65
38.4747

13.8 Задания по теме «Решение задач
оптимизации»
Задание 1. Найти минимум функции одной переменной. Построить график
функции.
1. f(x) = ln(1 + x2) - sin x, x Î [0; π/4].
2. f(x) = · x4 + x2 - 8 · x + 12, x Î [0; 2].
3. f(x) = x3 - x + 1x, x0 Î [-2; 0].
4. f(x) = 2x2 5. f(x) =

, x Î [1; 5].

- 2x + 3x2 - e x/2, x Î [-2; 2].

6. f(x) = t 3 - 12t 2, t Î [0; 20].
7. f(x) = x4 - 12x3 + 47x2 - 60x, x Î [0; 3].
8. f(x) = x3 - 3x2 - x + 5, x Î [0; 3].
9. f(x) = x4 + 2x2 + 4x + 1, x Î [-1; 0].
10. f(x) = x2 + e-x, x Î [-1; 2].
11. f(x) = 2x + e-x, x Î [-3; 3].
12. f(x) = x2 + x + sin x, x Î [-2; 1].
13. f(x) = x2 - x + e-x, x Î [0; 2].
14. f(x) = 2x2 - 5 - 2x, x Î [-2; 2].
15. f(x) = 2.3x3 - 5x2 - 2, x Î [0.5; 3].
Задание 2. Решить задачу линейного программирования.
1. W = 2x1 - x2 + x4 → min.

  

2. W = x1 + x3 → max.

   

434

Глава 13. Задания для самостоятельной работы в Scilab

3. W = 3 + 2x2 + x3 → max.

  
4. W = x3 + 3x4 → min.

  
5. W = -x1 + x2 → max.

10. W = -4 - 2x1 - x2 - x3 → min.

  
11. W = x1 + x2 + x3 + 1 → min.

  
12. W = 2 + 2x2 - x3 + 3x4 → max.

  
  
6. W = x1 - x2 - 2x4 → max.
13. W = x1 + x2 + 3 → max.

  
  
7. W = x1 - x2 + 3x3 + x4 → max.
14. W = x1 - 10x2 + 100x3 → max.

  
  
8. W = -x2 - 2x3 + x4 → min.
15. W = -3 + x1 + 3x2 + 5x3 → max.

  
  
9. W = x1 + x2 + 3x3 - x4 → max.

  

Литература
[1] Алексеев Е. Р., Чеснокова О. В. Решение задач вычислительной математики в пакетах Mathcad 12, MATLAB 7, Maple 9. – М.: НТ-Пресс, 2006. – 496с.
[2] Алексеев Е. Р., Чеснокова О. В., Рудченко Е. А. Scilab: Решение инженерных
и математических задач. – М.: ALT Linux; Бином, 2008. – 260с.
[3] Алексеев Е. Р., Чеснокова О. В. Введение в Octave для инженеров и математиков. – М.: ALT Linux, 2011. – 368с.
[4] Андриевский А. Б., Андриевский Б. Р., Капитонов А. А., Фрадков А. Л. Решение инженерных задач в Scilab. – СПб.: Литмо, 2013. – 98с.
[5] Березин И. С., Жидков Н. П. Методы вычислений. Т. 1. – М.: Физматгиз,
1962. – 464с.
[6] Березин И. С., Жидков Н. П. Методы вычислений. Т. 2. – М.: Физматгиз,
1962. – 640с.
[7] Блинова И.В ., Попов И. Ю. Кривые, заданные параметрически и в полярных координатах: учеб. пособие. – СПб.: Университет ИТМО, 2017. – 56 с.
[8] Вержбицкий В. М. Основы численных методов. – М.: Высшая школа,
2002. – 840 с.
[9] Голосков Д. П. Уравнения математической физики. Решение задач в системе Maple. – СПб.: Питер, 2004. – 539 с.
[10] Квасов Б. И. Численные методы анализа и линейной алгебры. – СПб.:
Лань, 2016. – 328с.
[11] Сильванович О. В. Лабораторный практикум по высшей математике.
Специальные кривые. – СПб.: Университет ИТМО, 2018. – 62 с.
[12] Титов А. Н., Тазиева Р. Ф. Решение задач линейной алгебры и прикладной математики в среде Scilab / Казан. нац. исслед. технол. ун-т. – Казань: Изд-во КНИТУ, 2020. – 98 с.
[13] Тихонов А. Н., Самарский А. А. Уравнения математической физики. – М.:
Наука, 1966. – 724 с.
[14] Тропин И. С., Михайлова О. И., Михайлов А. В. Численные и технические
расчёты в среде Scilab. – М.: 2008. – 65 с.
[15] Шарый С. П. Курс вычислительных методов. – Новосибирск, 2022. – 691с.
[16] www.freefem.org.

Предметный указатель

А
Алгоритм нахождения корней
полинома, 276
Аппроксимация, 334
Арифметические операции, 18

В
Ввод команд, 15
Вектор, 47
вектор-столбец, 80
вектор-строка, 80
действие
.*, 78
./, 78
вычитание, 75
деление на число, 76
поэлементное преобразование, 77
сложение, 74
умножение, 76
умножение на число, 76
действия, 74
неизвестных, 119
правых частей, 119
свободных членов, 119
функция
cross, 90
cumprod, 89
cumsum, 89
diff, 90
gsort, 90
length, 88
max, 90
mean, 90

min, 90
prod, 89

Г
Главное меню, 16
Графическое окно, 241

Д
Дифференциальное уравнение
в частных производных
гиперболическое, 366
Лапласа, 366
метод сеток, 367
неявная двухслойная разностная
схема, 372, 376
параболическое, 366
эллиптическое, 366
явная двухслойная разностная
схема, 369
Дифференциальные уравнения, 309
метод
Адамса, 314
Кутта–Мерсона, 313
Милна, 315
Милна модифицированный, 316
Рунге–Кутта, 313
Рунге–Кутта второго порядка, 313
Рунге–Кутта четвёртого
порядка, 313
Хойна, 313
Эйлера, 311
Эйлера модифицированный, 312
система, 310

Предметный указатель

Дифференцирование, 303
по Ньютону, 301

З
Зона
просмотра, 15
редактирования, 15

И
Индекс корреляции, 339
Интегрирование внешних
функций, 300
Интерполяция, 351
канонический полином, 352
кубический сплайн, 356
линейная интерполяция, 360
линейный сплайн, 360
полином Лагранжа, 355
полином Ньютона, 353

К
Командная строка, 15
Компонент
командная кнопка, 251
метка, 254
окно редактирования, 259
переключатель, 256
список строк, 262
таблица, 263
флажок, 256
Коэффициент
корреляции, 339
регрессии, 339
Критерий Стьюдента, 339

Л
Линия регрессии, 339

М
Массив, 47
Матрица, 47
вектор-столбец, 80
вектор-строка, 80
верхняя треугольная, 80, 128
вырожденная, 81
действие
–, 84
*, 84

437

+, 84
вычитание, 81
поэлементное преобразование, 84
сложение, 81
транспонирование, 82
умножение, 83
умножение на число, 82
диагональная, 80
единичная, 80
инволютивная, 117
кососимметрическая, 116
коэффициентов, 119
минор, 120
невырожденная, 81
нижняя треугольная, 80
норма, 134
нулевая, 80
обратная, 81
определитель, 80
ортогональная, 117, 128
перестановочная, 81
произведение, 81
равенство, 81
разность, 81
ранг, 120
расширенная, 119
решение линейных систем, 86, 119
симметрическая, 116
системы, 119
собственное значение, 131
собственное подпространство, 132
собственный вектор, 131
сумма, 81
транспонированная, 81
умножение на число, 82
уравнение, 118
функция
cat, 105
chol, 113
cond, 110
cumprod, 91
cumsum, 92
det, 108
diag, 101
expm, 97
eye, 99
full, 98

438

gsort, 94
hypermat, 98
inv, 110
kernel, 115
linsolve, 111
linspace, 103
logm, 97
logspace, 104
lu, 113
matrix, 97
max, 92
mean, 93
median, 93
min, 93
norm, 109
ones, 99
pinv, 111
prod, 91
qr, 114
rand, 102
randn, 103
rank, 109
rcond, 110
repmat, 104
rref, 112
size, 98
sparse, 98
spec, 112
sqrtm, 96
sum, 91
svd, 114
trace, 109
tril, 107
triu, 108
zeros, 100
характеристический
многочлен, 132
характеристическое уравнение, 132
число обусловленности, 134
LU-разложение, 126
LU-факторизация, 126
QR-разложение, 128
Метод наименьших квадратов, 333

Предметный указатель

метод
дихотомии, 268
касательных, 270
половинного деления, 268
простой итерации, 271
секущих, 272
хорд, 269

О
Окно приложения, 14
Оператор
присваивания, 19
break, 46
continue, 46
disp, 31
for-end, 45
if-else-end, 36
if-elseif-end, 37
if-end, 35
input, 31
select, 41
switch-case-end, 43
while-end, 43
Определённый интеграл, 292
квадратурная формула
Гаусса, 295
Ньютона–Котеса, 294
Чебышёва, 296
метод
Симпсона, 293
трапеций, 293
формула
Ньютона–Котеса, 295
Ньютона–Лейбница, 292
Ошибка
относительная, 338
средняя, 338
суммарная квадратичная, 338

П
Переменная, 19
Полином, 275, 283
Правило Рунге, 295

Н

С

Нелинейное уравнение
интервал изоляции, 267, 268

Сессия, 16
Система линейных уравнений, 119

439

Предметный указатель

cat, 105
close, 246
comet, 239
costf, 387
delete, 246
diff, 301
evstr, 32
figure, 241
fsolve, 287, 290
function (команда), 63
integrate, 300
intg, 300
inttrap, 300
karmarkar, 393
mfprintf, 57
mfscanf, 57
mopen, 56
numderivative, 303
ode, 326
optim, 387
pmodulo, 42
poly, 283
qld, 397
roots, 289
uicontrol, 247
x_dialog, 32

базисное решение, 120
метод
Гаусса, 123
обратной матрицы, 122
множество решений, 119
неоднородная, 119
неопределённая, 119
несовместная, 119
общее решение, 120
однородная, 119
определённая, 119
правило Крамера, 120
решение, 119
совместная, 119
тривиальное решение, 119
частное решение, 120
эквивалентная, 119
Системная переменная, 21

У
Уравнение
алгебраическое, 275, 284
нелинейное, 267
система, 290
трансцендентное, 267

Ф
Файл-сценарий, 16
Функция, 24
bar, 172

Э
Экстраполирование, 352

Книги издательства «ДМК ПРЕСС»
можно купить оптом и в розницу
в книготорговой компании «Галактика»
(представляет интересы издательств
«ДМК ПРЕСС», «СОЛОН ПРЕСС», «КТК Галактика»).
Адрес: г. Москва, пр. Андропова, 38, оф. 10;
тел.: (499) 782-38-89, электронная почта: books@alians-kniga.ru.
При оформлении заказа следует указать адрес (полностью),
по которому должны быть высланы книги;
фамилию, имя и отчество получателя.
Желательно также указать свой телефон и электронный адрес.
Эти книги вы можете заказать и в интернет-магазине:
http://www.galaktika-dmk.com/.

Учебное издание
Серия «Библиотека ALT»
Евгений Ростиславович Алексеев,
Кристина Вячеславовна Дога,
Оксана Витальевна Чеснокова

Scilab
Решение инженерных и математических задач
Главный редактор

Мовчан Д. А.

dmkpress@gmail.com

Редактор серии
Редактор
Корректор
Вёрстка
Дизайн обложки

Чёрный В. Л.
Губина Т. Н.
Синяева Г. И.
Чаннова А. А.
Осмоловская А. С.

Издание доступно в РИНЦ по адресу https://elibrary.ru.
ООО «Базальт СПО»
Адрес для переписки: 127015, Москва, Бутырская ул, д. 75, оф. 301
Телефон: (495) 123-47-99. E-mail: sales@basealt.ru.
https://www.basealt.ru
Гарнитура PT Serif. Печать цифровая.
Усл. печ. л. 35,75. Тираж 200 экз.
Веб-сайт издательства: www.dmkpress.com