Решение задач в пакете mathcad решение задач в пакете mathcad методические указания по выполнению лабораторных работ № 1-5 по информатике для студентов дневной формы обучения
Задачи линейной алгебры, решаемые в MathCAD, можно условно разделить на два класса. Первый это простейшие матричные операции, которые сводятся к определенным арифметическим действиям над элементами матрицы. Они реализованы в виде операторов и нескольких специфических функций, предназначенных для создания, объединения, сортировки, получения основных свойств матриц и т. д. Второй класс это более сложные действия, которые реализуют алгоритмы вычислительной линейной алгебры, такие как вычисление определителей и обращение матриц, вычисление собственных векторов и собственных значений, решение систем линейных алгебраических уравнений и различные матричные разложения.
Простейшие операции матричной алгебры реализованы в MathCAD в виде операторов, причем их запись максимально приближена к математическому значению. Каждый оператор выражается соответствующим символом. Некоторые операции применимы только к квадратным матрицам N N, некоторые допускаются только для векторов (например, скалярное произведение), а другие, несмотря на одинаковое написание, по-разному действуют на векторы и матрицы.
Создание матриц
Имеется два способа создать матрицу.
1-й способ. Использование команды создания массивов:
- Воспользоваться командой Вставка Матрица;
- нажатие клавиш Ctrl+M;
- выбор пиктограммы с изображением шаблона матрицы на панели инструментов Матрицы.
Команды панели инструментов Матрицы
| Кнопка | Назначение |
| Создание матрицы | |
| Обратная матрица | |
| Определитель матрицы | |
| Транспонирование матрицы | |
| Выделение столбца матрицы |
Операторы для работы с массивами
Обозначения: для векторов V, для матриц М и для скалярных величин z.
| Оператор | Ввод | Назначение оператора |
| V1+V2 | V1+V2 | Сложение двух векторов V1 и V2 |
| V1-V2 | V1-V2 | Вычитание двух векторов V1 и V2 |
| -М | -М | Смена знака у элементов матрицы M |
| V-z | V-z | Вычитание из вектора V скаляра z |
| z*V, V*z | z*V, V*z | Умножение вектора V на скаляр z |
| z*M, M*z | z*M, M*z | Умножение матрицы М на скаляр z |
| V1*V2 | VI*V2 | Умножение двух векторов V1 и V2 |
| M*V | M*V | Умножение матрицы М на вектор V |
| М1*М2 | М1*М2 | Умножение двух матриц М1 и М2 |
| V/z | Деление вектора V на скаляр z | |
| M/z | Деление матрицы М на скаляр z | |
| М^n | Возведение матрицы М в степень п |
Функции для работы с векторами и матрицами.
Некоторые из них (V должен быть вектором, A может быть вектором либо матрицей): length(V) возвращает число элементов в векторе v; last(V) возвращает индекс последнего элемента; max(A) возвращает максимальный по значению элемент; min(A) возвращает минимальный по значению элемент.
Матричные функции
Для работы с матрицами также существует ряд встроенных функций: augment(M1, М2) объединяет в одну матрицы М1 и М2, имеющие одинаковое число строк; identity(n) создает единичную квадратную матрицу размером , (n – размер матрицы(число)); stack(MI, M2) объединяет две матрицы М1 и M2, имеющие одинаковое число столбцов, сажая M1 над M2; diag(V) создает диагональную матрицу, элемент главной диагонали которой вектор V; cols(M) возвращает число столбцов матрицы М; rows(M) возвращает число строк матрицы М; rank(M) возвращает ранг матрицы М; tr(M) возвращает след (сумму диагональных элементов) квадратной матрицы М; mean(M) возвращает среднее значение элементов массива М; median(M) возвращает медиану элементов массива М; eigenvals(M) возвращает вектор, элементами которого являются собственные значения матрицы M (M должна быть квадратной матрицей.); submatrix(M,ir,jr,ic,jc) возвращает подмассив, состоящий из всех элементов, которые содержатся в строках с ir по jr и столбцах с ic по jc массива М.
Символьные вычисления
Все матричные и векторные операторы допустимо использовать как в численных, так и в символьных расчетах. Мощь символьных операций заключается в возможности проводить их не только над конкретными числами, но и над переменными. Фрагмент документа MathCAD:
Задания к лабораторной работе 3
- Ввести в документ название лабораторной работы, вариант задания и фамилию студента
- Создать квадратные матрицы А, В, D, размером (5,5,4 соответственно) первым способом
- Исследовать следующие свойства матриц на примере преобразования заданных массивов:
- транспонированная матрица суммы двух матриц равна сумме транспонированных матриц (A+B) T =A T +B T ;
- транспонированная матрица произведения двух матриц равна сумме произведению транспонированных матриц, взятых в обратном порядке: (A*B) T =B T *A T ;
- при транспонировании квадратной матрицы определитель не меняется : |D|=|D T |;
- произведение квадратной матрицы на соответствующую ей квадратную дает единичную матрицу (элементы главной диагонали единичной матрицы равны 1, а все остальные – 0) D*D -1 =E.
- Для матриц A,B найти обратные матрицы.
- Найти определители матриц A,B.
- Для матрицы А увеличить значения элементов в № раз, где № номер варианта.
- Для матрицы В увеличить значения элементов на №.
- Создать вектор C вторым способом, количество элементов которого равно 6.
- Применить к матрицам А, В, D встроенные матричные функции (всевозможные) из приведенных в пункте “Функции для работы…..”
- Применить к вектору С встроенные векторные функции.
- Применить ко всем матрицам и вектору общие встроенные функции.
- Сохранить документ.
Контрольные вопросы
- Как создать матрицу, вектор строку, вектор столбец?
- Какие операторы есть для работы с матрицами?
- Перечислите команды панели инструментов Матрицы.
- Как вставить матричные функции?
- Как выполнять вычисления, если матрица задана в символьном виде?
Лабораторная работа 4. Решение уравнений
Общие сведения
Огромное количество задач вычислительной математики связано с решением нелинейных алгебраических уравнений, а также систем таких уравнений. При этом необходимость решения нелинейных уравнений возникает зачастую на промежуточных шагах, при реализации фрагментов более сложных алгоритмов (к примеру, при расчетах дифференциальных уравнений при помощи разностных схем и т. п.).
Численное решение нелинейного уравнения
- нахождения промежутка, содержащего корень уравнения (или начальных приближений для корня);
- получения приближенного решения с заданной точностью с помощью функции root.
- уравнение не имеет корней;
- корни уравнения расположены далеко от начального приближения;
- выражение имеет комплексный корень, но начальное приближение было вещественным.
Нахождение корней полинома
Для нахождения корней выражения, имеющего вид v 0 + v 1 x +… v n -1 x n -1 + v n x n , лучше использовать функцию polyroots, нежели root. В отличие от функции root, функция polyroots не требует начального приближения и возвращает сразу все корни, как вещественные, так и комплексные. Функция Polyroots(v) — возвращает корни полинома степени n. Коэффициенты полинома находятся в векторе v длины n + 1. Возвращает вектор длины n, состоящий из корней полинома.
Решение систем уравнений
Решение систем уравнений матричным методом
Рассмотрим систему n линейных алгебраических уравнений относительно n неизвестных х 1 , х 2 , …, х n : Система линейных уравнений может быть записана в матричном виде: Ах = b, где: . Если det A 0 то система или эквивалентное ей матричное уравнение имеет единственное решение.
Решение систем уравнений с помощью функции Lsolve
Системы линейных уравнений удобно решать с помощью функции lsolve. Функция lsolve(А, b) возвращает вектор решения x такой, что Ах = b.
Решение системы уравнений методом Гаусса
Метод Гаусса, его еще называют методом Гауссовых исключений, состоит в том, что систему уравнений приводят последовательным исключением неизвестных к эквивалентной системе с треугольной матрицей. В матричной записи это означает, что сначала (прямой ход метода Гаусса) элементарными операциями над строками приводят расширенную матрицу системы к ступенчатому виду, а затем (обратный ход метода Гаусса) эту ступенчатую матрицу преобразуют так, чтобы в первых n столбцах получилась единичная матрица. Последний, (n + 1) столбец этой матрицы содержит решение системы. В MathCAD прямой и обратный ходы метода Гаусса выполняет функция rref(A).
Решение систем уравнений с помощью функций Find или Minner
- Задать начальное приближение для всех неизвестных, входящих в систему уравнений. MathCAD решает систему с помощью итерационных методов;
- Напечатать ключевое слово Given. Оно указывает MathCAD, что далее следует система уравнений;
- Введите уравнения и неравенства в любом порядке. Используйте [Ctrl]= для печати символа =. Между левыми и правыми частями неравенств может стоять любой из символов , и ;
- Введите любое выражение, которое включает функцию Find,
например: х:= Find(х, у).
Символьное решение уравнений
- если решаемое уравнение имеет параметр, то решение в символьном виде может выразить искомый корень непосредственно через параметр. Поэтому вместо того чтобы решать уравнение для каждого нового значения параметра, можно просто заменять его значение в найденном символьном решении;
- если нужно найти все комплексные корни полинома со степенью меньше или равной 4, символьное решение даст их точные значения в одном векторе или в аналитическом или цифровом виде.
- Напечатать выражение (для ввода знака равенства используйте комбинацию клавиш Ctrl + =);
- Выделить переменную, относительно которой нужно решить уравнение, щелкнув на ней мышью;
- Выбрать пункт меню Символы Переменные Вычислить.
- Напечатать ключевое слово Given;
- Напечатать уравнения в любом порядке ниже слова Given. Удостоверьтесь, что для ввода знака = используется Ctrl + =;
- Напечатать функцию Find, соответствующую системе уравнений;
- Нажать Ctrl + .(клавиша CTRL, сопровождаемая точкой). MathCAD отобразит символьный знак равенства ;
- Щелкнуть мышью на функции Find.
Создание вектора
На следующем этапе нужно заполнить эти поля скалярными выражениями. Для этого выполните следующее:
- Щёлкните на верхнем поле и напечатайте 2.

