- •§ 2.2. Командное окно системы matlab
- •§ 2.3. Рабочее пространство системы matlab
- •§ 2.4. Скаляры и массивы. Индексированные переменные
- •§ 2.5. Форматы представления вещественных чисел
- •§ 2.6. Арифметические выражения
- •2.6.1. Некоторая специфика использования вещественных данных
- •2.6.2. Некоторая специфика использования комплексных данных
- •2.6.3. Некоторые приемы работы с матрицами и векторами
- •2.6.4. Некоторые специфика выполнения арифметических и логических операций.
- •§ 2.7. Элементарные математические функции
- •Часть 2. Визуализация результатов вычислений
- •§ 2.8. Особенности графической подсистемы matlab
- •§ 2.9. Построение графиков функций одной переменной
- •2.9.1. Простые графики в декартовой системе координат.
- •2.9.2. Визуализация нескольких графиков.
- •2.9.3. Функция fplot.
- •2.9.4. Построение графиков в логарифмическом и полулогарифмическом масштабах.
- •2.9.5. Построение графиков в полярных координатах.
- •§ 2.10. Оформление графиков и графических окон
- •2.10.1. Выбор свойств линий.
- •2.10.2. Оформление осей координат.
- •2.10.3. Добавление надписей, заголовков и координатной сетки.
- •§ 2.11. Средства управления в графическом окне
- •§ 2.12. Общее знакомство с трехмерной графикой в matlab
- •2.12.1. Общий алгоритм визуализации функций двух переменных.
- •2.12.2. Построение трехмерных линий.
- •2.12.3. Построение поверхностей.
- •2.12.4. Задание дополнительных параметров трехмерных графиков.
- •2.12.5. Построение линий уровня.
- •2.12.6. Построение траектории точки, движущейся в пространстве.
- •2.12.7. Интерактивное редактирование графиков.
- •Часть 3. Вычисления с действительными и комплексными массивами чисел
- •§ 2.13. Операции отношения и логические операции над числами
- •2.13.1. Операции отношения.
- •2.13.2. Логические операции.
- •2.13.3. Приоритет операций.
- •§ 2.14. Формирование одномерных числовых массивов
- •2.14.1. Задание одномерных массивов и доступ к их элементам.
- •2.14.2. Об ускорении операций задания массива.
- •2.14.3. Об использовании операции формирования диапазона.
- •§ 2.15. Матрицы и векторы. Двумерные массивы чисел
- •2.15.1. Создание матриц и векторов.
- •2.15.2. Доступ к отдельным фрагментам матриц.
- •2.15.3. Удаление строк и столбцов матрицы.
- •2.15.4. Использование функций перестановки частей матриц.
- •2.15.5. Определение размеров и размерностей массивов.
- •2.15.6. Использование операций индексации.
- •2.15.7. Изменение размеров массива.
- •2.15.8. Специальные функции формирования массивов.
- •§ 2.16. Вычисления с массивами
- •2.16.1. Поэлементные и групповые операции над массивами.
- •2.16.2. Решение некоторых типовых задач линейной алгебры и аналитической геометрии.
- •2.16.3. Применение операций отношения и логических операций к массивам.
- •2.16.4. Некоторые функции для работы с массивами.
- •Часть 4. Стандартные средства решения некоторых типовых задач линейной алгебры и математического анализа
- •§ 2.17. Решение систем линейных алгебраических уравнений
- •§ 2.18. Решение некоторых задач линейной алгебры. Матричные функции
- •§ 2.19. Разреженные матрицы
- •§ 2.20. Решение нелинейных уравнений
- •§ 2.21. Поиск минимального значения функции
- •§ 2.22. Численное интегрирование
- •2.22.1. Использование метода трапеций.
- •2.22.2. Использование методов Симпсона и Гаусса-Лобатто.
- •2.22.3. Вычисление двойных интегралов.
- •§ 2.23. Операции над полиномами
- •2.23.1. Вычисление значения полинома.
- •2.23.2. Вычисление корней полинома.
- •2.23.3. Умножение и деление полиномов.
- •2.23.4. Дифференцирование и интегрирование полиномов.
- •§ 2.24. Интерполяция и аппроксимация данных
- •2.24.1. Полиномиальная аппроксимация.
- •2.24.2. Интерполяция сплайнами.
- •Часть 5. Символьные вычисления
- •§ 2.25. Создание символьных переменных, выражений и матриц
- •2.25.1. Создание символьных переменных.
- •2.25.2. Создание символьных выражений.
- •2.25.3. Создание символьных матриц.
- •§ 2.26. Символьные вычисления
- •2.26.1. Символьное дифференцирование.
- •2.26.2. Вычисление пределов.
- •2.26.3. Символьное интегрирование.
- •2.26.3. Вычисление суммы ряда. Разложение функций в ряды.
- •2.26.4. Упрощение выражений. Подстановки.
- •2.26.5. Управление точностью вычислений.
- •2.26.6. Операции над векторами. Операции над матрицами. Некоторые операции линейной алгебры.
- •2.26.7. Решение уравнений и систем уравнений.
- •§ 2.27. Визуализация результатов символьных вычислений
- •2.27.1. Построение двумерных графиков.
- •2.27.2. Построение трехмерных графиков.
- •Часть 6. Основы программирования на m-языке
- •§ 2.28. Основные понятия программирования в системе matlab
- •2.28.1. Назначение языка программирования matlab.
- •2.28.2. Основные средства программирования.
- •2.28.3. Основные типы данных.
- •2.28.4. Виды программирования.
- •2.28.5. Двойственность операторов, команд и функций.
- •2.28.6. Некоторые ограничения.
- •§ 2.29. Создание и использование m-файлов
- •2.29.1. Понятие об m-файлах.
- •2.29.2. Типы m-файлов.
- •2.29.3. Создание файл-программ.
- •2.29.4. Создание файл-функций.
- •2.29.5. Глобализация переменных и функций.
- •2.29.6. Синтаксический контроль программ.
- •§ 2.30. Управляющие структуры
- •2.30.1. Понятие об управляющих структурах.
- •2.30.2. Операторы цикла.
- •2.30.3. Операторы ветвления.
- •2.30.4. Прочие операторы.
- •§ 2.31. Работа с файлами
- •2.31.1. Общие замечания.
- •2.31.2. Подготовка файла к работе.
- •2.31.3. Завершение работы с файлами.
- •2.31.4. Контроль за исчерпанием данных.
- •2.31.5. Чтение из текстового файла.
- •2.31.6. Анализ ошибок в файловых операциях.
- •§ 2.32. Форматный ввод-вывод данных
- •2.32.1. Форматные преобразования (sprintf, sscanf).
- •2.32.2. Форматные преобразования при работе с файлами (fprintf, fscanf).
- •§ 2.33. Рекурсивные файл-функции. Производительность файл-функций
- •2.33.1. Понятие о рекурсивных файл-функциях.
- •2.33.2. Оценка производительности файл-функции.
- •§ 2.34. Файл-функции с переменным числом входных параметров и выходных значений
- •§ 2.35. Диалоговые программы
- •2.35.1. Ввод числовых и символьных данных.
- •2.35.2. Вывод результатов вычислений.
- •§ 2.36. Анимационные эффекты
- •§ 2.37. Контроль входных и выходных параметров файл-функции
- •§ 2.38. Отладка программы
- •2.38.1. Понятие о способах отладки программы.
- •2.38.2. Рекомендации по созданию и отладке программ.
- •Часть 7. Создание программ с визуальным интерфейсом
- •§ 2.39. Понятие о графическом интерфейсе пользователя (gui)
- •2.39.1. Предварительные замечания.
- •2.39.2. Основные команды для создания gui.
- •§ 2.40. Общие сведения о визуальной среде guide
- •§ 2.41. Программирование событий в matlab
- •§ 2.42. Свойства основных компонентов в matlab
- •§ 2.43. Диалоговые окна в matlab
- •§ 2.44. Динамическое создание компонентов
- •§ 2.45. Создание меню
- •§ 2.46. Некоторые рекомендации по созданию приложений с графическим интерфейсом пользователя
§ 2.19. Разреженные матрицы
При решении широкого круга прикладных проблем, например, при численном решении краевых задач для дифференциальных уравнений в частных производных (в частности, при использовании метода конечных элементов), возникают матрицы значительного порядка, большинство элементов которых равны нулю. Очевидно, что обычное хранение таких матриц приводит к неэффективному использованию памяти компьютера и соответственно к снижению быстродействия вычислений. В системе MATLAB данная проблема преодолевается введением для таких матриц специальных структур данных, называемых разреженными матрицами. Для создания массива, в котором хранится разреженная матрица, используется функция sparse:
>> A=[0 1 0 0; 0 0 1 0; 0 0 0 1; -4 0 0 0]
A =
0 1 0 0
0 0 1 0
0 0 0 1
-4 0 0 0
>> S=sparse(A)
S =
(4,1) -4
(1,2) 1
(2,3) 1
(3,4) 1
>> whos S
Name Size Bytes Class Attributes
S 4x4 104 double sparse
>> whos A
Name Size Bytes Class Attributes
A 4x4 128 double
Приведенный пример демонстрирует, что функция sparse размещает в памяти компьютера только лишь индексы ненулевых элементов и их значения, при этом матрица S является переменной типа sparse array, занимает в памяти меньше места, чем исходная матрица A.
Обратное преобразование разреженной матрицы в обычную производится функцией full:
>> full(S)
ans =
0 1 0 0
0 0 1 0
0 0 0 1
-4 0 0 0
В заключение отметим, что в системе MATLAB для операций с разреженными матрицами имеется большое количество функций, с подробной справочной информацией о которых можно ознакомится, например, в [70].
§ 2.20. Решение нелинейных уравнений
Во многих практических приложениях на определенном этапе возникает задача определения корней уравнений (в общем случае нелинейных) вида f(x)=0, где f(x) – действительная функция одной переменной x. Как известно, с геометрической точки зрения задача о нахождении решения уравнения вида f(x)=0 сводится к нахождению координат точек пересечения графика функции f(x) с осью абсцисс, т.е. к задаче о нахождении нулей функции f(x).
Для нахождения решения рассматриваемой задачи в системе MATLAB используется функция fzero:
fzero(hFunction,x0)
где hFunction – дескриптор функции, задающий исходное уравнение; x0 – начальное приближение к корню (заметим, что аргумент x0 может быть задан в виде скалярного значения, вблизи которого возможно наличие корня, либо в виде вектора из двух значений [x0s x0f] (причем x0s<x0f), элементы которого представляют собой интервал, на границе которого функция, заданная дескриптором hFunction имеет разные знаки, означающие наличие хотя бы одного корня на соответствующем интервале).
Функция fzero возвращает значение нуля вещественнозначной функции, зависящей от одной вещественной переменной и заданной дескриптором hFunction в окрестности точки x0.
Рассмотрим в качестве примера задачу
о нахождении нулей функции
на отрезке
.
В качестве начального приближения
выберем x0=pi/4.
Имеем:
>> x0=pi/4;
>> x=fzero(@sin,x0)
x =
8.4566e-28
В качестве нуля функции получено значение, практически идентичное точному значению корня, равному 0. Дескриптор функции здесь получен с помощью символа «@» и имени функции.
Если требуется найти корень функции,
не являющейся встроенной в систему
MATLAB (т.е. не имеющей в
MATLAB фиксированного имени),
то следует использовать функцию inline,
например, при поиске нулей функции
будем иметь:
>> f=inline('sin(x)-x','x')
f =
Inline function:
f(x) = sin(x)-x
>> x=fzero(f,pi/4)
x =
-1.6901e-08
>> f(x)
ans =
0
Альтернативный способ заключается в создании в текстовом редакторе файла, содержащего описание данной функции, который следует сохранить в текущем каталоге. При этом имя функции должно совпадать с именем файла. В рассматриваемом примере, в частности,
function y=MyFunction(x)
y=sin(x)-x
после чего обратиться к функции fzero:
>> x=fzero(@MyFunction,pi/4)
или, что эквивалентно,
>> x=fzero('MyFunction',pi/4)
Для управления величиной погрешности, следует обратиться к функции fzero, используя следующий синтаксис:
>> fzero(hFunction,x0,options)
где параметр options задает разнообразные дополнительные требования к работе функции fzero, в частности, требуемую величину погрешности, при этом значение параметра options можно устанавливать посредством специальной функции optimset:
>> options=optimset('TolX',1e-8)
В приведенном примере обращения к
функции optimset
было указано имя дополнительного
параметра TolX
(сокращение от Tolerance of
X; перевод с английского
языка – точность нахождения корня), а
также его числовое значение (
).
>> options=optimset('TolX',1e-3);
>> x=fzero(f,pi/4)
x =
-1.6901e-08
>> x=fzero(f,pi/4,options)
x =
-2.2912e-04
>> f(x)
ans =
2.0048e-12
>> options=optimset('TolX',1e-8);
>> x=fzero(f,pi/4,options)
x =
-2.1238e-08
>> f(x)
ans =
0
На практике также часто встречаются
задачи поиска комплексных корней
вещественнозначных многочленов
(полиномов). Для решения такого рода
проблем в системе MATLAB
имеется функция roots,
которой в качестве аргумента передается
массив коэффициентов многочлена. Так,
например, для многочлена
будем иметь:
>> Coeff=[1 -3 3 -3 2]
Coeff =
1 -3 3 -3 2
>> r=roots(Coeff)
r =
2.0000 + 0.0000i
0.0000 + 1.0000i
0.0000 - 1.0000i
1.0000 + 0.0000i
т.е. рассматриваемый многочлен имеет
два действительных корня (1.0 и 2.0) и два
комплексно сопряженных корня (
и
),
что полностью согласуется с соответствующими
аналитическими значениями.
Большое значение при использовании
функции fzero
имеет выбор начального приближения.
Чтобы сделать этот выбор корректным
целесообразно предварительно отобразить
график соответствующей функции
,
воспользовавшись для этих целей,
например, функцией fplot,
обращение к которой может иметь вид:
fplot(hFunction,[x0 xl])
В результате будет построен график функции с дескриптором hFunction, равным @name (name – имя функции) на отрезке от x0 до xl. Таким образом, можем записать (рис. 2.20.1):
>> fplot(f,[-pi/2,pi/2])
>> fplot(@MyFunction,[-pi/2,pi/2])
>> fplot('MyFunction',[-pi/2,pi/2])
В заключение отметим, что для решения систем нелинейных уравнений вида F(x)=0 (где x – вектор или матрица неизвестных; F – функция, значением которой является вектор или матрица) в системе MATLAB имеется функция fsolve. Для получения более подробной информации о последней следует обратиться к справочной системе MATLAB.
