- •§ 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.26.5. Управление точностью вычислений.
Вычислить значение символьного выражения или переменной в системе MATLAB позволяет функция
[name]=vpa(expr [, n])
где expr – символьное выражение или переменная; n – параметр, задающий точность вычислений (по умолчанию равный 32).
Точность вычислений в системе MATLAB (число значащих цифр после запятой, используемых в численных расчетах), задается посредством команды digits, а вычисления с заданной точностью осуществляет команда vpa (Variable Precision Arithmetic – в переводе с английского языка «арифметика с переменной точностью»):
>> digits(10)
>> vpa(pi)
ans =
3.141592654
>> digits(50)
>> vpa(pi)
ans =
3.1415926535897932384626433832795028841971693993751
2.26.6. Операции над векторами. Операции над матрицами. Некоторые операции линейной алгебры.
Численные решения некоторых задач линейной алгебры рассматривались в четвертой части настоящей главы. Большинство представленных там функций могут работать с символьными объектами. Рассмотрим далее наиболее распространенные из них.
Начнем с операций над векторами.
Функция length(a) используется для определения длины вектора a:
>> syms x y z
>> length([x y z])
ans =
3
Функция prod(a) вычисляет произведение элементов вектора a:
>> syms x y z
>> prod([x y z])
ans =
x*y*z
Функция sum(a) вычисляет сумму элементов вектора a:
>> syms x y z
>> sum([x y z])
ans =
x + y + z
Функция mean(a) вычисляет среднее арифметическое вектора a:
>> syms x y z
>> mean([x y z])
ans =
x/3 + y/3 + z/3
Функция dot(a,b) вычисляет скалярное произведение векторов a и b:
>> a1=sym('[x1 y1 z1]');
>> a2=sym('[x2 y2 z2]');
>> dot(a1,a2)
ans =
x2*conj(x1) + y2*conj(y1) + z2*conj(z1)
Функция cross(a,b) вычисляет векторное произведение векторов a и b:
>> a1=sym('[x1 y1 z1]');
>> a2=sym('[x2 y2 z2]');
>> cross(a1,a2)
ans =
[ y1*z2 - y2*z1, x2*z1 - x1*z2, x1*y2 - x2*y1]
Функция sort(a) выполняет упорядочивание элементов вектора a:
>> syms a b c d e f g h i j k
>> sort([k d j a i b g c e h f])
ans =
[ a, b, c, d, e, f, g, h, i, j, k]
Рассмотрим теперь с операции над матрицами.
Функция diag(a [, k]) возвращает квадратную матрицу с элементами вектора a на главной или на k-ой диагонали. Функция diag(A [, k]), где A – ранее определенная матрица, в качестве результата выдаст вектор-столбец, содержащий элементы главной или k-ой диагонали матрицы A. Имеем:
>> syms a b c d e f g h i j k
>> diag([a b c])
ans =
[ a, 0, 0]
[ 0, b, 0]
[ 0, 0, c]
>> diag([f,h],2)
ans =
[ 0, 0, f, 0]
[ 0, 0, 0, h]
[ 0, 0, 0, 0]
[ 0, 0, 0, 0]
>> diag([i,j],-2)
ans =
[ 0, 0, 0, 0]
[ 0, 0, 0, 0]
[ i, 0, 0, 0]
[ 0, j, 0, 0]
>> M=[a b c; d e f; h i k]
M =
[ a, b, c]
[ d, e, f]
[ h, i, k]
>> diag(M)
ans =
a
e
k
Функция repmat(A, n [, m]) формирует матрицу, состоящую из n на n или n на m копий матрицы A, причем если A – скаляр, то формируется матрица, элементы которой равны по величине значению A. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i]
A =
[ a, b, c]
[ d, e, f]
[ g, h, i]
>> repmat(A,2)
ans =
[ a, b, c, a, b, c]
[ d, e, f, d, e, f]
[ g, h, i, g, h, i]
[ a, b, c, a, b, c]
[ d, e, f, d, e, f]
[ g, h, i, g, h, i]
Функция reshape(A, m, n) возвращает матрицу размерности m на n, сформированную из A путем последовательной выборки по столбцам (если матрица A не имеет m на n элементов, то выдается сообщение об ошибке):
>> syms a b c d e f
>> A=[a b c; d e f]
A =
[ a, b, c]
[ d, e, f]
>> reshape(A,3,2)
ans =
[ a, e]
[ d, c]
[ b, f]
Функция cat(n, A, B [, C, ...]) объединяет матрицы A и B или все входящие матрицы A, B, C и т.д. Имеем:
>> syms a b c d e f g h
>> A=[a b; c d]
A =
[ a, b]
[ c, d]
>> B=[e f; g h]
B =
[ e, f]
[ g, h]
>> cat(1,A,B)
ans =
[ a, b]
[ c, d]
[ e, f]
[ g, h]
>> cat(2,A,B)
ans =
[ a, b, e, f]
[ c, d, g, h]
Функция rot90(A [, k]) осуществляет поворот матрицы A на 90 градусов или на величину 90k, где k – целое число. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i]
A =
[ a, b, c]
[ d, e, f]
[ g, h, i]
>> rot90(A)
ans =
[ c, f, i]
[ b, e, h]
[ a, d, g]
Функция tril(A [, k]) формирует из матрицы A нижнюю треугольную матрицу, начиная с главной или с k-ой диагонали. Функция triu(A [, k]) формирует из матрицы A верхнюю треугольную матрицу, начиная с главной или с k-ой диагонали. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i]
A =
[ a, b, c]
[ d, e, f]
[ g, h, i]
>> tril(A)
ans =
[ a, 0, 0]
[ d, e, 0]
[ g, h, i]
>> triu(A)
ans =
[ a, b, c]
[ 0, e, f]
[ 0, 0, i]
Функция size(A) определяет число строк и столбцов матрицы A, результатом ее работы является вектор [n m], где n – количество строк, а m – количество столбцов. Имеем:
>> syms a b c d e f
>> A=[a b c; d e f]
A =
[ a, b, c]
[ d, e, f]
>> size(A)
ans =
2 3
Функция prod(A [, k]) формирует вектор-строку (или вектор-столбец), в зависимости от значения k, каждый элемент которой является произведением элементов соответствующего столбца (или строки) матрицы A. Если значение параметра k в конструкции отсутствует, то по умолчанию вычисляются произведения столбцов матрицы. Очевидно, что результатом работы функции prod(prod(A)) является произведение всех элементов матрицы A. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i]
A =
[ a, b, c]
[ d, e, f]
[ g, h, i]
>> prod(A)
ans =
[ a*d*g, b*e*h, c*f*i]
>> prod(prod(A))
ans =
a*b*c*d*e*f*g*h*i
Функция sum(A [, k]) формирует вектор-строку (или вектор-столбец), в зависимости от значения k, каждый элемент которой является суммой элементов соответствующего столбца (или строки) матрицы A. Если значение параметра k в конструкции отсутствует, то по умолчанию вычисляются суммы столбцов матрицы. Результатом работы функции sum(sum(A)) является произведение всех элементов матрицы A. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i];
>> sum(A)
ans =
[ a + d + g, b + e + h, c + f + i]
>> sum(sum(A))
ans =
a + b + c + d + e + f + g + h + i
Функция mean(A [, k]) формирует вектор-строку (или вектор-столбец), в зависимости от значения k, каждый элемент которой является средним арифметическим значением элементов соответствующего столбца (или строки) матрицы A. Если значение параметра k в конструкции отсутствует, то по умолчанию вычисляются средние арифметические значения элементов столбцов матрицы. Результат работы функции sum(sum(A)) – среднее арифметическое значение всех элементов матрицы A. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i];
>> mean(A)
ans =
[ a/3 + d/3 + g/3, b/3 + e/3 + h/3, c/3 + f/3 + i/3]
>> mean(mean(A))
ans =
a/9 + b/9 + c/9 + d/9 + e/9 + f/9 + g/9 + h/9 + i/9
Функция sort(A) выдает матрицу того же размера, что и A, каждый элемент которой упорядочен по возрастанию. Имеем:
>> syms a b c d e f g h i
>> A=[d a i; b g c; e h f]
A =
[ d, a, i]
[ b, g, c]
[ e, h, f]
>> sort(A)
ans =
[ b, a, c]
[ d, g, f]
[ e, h, i]
Рассмотрим некоторые операции линейной алгебры.
Функция det(A) вычисляет определитель квадратной матрицы A, т.е.
>> syms a b c d e f g h i
>> A=[a b; c d]
A =
[ a, b]
[ c, d]
>> det(A)
ans =
a*d - b*c
>> B=[a b c; d e f; g h i]
B =
[ a, b, c]
[ d, e, f]
[ g, h, i]
>> det(B)
ans =
a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g
Функция trace(A) вычисляет след матрицы A, т.е. сумму элементов главной диагонали. Имеем:
>> syms a b c d e f g h i
>> A=[a b c; d e f; g h i]
A =
[ a, b, c]
[ d, e, f]
[ g, h, i]
>> trace(A)
ans =
a + e + i
Функция inv(A) вычисляет матрицу, обратную к матрице A. Имеем:
>> syms a b c d
>> A=[a b; c d]
A =
[ a, b]
[ c, d]
>> inv(A)
ans =
[ d/(a*d - b*c), -b/(a*d - b*c)]
[ -c/(a*d - b*c), a/(a*d - b*c)]
Функция eig(A) возвращает вектор собственных значений матрицы A. Обращение [M,D]=eig(A) позволяет получить матрицу M, столбцы которой являются собственными векторами матрицы A, и диагональную матрицу D, содержащую на главной диагонали соответствующие собственные значения матрицы A. Обращение eig(A,B), где A и B – квадратные матрицы, влечет вычисление вектора обобщенных собственных значений. Имеем:
>> syms x
>> A=[1 -1; a 2]
A =
[ 1, -1]
[ a, 2]
>> [M,D]=eig(A)
M =
[-((1-4*a)^(1/2)/2-3/2)/a-2/a, ((1-4*a)^(1/2)/2+3/2)/a-2/a]
[ 1, 1]
D =
[ 3/2 - (1 - 4*a)^(1/2)/2, 0]
[ 0, (1 - 4*a)^(1/2)/2 + 3/2]
Функция charpoly(A) возвращает вектор-строку коэффициентов характеристического полинома матрицы A. Имеем:
>> syms x
>> A=[1 -1; a 2];
>> charpoly(A)
ans =
[ 1, -3, a + 2]
С символьными матрицами можно выполнять действия аналогичные действиям с числовыми матрицами.
Пусть требуется вычислить квадрат матрицы
и
показать, что матрица
является ортогональной.
Имеем:
>> syms alpha;
>> A=[cos(alpha) sin(alpha); -sin(alpha) cos(alpha)]
A =
[ cos(alpha), sin(alpha)]
[ -sin(alpha), cos(alpha)]
>> B=A^2
B =
[ cos(alpha)^2 - sin(alpha)^2, 2*cos(alpha)*sin(alpha)]
[ -2*cos(alpha)*sin(alpha), cos(alpha)^2 - sin(alpha)^2]
>> B=simplify(B)
B =
[ cos(2*alpha), sin(2*alpha)]
[ -sin(2*alpha), cos(2*alpha)]
>> I=simplify(A.'*A)
I =
[ 1, 0]
[ 0, 1]
Пусть требуется привести к жордановой форме матрицу
.
Имеем:
>> A=sym([12 32 66 116; -25 -76 -164 -294; ...
21 66 143 256; -6 -19 -41 -73])
A =
[ 12, 32, 66, 116]
[ -25, -76, -164, -294]
[ 21, 66, 143, 256]
[ -6, -19, -41, -73]
>> [V,J]=jordan(A)
V =
[ 4, -2, 4, 3]
[ -6, 8, -11, -8]
[ 4, -7, 10, 7]
[ -1, 2, -3, -2]
J =
[ 1, 1, 0, 0]
[ 0, 1, 0, 0]
[ 0, 0, 2, 1]
[ 0, 0, 0, 2]
>> V*J*inv(V)
ans =
[ 12, 32, 66, 116]
[ -25, -76, -164, -294]
[ 21, 66, 143, 256]
[ -6, -19, -41, -73]
Пусть требуется разложить по сингулярным числам рассмотренную выше матрицу .
Имеем:
>> A=sym([12 32 66 116; -25 -76 -164 -294; ...
21 66 143 256; -6 -19 -41 -73])
A =
[ 12, 32, 66, 116]
[ -25, -76, -164, -294]
[ 21, 66, 143, 256]
[ -6, -19, -41, -73]
>> [U,S,V]=svd(A);
>> double(U)
ans =
0.2830 0.9472 -0.1142 -0.0981
-0.7109 0.1073 -0.6415 -0.2675
0.6190 -0.3002 -0.5293 -0.4965
-0.1768 0.0334 0.5434 -0.8199
>> double(S)
ans =
486.7163 0 0 0
0 2.9955 0 0
0 0 0.4843 0
0 0 0 0.0057
>> double(V)
ans =
0.0724 0.7272 0.6016 0.3225
0.2205 0.5692 -0.3280 -0.7210
0.4747 0.2049 -0.6208 0.5893
0.8490 -0.3244 0.3810 -0.1698
>> double(U*S*V'-A)
ans =
1.0e-37 *
0.0588 0.1175 0 0.2351
0 0 0 0
0 0 0 0
0 0 0 -0.2351