- Переместите выделяющую рамку в следующее поле. Можно сделать это или клавишей [Tab], или щёлкнув непосредственно на втором поле.

- Напечатайте 3 во втором поле. Затем переместите выделяющую рамку в третье поле, и напечатайте 4.

Если понадобится создавать еще векторы, можно оставить диалоговое окно “Матрицы” открытым для дальнейшего использования.
Как только вектор создан, можно использовать его в вычислениях в точности так же, как и число. Например, чтобы добавить другой вектор к этому вектору, необходимо выполнить следующее:
- Нажмите [] несколько раз или щёлкните на любой из скобок вектора. Выделяющая рамка теперь заключает весь вектор. Это означает, что знак плюс, который будет напечатан, относится к вектору целиком, а не к какому-либо из элементов.

- Нажмите клавишу плюс (+). Mathcad показывает поле для второго вектора.

- Используйте диалоговое окно “Матрицы”, чтобы создать другой вектор с тремя элементами.

- Заполните этот вектор, щелкая в каждом поле и печатая числа, показанные справа. Можно также использовать [Tab], чтобы двигаться от одного элемента к другому.

- Нажмите знак =, чтобы увидеть результат.

Сложение — только одна из операций Mathcad, определенных для векторов и матриц. В Mathcad также есть вычитание матриц, умножение матриц, скалярное произведение, целочисленные степени, детерминанты и много других операторов и функций для векторов и матриц. Полные списки появляются в разделах “Векторные и матричные операторы” и “Векторные и матричные функции” ниже в этой главе.
Если Вы используете Mathcad PLUS, Вы сможете выполнить много символьных операций с матрицами. Подробнее об этом см.в Главе “Символьные вычисления”.
Создание матрицы
Чтобы создать матрицу, сначала щёлкните в свободном месте или на поле. Затем:
- Выберите Матрицы из меню Математика, или нажмите [Ctrl]M. Появится диалоговое окно.

- Введите число строк и столбцов в нужные поля. В этом примере матрица имеет две строки и три столбца. Затем нажмите на “Создать”. Mathcad создаст матрицу с пустыми полями.

- В завершение заполните поля, как описано в предыдущем разделе для векторов.

Можно использовать эту матрицу в формулах в точности так же, как и число или вектор.
Везде в настоящем руководстве термин вектор относится к вектору-столбцу. Вектор-столбец идентичен матрице с одним столбцом. Можно также создать вектор-строку, создав матрицу с одной строкой и многими столбцами. Операторы и функции, которые берут векторный аргумент, всегда ожидают вектор-столбец. Они не применимы к векторам-строкам. Чтобы превратить вектор-строку в вектор-столбец, используйте оператор транспонирования[Ctrl]1.
Векторы в C++: для начинающих

Всем привет! До этого дня мы использовали чистые массивы. Чистые — это значит простые массивы, не имеющие у себя в багаже различных функций. В этом уроке мы пройдем нечистые массивы — векторы.
Что такое вектор (vector)
Вектор — это структура данных, которая уже является моделью динамического массива.
Давайте вспомним о том, что для создания динамического массива (вручную) нам нужно пользоваться конструктором new и вдобавок указателями. Но в случае с векторами всего этого делать не нужно. Вообще, по стандарту пользоваться динамическим массивом через конструктор new — не есть правильно. Так как в компьютере могут происходить различные утечки памяти.
Как создать вектор (vector) в C++
Сначала для создания вектора нам понадобится подключить библиотеку — , в ней хранится шаблон вектора.
#include
Кстати, сейчас и в будущем мы будем использовать именно шаблон вектора. Например, очередь или стек, не созданные с помощью массива или вектора, тоже являются шаблонными.
Далее, чтобы объявить вектор, нужно пользоваться конструкцией ниже:
vector тип данных > имя вектора>;
- Вначале пишем слово vector .
- Далее в угольных скобках указываем тип, которым будем заполнять ячейки.
- И в самом конце указываем имя вектора.
vector string> ivector;
В примере выше мы создали вектор строк.
Кстати, заполнить вектор можно еще при инициализации (другие способы мы пройдем позже — в методах вектора). Делается это также просто, как и в массивах. Вот так:
vectorint> ivector = элемент[0]>, элемент[1]>, элемент[2]>>;
После имени вектора ставим знак равенства и скобки, в которых через пробел указываем значение элементов.
Такой способ инициализации можно использовать только начиная с C++11!
Так, чтобы заполнить вектор строками, нам нужно использовать кавычки — «строка» .
Второй способ обратиться к ячейке
Мы знаем, что в векторе для обращения к ячейке используются индексы. Обычно мы их используем совместно с квадратными скобками [] .
Но в C++ есть еще один способ это сделать благодаря функции — at(). В скобках мы должны указать индекс той ячейки, к которой нужно обратиться.
Вот как она работает на практике:
vector int> ivector = 1, 2, 3>; ivector.at(1) = 5; // изменили значение второго элемента cout . at(1); // вывели его на экран
Давайте запустим эту программу:
5 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.
Как указать количество ячеек для вектора
Указывать размер вектора можно по-разному. Можно это сделать еще при его инициализации, а можно хоть в самом конце программы. Вот, например, способ указать длину вектора на старте:
vector int> vector_first(5);
Так в круглых скобках () после имени вектора указываем первоначальную длину. А вот второй способ:
vector int> vector_second; // создали вектор vector_second.reserve(5); // указали число ячеек
Первая строчка нам уже знакома. А вот во второй присутствует незнакомое слово — reserve , это функция, с помощью которой мы говорим компилятору, какое количество ячеек нам нужно использовать.
Вы можете задать логичный вопрос: “А в чем разница?“. Давайте создадим два вектора и по-разному укажем их количество ячеек.
#include #include // подключили библиотеку using namespace std; int main() setlocale(0, ""); vector int> vector_first(3); // объявили // два vector int> vector_second; // вектора vector_second.reserve(3); cout <"Значения первого вектора (с помощью скобок): "; for (int i = 0; i 3; i++) cout [ i] <" "; > cout <"Значения второго вектора (с помощью reserve): " ; for (int i = 0; i 3; i++) cout [ i] <" "; > system("pause"); return 0; >
Значения первого вектора (с помощью скобок): 0 0 0 Значения второго вектора (с помощью reserve): 17 0 0 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.
Как видим, в первом случае мы вывели три нуля, а во втором: 17, 0, 0.
Все потому, что при использовании первого способа все ячейки автоматически заполнились нулями.
При объявлении чего-либо (массива, вектора, переменной и т.д) мы выделяем определенное количество ячеек памяти, в которых уже хранится ненужный для ПК мусор. В нашем случае этим мусором являются числа.
Поэтому, когда мы вывели второй вектор, в нем уже находились какие-то рандомные числа — 17, 0, 0. Обычно они намного больше. Можете кстати попробовать создать переменную и вывести ее значение.
Нужно помнить! При использовании второго способа есть некоторый плюс — по времени. Так как для первого способа компилятор тратит время, чтобы заполнить все ячейки нулями.
Как сравнить два вектора
Если в середине программы нам понадобится сравнить два массива, мы, конечно, используем цикл for и поочередно проверим все элементы.
Вектор опять на шаг впереди! Чтобы нам сравнить два вектора, потребуется применить всего лишь оператор ветвления if.
if (vec_first == vec_second) // сравнили! cout <"Они равны!"; > else cout <"Они не равны"; >
Конечно, компилятор все равно прогонит эти два вектора по циклу, проверяя ячейки. Но оцените, насколько благодаря этому программа стала компактнее. Разве это не прекрасно?
Вот так бы выглядела программа выше, если бы мы не использовали знак равенства для векторов.
bool flag = true; if (vec_first.size() == vec_second.size()) for (int i = 0; i vec_first.size(); i++) if (vec_first[i] != vec_second[i]) cout <"Они не равны!"; flag = false; break; // выходим из цикла > > > else flag = false; cout <"Они не равны!"; > if (flag) cout <"Они равны!"; >
- Сначала мы создали булеву переменную flag равную true . У нее задача такая:
- Если в условии (строки 5 — 10) она станет равна false — то значит эти векторы не равны и условие (строки 14 — 16) не будет выполняться.
- Если же она после цикла (строки 3 — 12) останется равна true — то в условии (строки 14 — 16) мы сообщим пользователю, что они равны.
- В условии (строка 3) проверяем размеры двух векторов на равенство.
- И если условие (строки 5 — 10) будет равно true — то мы сообщим пользователю, что эти два вектора не равны.
Как создать вектор векторов
Понятно, что вам может понадобиться записать числа в двумерный массив. Но зачем использовать массив, если можно оперировать векторами.
Сейчас вы узнаете, как создать вектор векторов или простым языком массив векторов.
vector vector тип данных > >;
Как можно увидеть, нам пришлось только добавить слова vector и еще его .
А чтобы указать количество векторов в векторе, нам потребуется метод resize() .
vector vector int> > vec; vec.resize(10); // десять векторов
Но есть еще одни способ добавления векторов в вектор. Для этого способа мы будем использовать функцию push_back() (читайте ниже, что она делает).
vec.push_back(vector int>());
- В аргументах функции push_back() находится имя контейнера, который мы хотим добавить. В нашем случае — vector .
- А дальше идет тип контейнера — .
- И все заканчивается отрывающей и закрывающей скобкой () .
Для двумерного вектора тоже можно указать значения еще при инициализации:
vector vector int> > ivector = 1, 4, 7>, 2, 5, 8>, 3, 6, 9>>;
— это значения элементов первого массива (первого слоя). Такие блоки значений, как , должны разделяться запятыми.
Методы для векторов:
Сейчас мы разберем некоторые методы, которые часто используются вместе с векторами. Метод — это функция, которая относится к определенному STL контейнеру.
В нашем случае этим STL контейнером является вектор. Если вы дальше собираетесь оперировать векторами — лучше все перечисленные функции запомнить.
Если нам требуется узнать длину вектора, понадобится функция — size() . Эта функция практически всегда используется вместе с циклом for.
for (int i = 0; i ivector.size(); i++) // . >
Также, если нам требуется узнать пуст ли стек, мы можем использовать функцию — empty() .
- При отсутствии в ячейках какого-либо значения это функция возвратит — true .
- В противном случае результатом будет — false .
Вот пример с ее использованием:
if (ivector.empty()) // . >
2) push_back() и pop_back()
Как мы сказали выше, у векторов имеются методы, которые помогают оптимизировать и улучшить жизнь прог
