Методические указания к лабораторной работе №4

advertisement
Е. Г. Крушель, А. Э. Панфилов
ОСВАИВАЕМ Mathcad
(первокурсникам, заочникам и не только…)
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАМЫШИНСКИЙ ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТ (ФИЛИАЛ)
ВОЛГОГРАДСКОГО ГОСУДАРСТВЕННОГО ТЕХНИЧЕСКОГО УНИВЕРСИТЕТА
Е. Г. Крушель, А. Э. Панфилов
ОСВАИВАЕМ Мathcad
(первокурсникам, заочникам и не только…)
Учебное пособие
Допущено Учебно-методическим объединением вузов по университетскому политехническому образованию в качестве учебного пособия
для студентов высших учебных заведений, обучающихся по направлению
230100 «Информатика и вычислительная техника» специальности 230102
«Автоматизированные системы обработки информации и управления».
РПК «Политехник»
Волгоград
2006
УДК 004. 42 (075. 8)
К 84
Рецензенты: академик РАЕН, член-корр. международной академии
наук РФ, д. ф.-м. н., профессор Саратовского государственного технического университета В. Б. Байбурин; к. т. н., профессор Саратовского государственного технического университета Р. Н. Каримов
Крушель Е. Г., Панфилов А. Э. ОСВАИВАЕМ Mathcad (первокурсникам, заочникам и не только…): Учеб. пособие / ВолгГТУ, Волгоград,
2006. – 179.
ISBN 5-230-04906-5
Предназначено для быстрого освоения математического пакета программ Mathcad в объеме, достаточном для самостоятельного решения задач при изучении естественнонаучных и общепрофессиональных дисциплин. Выполнено в стиле «пособие на коленях», согласно которому с
первых строк читатель активно участвует в проведении расчетов и моделировании, начиная с простейших примеров, доступных для понимания
школьниками старших классов – вплоть до решения содержательных задач уровня 1-го курса вуза.
Области использования – проведение лабораторных и организуемых
самостоятельных работ в рамках учебной дисциплины «Информатика»,
предусмотренной учебными планами для технических специальностей;
самостоятельное изучение разделов школьниками старших классов; самостоятельное освоение пакета Mathcad студентами–заочниками и слушателями системы дистанционного образования; помощь студентам,
осваивающим разделы дисциплин «Алгебра и геометрия» и «Математический анализ».
Ил. 112. Табл. 3. Библиогр.: 6 назв.
Печатается по решению редакционно-издательского совета
Волгоградского государственного технического университета
ISBN 5-230-04906-5
©
Волгоградский
государственный
технический
университет, 2006
ПРЕДИСЛОВИЕ
Уважаемый Читатель, перед Вами – книга, обобщающая 10-летний
опыт привития навыков работы в среде пакета программ для математических и инженерных расчетов Mathcad (разработка фирмы Mathsoft
Engineering & Education, Inc.) студентам факультета информационных
технологий Камышинского технологического института (филиала) Волгоградского государственного технического университета. Здесь, в предисловии, мы попытаемся ответить на три вопроса (зачем? почему? как?),
которые последовательно ставит перед собой человек, берущий в руки
новую книгу и решающий, следует ли ее читать.
Во-первых, зачем Mathcad. Пособие адресовано, в первую очередь,
студентам первого курса, обучающимся по направлению бакалавриата
«Информатика и вычислительная техника» и специальности «Автоматизированные системы обработки информации и управления». Освоение пакета Mathcad может быть предусмотрено программой изучения дисциплины «Информатика» (лабораторный практикум и самостоятельная работа).
Но наш опыт показывает, что этот программный продукт очень полезен и многим другим – студентам всех технических специальностей,
преподавателям естественнонаучных и технических дисциплин, профессиональным программистам, группам специалистов разных профилей,
объединенных для решения сложной инженерной или научной задачи, и
даже школьникам старших классов. Студенту Mathcad предоставит средства для выполнения лабораторных и самостоятельных расчетных работ
по многим дисциплинам («Вычислительная математика», «Основы теории управления», «Моделирование систем», «Методы оптимизации»,
«Теория принятия решений» и др.). Рекомендуем студентам обратить
внимание на возможности символьных преобразований, позволяющих
понять и выполнить последовательность аналитических расчетов. Преподавателю Mathcad послужит средой для разработки сценариев, компьютерного сопровождения и методических материалов к лекционным
курсам и лабораторному практикуму – вплоть до создания интерактивных электронных учебных пособий с возможностями варьирования исходных данных и моделирования, доступными читателю в ходе изучения
материала. Профессиональному программисту Mathcad поможет осмыслить постановку сложной вычислительной задачи высокой размерности,
рассчитать полноценный контрольный пример небольшой размерности,
который пригодится для отладки программного комплекса, а также с помощью графических средств Mathcad получить интерпретацию, полезную для понимания задачи. Группе разработчиков Mathcad, аналогично
математике, предоставит (благодаря своему интерфейсу, не нуждающемуся в специальном освоении) возможности междисциплинарного обще3
ния между специалистами предметной области, с одной стороны, и создателями алгоритмов и программного обеспечения, с другой. Школьнику, интересующемуся математикой и физикой, Mathcad послужит существенному расширению кругозора.
Во-вторых, почему мы просим Читателя обратиться к нашей книге –
несмотря на то, что о пакете Mathcad уже написано много очень хороших
учебников и руководств. Ответ состоит в том, что главное внимание мы
уделили не столько процессу изучения пакета (об этом другие авторы
написали лучше нас), сколько попыткам сформировать у студентов
начальные навыки алгоритмического мышления. Изложение построено
так, что приемы работы в среде Mathcad изучаются в ходе решения задач
с попутным формированием стереотипа технологии решения, этапами
которой являются: постановка задачи на содержательном уровне, ее
осмысливание, формализация, алгоритмизация, решение, интерпретация и
обобщение. Научиться этому только на примерах, подробно рассмотренных в пособии, нельзя; требуется упорная самостоятельная работа, сценарии для которой включены в пособие в форме индивидуальных заданий.
Мы настойчиво призываем Читателя выполнить индивидуальные задания.
Помимо более полного освоения пакета Mathcad, результат, полученный
самостоятельно, принесет Вам богатую совокупность ощущений, для которых в педагогике есть специальный термин: радость завершения.
В-третьих, как эффективно изучить пакет. Мы думаем, что нужно
сразу, с первых шагов (с чтения первых страниц пособия) учиться решать
полезные задачи с привлекательным графическим сопровождением.
Навыки придут «сами собой».
Наряду с официальными рецензентами у пособия имеется и неофициальный коллективный рецензент – студенты первого курса набора 2006 г.,
изучавшие Mathcad на лабораторных работах по дисциплине «Информатика». Анкетирование, проведенное после экзамена по дисциплине, показывает, что студенты оценивают материал пособия как, в основном, доступный даже для самостоятельного изучения. Поэтому ничего не бойтесь. Включайте компьютер, открывайте пособие и приступайте к работе,
испытывая от нее удовольствие и восхищаясь высочайшим уровнем
научного и программного обеспечения пакета. Доступность изложения
позволяет надеяться также на успешное использование пособия в системах заочного и дистанционного образования.
Нужно предупредить Читателя о некоторых негативных отзывах о
пакете Mathcad, бытующих среди высокомерных программистов. Первое
утверждение состоит в том, что для решения серьезных задач высокой
размерности Mathcad непригоден. Мы уже привели наши возражения
выше, поясняя полезность Mathcad не для создания завершенного программного продукта, а для процесса его разработки (для осмысливания
4
задачи, расчета контрольных примеров и отладки). Нужно также упомянуть, что благодаря совершенству использованных в Mathcad математических методов многие задачи (в частности, формализуемые в терминах
алгебры матриц) могут быть решены в Mathcad и при высокой размерности (например, собственные числа матрицы размерности 200200 вычисляются менее чем за секунду). Второе направление критики относится к
скудости встроенных средств программирования. Здесь можно возразить,
что эти средства представлены в Mathcad только для того, чтобы дополнить как встроенные, так и разработанные пользователем функции конструктами, нужными для их «склейки» (операторами циклов и условий).
Для многих расчетных задач этого достаточно. В последних версиях
Mathcad предусмотрены отладочные средства. Кроме того, в Mathcad
имеется механизм для встраивания пользовательских функций, написанных на языке C++.
В целом наш опыт показывает, что затраты времени на освоение пакета
Mathcad многократно окупаются благодаря тому, что пакет способствует
быстрому росту профессиональной квалификации тех его пользователей, которые обладают хотя бы небольшими аналитическими способностями.
Структура пособия. Пособие содержит 4 части и приложения.
Часть 1 посвящена ознакомлению с основными возможностями пакета (с
его интерфейсом, с вводом исходных данных и формул, с формированием функций, с графическими средствами и возможностями анимации). В
Части 2 рассматриваются средства векторной и матричной алгебры. Изложение сопровождается примерами, относящимися к задачам линейной
алгебры и аналитической геометрии. Дисциплина «Алгебра и геометрия»
изучается практически во всех технических вузах в 1-м семестре 1-го
курса, поэтому понимание постановок задач для рассматриваемых в части 2 примеров не вызовет затруднений. Более того, материал этой части
окажется полезным для выполнения самостоятельных заданий по этой
дисциплине. В части 3 описаны основы программирования в среде
Mathcad и рассмотрены примеры, иллюстрирующие этапы разработки
программы – от постановки задачи до обобщения полученного результата. Часть 4 посвящена возможностям символьной математики, иллюстрируемым задачами математического анализа. Поскольку начинающие
пользователи обычно затрудняются в использовании встроенных средств
помощи, в Приложения 1, 2 включены краткие пояснения к основным
приемам работы в среде Mathcad. Для решения индивидуальных задач в
Приложении 3 приведены справочные математические материалы.
Предпочитающие осваивать материал непосредственно с экрана монитора могут воспользоваться прилагаемым компакт-диском, в котором дублировано содержание пособия и предусмотрены полезные гиперссылки, а также исходные данные, необходимые для расчета примеров.
5
Требования к учебному времени. Для использования материала
пособия при изучении дисциплины «Информатика» следует предусмотреть в рабочей программе 16 часов аудиторных занятий в форме лабораторного практикума и 16 часов самостоятельной работы.
Авторы считают своим приятным долгом поблагодарить рецензентов (профессоров Вила Бариевича Байбурина и Равиля Нургалиевича Каримова) за внимание к рукописи и замечания. Мы благодарны также
нашим коллегам Илье Викторовичу Степанченко и Наталии Александровне Печеник за поддержку работы и обсуждение содержания пособия.
6
ВВЕДЕНИЕ
Учебное пособие предназначено для быстрого самостоятельного
освоения приемов работы в среде пакета программ для проведения математических и инженерных расчетов Mathcad, а также для привития читателю навыков использования Mathcad в текущей работе. Разработка ориентирована на читателя, имеющего первичные навыки работы с компьютером; знакомство со средой Mathcad не требуется.
Пользователями разработки могут быть:

студенты первого курса технических специальностей;

школьники старших классов, интересующиеся математикой и
моделированием;

слушатели системы дистанционного образования;

студенты-заочники.
Области использования:
 проведение лабораторных и организуемых самостоятельных работ в рамках учебной дисциплины «Информатика», предусмотренной
учебными планами для технических специальностей;
 самостоятельное изучение разделов школьниками старших классов;
 самостоятельное освоение пакета Mathcad студентами – заочниками и слушателями системы дистанционного образования;
 помощь студентам, осваивающим разделы дисциплин «Алгебра
и геометрия» и «Математический анализ».
Актуальность темы связана с тем, что пакет Mathcad «встроен» во
многие ученые дисциплины как среда для постановки и проведения лабораторных работ, в связи с чем этот пакет должен быть освоен студентами до уровня свободного владения. Преимущество этого пакета перед
другими пакетами состоит, прежде всего, в удобном для восприятия, интуитивно ясном представлении материала. В настоящее время Московский энергетический институт поддерживает Mathcad Application Server
www.vpu.ru/mas, на котором возможно размещение заданий и образцов
их выполнения, доступных всем пользователям Internet, благодаря чему
представляемая работа может быть полезна для системы дистанционного
образования.
В настоящее время опубликовано достаточно много руководств и
учебных пособий по Mathcad. Несмотря на то, что каждая из книг содержит исчерпывающие сведения, относящиеся к Mathcad, объемы книг
(многие сотни страниц) таковы, что время, необходимое для изучения
пакета до уровня его практического использования, далеко выходит за
рамки учебного времени, отведенного рабочими программами дисциплин
«Информатика», предусмотренных всеми рабочими учебными планами
7
направлений и специальностей технического вуза. Материалы этих книг
полезны скорее тем читателям, которые уже владеют навыками работы в
среде Mathcad, успешно применяют Mathcad в текущей работе и хотели
бы углубить свои знания.
Для первичного знакомства и обретения навыков свободного владения средствами Mathcad предлагается отличная от общепринятых технология изучения. Читатель приглашается к работе с первых строк чтения
учебного пособия и по мере освоения его разделов становится соавтором
примеров его использования.
8
ЧАСТЬ 1. ПЕРВОЕ ЗНАКОМСТВО С MATHCAD
Введение. Общие правила работы в среде Mathcad
Mathcad представляет собой среду (математический табличный
процессор) для научных, инженерных и экономических расчетов.
Правила работы с Mathcad:
1. Вид экрана будет похож на школьную доску. Mathcad различает
строчные и прописные литеры, для него они обозначают различные переменные. Например, Mnim и mnim – идентификаторы разных переменных (а во многих языках программирования, например, в Visual Basic,
строчные и прописные не различаются).
Можно использовать и греческие символы. Для этого либо используем панель из Меню View – Toolbar – Greek либо (быстрее) набираем похожую латинскую литеру (например <t>) и сразу после этого нажимаем
<Ctrl>+<g> (мнемонически g от greek – греческий), получится .
2. До начала вычислений по формулам нужно присвоить исходные
значения параметрам и переменным, входящим в эти формулы. Присваивание осуществляется с помощью набора двоеточия, а на экране будет
выглядеть как знак := .
§1. Ваши первые примеры
1.1. Ввод данных, формул, вывод решения
Решим задачу. Пусть требуется рассчитать площадь круга заданного
радиуса.
Шаг 1. Присваиваем радиусу требуемое значение – например, 5.
Набираем: R (двоеточие) 5, получится:
R := 5
Шаг 2. Записываем формулу площади круга, знакомую каждому.
Набираем: S (двоеточие) p (<Ctrl>+<g>)*R^2. Набор выглядит как абракадабра, но на экране получится читаемый образ формулы – такой:
2
S  R
Шаг 3. Читаем ответ. Он хранится в переменной S. Для чтения нужно набрать имя переменной и знак равенства. Увидим:
S = 78.54
9
1.2. Диапазоны данных, функции, вывод таблиц результатов
расчета
Усложним задачу. Пусть требуется рассчитать и построить график
зависимости площади круга от значения радиуса, изменяющегося в диапазоне от 5 до 10 с шагом 0.5. Набираем: R (двоеточие) 5 (запятая) 5.5
(точка с запятой) 10. Увидим:
R := 5, 5.5.. 10
Теперь запишем формулу для площади круга – но не так, как выше, а
в форме функции от радиуса. Набираем: S(R) (двоеточие) p (<Ctrl>+<g>)
*R^2. Увидим:
2
S( R)  R
Выведем таблицу значений радиусов и соответствующих им значений площадей круга. Для этого наберите R= (появится колонка цифр с
заголовком R) и справа от нее наберите S(R)= Вы увидите столбец с
цифрами, как показано на рис. 1.1.
R
S( R) 
5
5.5
78.54
95.033
6
113.097
6.5
132.732
7
153.938
7.5
176.715
8
201.062
8.5
226.98
9
254.469
9.5
283.529
10
314.159
Рис. 1.1. Вывод таблицы значений.
Разместите таблицы рядом, чтобы было видно соответствие радиусов и площадей. Для этого можно "обвести" таблицу мышью, появится
контур. Если поместить указатель мыши у нижней его границы, указатель примет образ ладошки, тогда можно нажать левую кнопку мыши и
протащить колонку с цифрами в нужное место.
1.3. Построение графика функции одной переменной
Более наглядно зависимость видна на графике. Построим его. Щелк10
ните левой кнопкой мышки где-нибудь ниже таблиц и нажмите
<Shift>+<2> (двойка в верхнем ряду левой части клавиатуры, – там, где
коммерческий знак @). Появится заготовка для графика. В слотах на осях
запишите переменные для абсциссы R и для ординаты S(R). Выведется
график, причем масштабирование выполнит ЭВМ самостоятельно. Вид
графика с опциями по умолчанию показан на рис. 1.2-а.
400
400
300
S( R)
S( R) 200
200
100
0
5
5 6.257.58.7510
10
R
R
á)
a)
400
300
S( R) 200
100
5
6.25
7.5
8.75
10
R
â)
Рис. 1.2. Вывод графика: а) график с опциями по умолчанию; б) нанесение сетки значений;
в) приведение к удобному размеру, «русское» расположение осей.
Приведите график к надлежащуму виду. Щелкните левой кнопкой
мыши по его полю, появится панель форматирования графиков. На
вкладке XY-axes (оси XY) включите линии сетки (Grid lines) на обеих
осях, отключите автоматическое построение линий сетки (Auto grid) и
поставьте число линий сетки (Number of grids) по 4 на каждой оси.
Включите «русский» вариант осей – перекрещивающиеся (Crossed).
Затем выберите вкладку Traces (линии графика) и для линии Trace 1
выберите толщину (Weight)–2. Получится так, как показано на рис. 1.2-б.
Теперь «охватите» график контуром (мышью) и растяните его вдоль
оси абсцисс. Получится график, показанный на рис. 1.2-в.
1.4. Построение графика функции двух переменных
Научимся строить чертежи объемных фигур. Например, построим
шар. Построение любой объемной фигуры начинается с того, что мы за11
даем сетку значений на осях x и y.
1) Пусть на каждой оси будет по 25 значений. Наберите: N (двоеточие) 25, получится:
N := 25
2) Задайте размещение индексов от 0 до N на осях. Пусть по оси x
индекс будет обозначен i, а на оси y – обозначен j. Наберите: i (двоеточие) 0 (точка с запятой) N (по умолчанию шаг = 1, поэтому его и не записываем). Получится:
i := 0.. N
Аналогично наберите:
j := 0.. N
Теперь рассчитайте значения углов j к сечению шара плоскостью,
параллельной координатной плоскости XOY, и в этом сечении i до пересечения с поверхностью шара – как функции i и j. Наберите:
j (<Ctrl>+<g>) [ i (двоеточие) i*2*p (<Ctrl>+<g>) / N.
Вы увидите формулу, по которой вычисляется угол в сечении шара.
Обратите внимание: знак (квадратная скобка [ ) позволяет индексировать
переменную, т. е. делать её функцией счетного индекса.

i  i  2
N
Задайте радиус шара, например:
R := 1
Аналогично наберите z (<Ctrl>+<g>) [ j и т. д., как для . Получится:

 j  j 2
N
Теперь рассчитайте координаты точки на шаре по формулам, которые набирайте так: x [ i,j (двоеточие) R*sin(z (<Ctrl>+<g>) [ j)*cos(f
(<Crtl>+<g>) [ i). Аналогично наберите формулы для двух других координат. Должно получиться:
x  R  sin j  cos  i y  R  sin j  sin i z  R  cos   j
i j
i j
i j
Сделайте "заготовку" для чертежа. Для этого щёлкните мышью
на 3–4 см ниже и нажмите <Ctrl>+<2> (двойка в верхнем ряду левой части клавиатуры, – там, где "собачка" @ ).
В слот в нижнем левом углу заготовки наберите в скобках (через запятые) x , y , z.
Не забудьте: Mathcad различает строчные и прописные литеры, так
что если Вы использовали прописные X, Y, Z в формулах, то так и набирайте их в слотах. Получится замечательный рисунок (рис. 1.3).
12
Рис. 1.3. Двумерные графики:
а) опции графика – по умолчанию; б) раскраска; опция Appearance – Colormap – Fill Surface
в) раскраска; опция Appearance – Colormap – Fill Contours.
Щёлкните левой кнопкой мыши по нему, выберите вкладку
Appearance (появление, вид на экране) и включите опцию Color (шар
раскрасится, как арбуз).
Поэкспериментируйте с опциями рисунка самостоятельно.
1.5. Освоение функции CreateMesh для форматирования графика
В Mathcad имеется очень удобная функция, позволяющая задать
диапазоны изменения аргументов и частоту нанесения сетки. Освоим ее
на примере построения полусферы.
Шаг 1. Создадим вектор с тремя элементами, в которые впишем координаты точек сферы. Вектор создается так: Наберите имя вектора и
знак присваивания – например,
Sphere   
(набирается двоеточием)
Затем вызовите окошко для ввода матриц (проще всего клавишами
<Ctrl>+<M>), появится форма для ввода числа строк (Rows), туда введите 3, и столбцов (Columns), туда введите 1 – вот так (рис. 1.4):
Рис. 1.4. Окно для вставки матрицы.
13
В появившиеся слоты справа от формулы скопируйте формулы,
определяющие координаты. Получится так:
Слоты для ввода формул
Так должно получиться
после ввода координат
Шаг 2. Используйте функцию CreateMesh для показа графика:
Шаг 3. Выведите график (Заготовка <Ctrl>+<2>, в слот – имя графика
H) и потом поэкспериментируйте с пределами изменения аргументов, с шагами сетки, с цветом и другими опциями графика. Получится так (рис. 1.5):
Рис. 1.5. Примеры графиков, построенных с использованием функции CreateMesh.
14
§2. Решение уравнений
Пример. Найдем решение уравнения sin  
изменения аргумента  от 0 до 3.5.
 0.6 
2
на интервале
2.1. Оценка числа корней и их приближенных значений (по графику)
Как Вас учили на уроках математики, сначала нужно грубо определить, сколько корней имеет это уравнение и какие у них приблизительно
значения. Лучше всего это сделать с помощью графика. Для этого зададим изменение аргумента с шагом, например, 0.1, и затем рассчитаем
значения левой и правой частей уравнения как функции этого аргумента.
Наберите f (<Ctrl>+<g>) (двоеточие) 0,0.1*p (<Ctrl>+<g>) (точка с
запятой) 3.5*p (<Ctrl>+<g>). Получится:
  0  0.1   3.5 
Затем задайте функции левой и правой частей так:
x(f (<Ctrl>+<g>) ) (двоеточие) sin(f (<Ctrl>+<g>) )
y(f (<Ctrl>+<g>) ) (двоеточие) 2^-0.6*f (<Ctrl>+<g>)
Должно получиться так:
x    sin  
y    2
Сделайте заготовку для графика (<Shift>+<2>), в слоте для абсциссы
запишите f (<Ctrl>+<g>), а в слот для ординаты внесите x(f (<Ctrl>+<g>) ).
Затем (клавишей ПРОБЕЛ или стрелочкой вверх-вниз) охватите обозначение в слоте синим прямоугольным обводом (это – признак выделения
группы символов как единого объекта), нажмите клавишу (запятая).
Появится слот для ввода ординаты второй кривой, внесите в него y(f
(<Ctrl>+<g>) ). Щёлкните левой кнопкой мыши где-нибудь вне графика.
Появится график двух функций, приведите его "в порядок", как Вы уже
делали раньше – чтобы он стал выглядеть примерно так, как на рис. 1.6.
Мы видим, что имеется 4 корня со следующими примерными значениями:
x1=1; x2=3; x3= 6.5; x4=9.3.
 0.6 
1
0.6
x( )
0.2
y ( ) 0.2 0
3
6
9
12
15
q
0.6
1

Рис. 1.6. Определение числа корней уравнения по графику.
15
2.2. Нахождение корня уравнения. Операторная скобка Given –
Find
Для нахождения корня нужно сделать следующие шаги:
Шаг 1: задать ориентировочное значение корня. Наберите: f
(<Ctrl>+<g>) (двоеточие) 1
  1
Шаг 2. Ниже наберите так называемое служебное слово Given (операторная скобка, обозначающая начало области решения уравнения).
Ниже слова наберите уравнение, ЗНАК РАВЕНСТВА НАБИРАЙТЕ
ПРИ НАЖАТОЙ КЛАВИШЕ <Ctrl> (он получится жирным – это специальный знак для решения уравнений).
Должно получиться так (правила набора см. выше):
Given
 0.6 
sin   2
Шаг 3. Закройте операторную скобку служебным словом Find, в его
аргументе укажите – что найти, затем наберите обыкновенный знак равенства – так: Find(f (<Ctrl>+<g>) )= .
Получится уточненное значение первого корня:
Find   0.8
Найдите и другие корни. Для этого сотрите (синим обхватом и клавишей backspace) значение ориентировочного корня (у нас =1) и замените
его на x2 (равно 3, см. график).
Решение изменится, найдется уточненное значение 2.828.
Затем присвойте ориентировочное значение 6.5 (будет уточнение
6.354) и 9.3 (будет 9.405).
§3. Учебная задача
3.1. Постановка задачи
Построить чертеж плоскости, содержащей 3 точки, показать точки
на этой плоскости.
ДАНО: координаты трех точек.
Точка 1:
x0:=1
y0:=2
z0:=3
Точка 2:
x1:=2
y1:=1
z1:=2
Точка 3:
x2:=3
y2:=3
z2:=1
ПОЛУЧИТЬ: уравнение плоскости, проходящей через эти точки, и
построить ее чертеж с указанием положения этих точек. Диапазон изменения координат на чертеже: 0  х  6, 0  у  6.
16
Решение проводим по этапам.
Этап 1. Проверить, не лежат ли точки на одной прямой.
Если да – ответ: плоскость не может быть построена: можно построить бесконечное число плоскостей, содержащих
одну прямую. Конец расчета. Если нет:
Этап 2. Составить уравнение плоскости, проходящей через 3 точки.
Этап 3. Составить исходные данные для построения чертежа плоскости и показа точек на чертеже.
Этап 4. Построить чертеж и установить опции, украшающие его.
3.2. Выполнение этапа 1 «Проверка, не лежат ли точки на одной
прямой»
Из курса алгебры мы знаем, что для проверки нужно составить
определитель из координат точек. Если определитель равен 0 – точки лежат на одной прямой.
Используем средства Mathcad для вычисления определителя.
Шаг 1. Формируем шаблон матрицы размерности 3×3. Для этого используем меню Insert Matrix или (быстрее) набираем <Ctrl>+<M> (мнемонически – Матрица), указываем число строк (rows) 3 и число столбцов
(columns) 3, затем нажимаем кнопку OK или (быстрее) клавишу Enter.
Получаем:








Шаг 2. В слоты шаблона вводим координаты точек. От слота к слоту
удобно перемещаться клавишей Tab (можно и мышью, но это дольше).
Получаем:
 x0 x1 x2 
 y0 y1 y2 


 z0 z1 z2 
Шаг 3. Охватываем матрицу синим контуром (так образуется объект
действий для Mathcad) и используем клавишу < | > для формирования
определителя (клавиша – вверху клавиатуры, под клавишей F11, имеет
вид вертикального пунктира). Получаем:
 x0 x1 x2 
 y0 y1 y2 


 z0 z1 z2 
17
Шаг 4. Теперь всё готово для вычислений. Набираем знак равенства
и получаем ответ.
 x0 x1 x2 
 y0 y1 y2   12


 z0 z1 z2 
Этап 1 завершен.
Поскольку определитель не равен 0, переходим к этапу 2.
3.3. Выполнение этапа 2 «Составление уравнения плоскости,
проходящей через 3 точки»
Из курса алгебры мы знаем, что уравнение плоскости составляется с
помощью соотношения:
 x  x0 y  y0 z  z0 


Определитель матрицы  x1  x0 y1  y0 z1  z0  равен 0.
 x2  x0 y2  y0 z2  z0 
Для составления уравнения используем символьные преобразования,
встроенные в Mathcad.
Шаг 1. Формируем определитель (как описано в пояснениях к этапу 1).
Получаем:
 x  x0 y  y0 z  z0 
 x1  x0 y1  y0 z1  z0 


 x2  x0 y2  y0 z2  z0 
Шаг 2. Охватываем определитель синим контуром справа (переключение контура слева направо и наоборот удобно делать клавишей Insert) и
нажимаем
три
клавиши,
удерживая
их
одновременно:
<Ctrl>+<Shift>+<точка>. Так вызывается Mathcad-процессор "живых"
символических преобразований (т. е. таких, которые будут автоматически
отслеживать изменение исходных данных).
Получаем:
Стрелка в Mathcad обозначает символьный знак равенства: сообщает
Mathcad’у, что нужно вывести формулу, а не результаты расчета. Если
стереть слот, охваченный синим контуром или просто "щелкнуть" левой
18
кнопкой мыши вне формулы, получится "заготовка" для уравнения плоскости:
 x  x0 y  y0 z  z0 
 x1  x0 y1  y0 z1  z0   3 x  12  3 z


 x2  x0 y2  y0 z2  z0 
А теперь представьте себе, что Вы раскрываете определитель вручную, делая много ошибок, и оцените мощность научной базы Mathcad,
позволяющей автоматизировать символьные преобразования!
(Не так давно символьные преобразования считались предметом чисто интеллектуальной работы, доступной только человеку).
Шаг 3. Составление уравнения плоскости. Для этого нужно приравнять нулю определитель, сформированный на шаге 2, и решить полученное уравнение относительно одной из координат (обычно относительно
аппликаты z).
Последовательность действий:
а) Копируем результат символьного вычисления определителя. Для
этого мышью выделяем его, затем клавишами <Ctrl>+<C> заносим в буфер, затем устанавливаем курсор на свободное место и извлекаем копию
из буфера (<Ctrl>+<V>). Получаем:
3∙x – 12 + 3∙z
б) Приравниваем полученное выражение нулю и решаем полученное
уравнение относительно z в символах. Для того чтобы это можно было
сделать средствами символьной математики, знак равенства используется
СПЕЦИАЛЬНЫЙ, так называемый ЖИРНЫЙ. Его набирают клавишами <Ctrl>+< = >. Получаем:
в) Вызываем символьный процессор (<Ctrl>+<Shift>+<точка>) и в
появившийся слот вписываем директиву solve,z (означает команду "реши
19
относительно z"). Получаем:
г) Щелкаем левой кнопкой мыши вне формулы и получаем искомое
уравнение:
3 x  12  3 z 0 solve  z  x  4
Это уравнение имеет форму z(x,y) := – x + 4 ( z(x,y) := нужно набрать,
а формулу скопировать и вставить в слот после знака присваивания).
Этап 2 завершен.
3.4. Выполнение этапа 3 «Составление исходных данных для
построения чертежа плоскости и показа точек на чертеже»
Используем функцию CreateMesh, описанную в п. 1.5.
Шаг 1. Строим 3-мерные вектора (<Ctrl>+<M>, rows 3, columns 1)
и вписываем в них координаты для плоскости Plane и точек T1, T2, T3:
 x 
 x0 
 x1 
 x2 
Plane( x y )  
y  T1( x y )   y0  T2( x y )   y1  T3( x y )   y2 


 
 
 
 z( x y) 
 z0 
 z1 
 z2 
Шаг 2. Пользуясь исходными данными для диапазона изменения аргументов плоскости ( 0  х  6, 0  у  6 ) и задаваясь числом линий сетки
по осям (например, 7 по оси x и 6 по оси y), определяем функцию
CreateMesh для вывода чертежа:
P  CreateMesh( Plane  0 6 0 6 7 6)
Этап 3 завершен.
3.5. Выполнение этапа 4 «Построение чертежа и установка
опций, украшающих его»
Шаг 1. Вызываем шаблон графика двух переменных (<Ctrl>+<2> или
из меню Insert Graph Surface Plot), в
слот вписываем имя P и через запятую
идентификаторы точек. Получаем
изображение, показанное на рис. 1.7.
Шаг 2. Щелкните левой кнопкой
мыши вне графика, и Вы увидите заготовку: черно-белый чертеж плоскости, точки на нем не видны. Вначале
покажите точки. Для этого щелкните
по графику 2 раза левой кнопкой мыши (появится окно опций графика).
Выберите вкладку Appearance (внешний вид) и для графиков 2, 3, 4 (вкладРис. 1.7.
20
ки Plot 2, Plot 3, Plot 4) включите кнопку Draw Points (рисовать точки),
укажите размер (size) 2 (иначе их будет плохо видно) и задайте разные
цвета (щелчком по кнопке Solid Color). Окно опций будет выглядеть так
(рис. 1.8):
Рис. 1.8. Окно задания цвета для точек графика.
Шаг 3. После появления точек выберите цветные опции для плоскости (вкладка Plot1), см. рис. 1.9.
Рис. 1.9.
Этап 4 завершен, решение задачи закончено.
21
§4. Индивидуальные задания по части 1
Вариант № 1:
Составьте уравнение и выведите
на тот же чертеж, который получился
при выполнении учебной задачи, отрезок прямой, соединяющей точки
(x0,y0,z0) и (x1,y1,z1) (координаты
заданы в условиях учебной задачи).
Должно получиться так, как показано на рис. 1.
Рис. 1
Вариант № 2:
Составьте уравнение и выведите
на тот же чертеж, который получился
при выполнении учебной задачи, чертеж плоскости, параллельной описанной в учебной задаче, и проходящей через точку с координатами
x3:= 3 y3:=3 z3:=8.
Диапазон изменения аргументов –
такой же, как в учебной задаче.
Должно получиться так, как показано на рис. 2.
Рис. 2
Вариант № 3:
Рис. 3
Составьте уравнение и выведите
на тот же чертеж, который получился
при выполнении учебной задачи, чертеж плоскости, проходящей через две
точки (x1,y1,z1) и (x2,y2,z2) перпендикулярно к плоскости, построенной в
учебной задаче. Точки также покажите на чертеже. Координаты (x1,y1,z1)
и (x2,y2,z2) заданы в условиях учебной задачи. Диапазон изменения аргументов:
–1  x  6; –1  y 6.
Обязательно сделайте проверку по
условию перпендикулярности плоскостей.
Должно получиться так, как показано на рис. 3.
22
Вариант № 4:
Постройте чертеж плоскости,
параллельной координатной плоскости и расположенной на высоте, равной 4. Постройте на том же чертеже
плоскость, перпендикулярную координатной плоскости и отсекающую
на осях x и y отрезки, равные 5.
Должно получиться так, как показано на рис. 4.
Рис. 4
Вариант № 5:
Выведите уравнения (аналогично выводу уравнения шара) для конуса и постройте чертеж половины конуса, как показано на рис. 5.
Высота конуса равна 4, угол при
вершине конуса равен  / 3.
Рис. 5
Вариант № 6:
Выведите уравнения (аналогично выводу уравнения шара) для цилиндра и постройте чертеж одной
третьей части цилиндра, как показано
на рис. 6.
Высота цилиндра равна 4.
Рис. 6
23
Вариант № 7:
Выведите уравнения (аналогично выводу уравнения шара) для цилиндра и постройте чертеж его сечения плоскостью, расположенной параллельно координатной плоскости
на высоте, равной 2.
Высота цилиндра равна 4.
Должно получиться так, как показано на рис. 7.
Рис. 7
Вариант № 8:
Выведите уравнения (аналогично выводу уравнения шара) для цилиндра, постройте чертеж его половины, «обнимающей» полусферу того
же радиуса R = 2, что и радиус основания цилиндра.
Высота цилиндра равна 4.
Должно получиться так, как показано на рис. 8.
Рис. 8
Вариант № 9:
Постройте чертеж ¼ сферы,
накрытой плоскостью, как показано
на рис. 9. Радиус сферы равен 2.
Плоскость должна быть параллельна
координатной плоскости XOY. На
плоскости должна быть видна линия
пересечения поверхности сферы с
плоскостью. Плоскость должна рассекать ¼ сферы по «экватору».
Рис. 9
24
Вариант № 10:
Постройте чертеж пересечения
прямой, проходящей через 2 точки
(x0,y0,z0) и (x1,y1,z1) (координаты
заданы в условиях учебной задачи), с
плоскостью, параллельной координатной плоскости XOY и проходящей
на высоте 2.5. На чертеже покажите
точку пересечения. Для контроля правильности расчета покажите 2 точки,
через которые проходит прямая.
Должно получиться так, как показано на рис. 10 (точки (x0,y0,z0) и
(x1,y1,z1) не показаны).
Рис. 10
25
ЧАСТЬ 2. МАТРИЦЫ И ВЕКТОРЫ В MATHCAD
Введение. Общие сведения о матричной алгебре в Mathcad
Mathcad содержит мощные средства для работы с матрицами и векторами, основанные на аксиомах алгебры матриц. Математические операции, основанные на алгебре матриц, очень широко используются в инженерной и программистской практике. Этими операциями Вы должны
владеть свободно – так, как обычной алгеброй.
Перечень основных операций с матрицами и векторами:
1. Ввод матрицы (вектора), обращение к любому из ее столбцов
или элементов, добавление и удаление столбцов и строк, выделение блоков из матрицы, соединение матриц или векторов.
2. Определение размерностей матриц и векторов.
3. Вычисление определителя матрицы.
4. Чтение массивов данных из дисковой памяти в матрицу или вектор.
5. Запись матрицы (вектора), содержащей результаты расчета, на
диск.
6. Сортировка элементов вектора по убыванию или возрастанию,
определение пересечений (т. е. одинаковых элементов) в двух векторах.
7. Транспонирование матриц.
8. Все операции матричной алгебры (умножение на скаляр, сложение и умножение матриц, обращение матриц, возведение матрицы в степень).
9. Вычисление скалярных произведений и квадратичных форм.
10. Вычисление собственных (характеристических) чисел и векторов.
11. Решение систем линейных уравнений с помощью матричной алгебры.
12. Выполнение одинаковых операций над всеми элементами матрицы (так называемая векторизация).
13. Символьные вычисления с матрицами и векторами.
Многие другие операции с матрицами понадобятся Вам при изучении дисциплин учебного плана на старших курсах.
26
Вид окна «Матрицы» (Insert matrix).
Закрыть окно
Окошко
ввода
числа
строк
Кнопка вывода шаблона матрицы, или
результата изменения
числа строк и/или
столбцов на экран
Кнопка вставки (Jnsert) и
удаления (Delete) числа
строк и/или столбцов указанного в окошках ввода
Окошко
ввода
числа
столбцов
Кнопка сброса
Рис. 2.1. Окно «Матрицы» и пояснения к нему.
Окно «Матрицы» (рис. 2.1) вызывается из меню Insert – Matrix или
(это быстрее и лучше) клавишами <Ctrl>+<M> (можно набрать либо
строчную m, либо прописную M, мнемоническая связь m – matrix).
§5. Осваиваем технику работы с матрицами и векторами
Будем изучать возможности матричной алгебры Mathcad на примерах.
5.1. Ввод матрицы и вектора
Наберите идентификатор матрицы. Традиция представления матриц
в научной литературе предписывает использовать в качестве идентификаторов матриц прописные литеры (хотя не будет ошибки и при использовании строчных). Затем наберите знак присваивания (<двоеточие>, на
экране выведется :=), после чего вызовите окно «Матрицы»
(<Ctrl>+<M>). Экран будет выглядеть так, как показано на рис. 2.2:
Рис. 2.2. Подготовка к вводу матрицы. Число строк и столбцов указано по умолчанию.
27
Мы видим, что имеется указание числа строк и столбцов (по умолчанию 3). Исправьте их для ввода нашего примера. Число строк (rows)
укажите равным 3, число столбцов (columns) –


равным 4 и нажмите OK. Между окошками ввода

лучше всего перемещаться клавишей <Tab> (можA  


но и мышью). На экран выведется шаблон мат

рицы со слотами для ввода значений (рис. 2.3).
Пользуясь клавишей <Tab> для перемещеРис. 2.3. Шаблон
ния
между
слотами, введите какие-либо числовые
матрицы.
данные, затем щелкните левой кнопкой мыши
где-либо вне шаблона (рис. 2.4).
2 4 5 6 
Ввод матрицы с числовыми значениями заA   5 7 8 9  вершен.


Аналогично вводятся частные случаи мат 1 7 6.8 9.3 
риц – векторы (для их ввода нужно указать число
столбцов = 1) и строки (для них нужно указать
Рис. 2.4. Матрица
число строк = 1).
введена.
Освоим теперь операцию ввода матриц в
форме функции значений их элементов. Сформируем, например, вектор с
числом элементов, равным 2, как функцию от значений этих элементов.
Наберите B(b1,b2):= и затем вызовите окно «Матрицы». Введите число
строк (2) и столбцов (1), нажмите OK и в слоты введите параметры b1 и
b2. Здесь 1 и 2 – НЕ индексы, а косметические обозначения (вводятся через косметическую точку). Результат ввода показан на рис. 2.5.
 b1 
B b 1  b 2   
 b2 



 7 

 0.6 
B( 7  0.6)  

Рис. 2.5. Матрица как функция значений ее элементов.
Если теперь Вы наберете идентификатор вектора и укажете в скобках числовые значения параметров, вектор получится с числовыми значениями (см. рис. 2.5).
Ввод матрицы в форме функции значений ее элементов завершен.
5.2. Обращение к элементам матриц.
По умолчанию элементы матриц нумеруются в Mathcad начиная с
нулевого. При желании можно переопределить начальный индекс, но
лучше этого не делать (из-за этого осложнится обращение ко многим
встроенным функциям и работа с программами). После небольшой тренировки Вы привыкнете считать элементы с нуля (как американцы).
28
Пример: прочтем второй элемент третьей строки матрицы A. Для
этого наберем, используя клавишу ввода индексов (открывающая квадратная скобка [ ): A[2,1 и увидим на экране результат (рис. 2.6). Для вывода какого-либо значения вектора номер столбца указывать не нужно.
Выведите, например, значение вектора B(3,7) из второй строки (результат
– на рис. 2.6).
2 4 5 6 
A   5 7 8 9 


 1 7 6.8 9.3 
 b1 
B b 1  b 2   
 b 2 


 7 

 0.6 
B( 7  0.6)  
A
2 1
 7
B( 7  0.6)  0.6
1
Рис. 2.6. Вывод элементов матриц на экран.
Изучение обращения к элементам матриц и векторов завершено.
Не забудьте записать результаты на диск!
5.3. Обращение к столбцу матрицы
Весьма полезной является операция формирования векторов из отдельных столбцов матрицы. С такой операцией мы встречаемся, например, когда вводим исходные данные из таблицы (из файла), а для обработки этих данных удобно пользоваться столбцами матрицы как отдельными векторами.
Освоим эту операцию при решении задачи.
ДАНО: имеется файл результатов наблюдения за процессом нагрева
материала в печи, в котором указаны значения подачи топлива (первый
столбец) и соответствующего ему значения температуры в печи (столбец 2).
Имя файла 4.txt, распложен в папке Mathcad преподавателя. Скопируйте
этот файл в свою папку, в которую Вы записываете текущие результаты
работы с матрицами. Это избавит Вас от необходимости указывать длинный путь к файлу 4.txt, размещенному не в текущем каталоге. Рассмотрите
из оболочки операционной системы структуру этого файла. Вы увидите 2
столбца символов, кодирующих результаты опыта (ASCII-коды, American
Standard Codes for Information Interchange, американские стандартные коды
для обмена информацией между различными средами программирования и
обработки данных, по-русски произносится «АСКИ-коды»).
29
ПОЛУЧИТЬ: в среде Mathcad представить на графике результаты
наблюдений, записанные в файле 4.txt.
Последовательность действий для решения задачи:

Этап 1. Ввести таблицу результатов наблюдений из файла 4.txt
в матрицу в среде Mathcad.

Этап 2. Сформировать из полученной матрицы векторы, один
из которых представляет собой запись результатов подачи топлива (первый столбец в файле, который после выполнения этапа 1 представлен в нулевом столбце
матрицы), а второй – значения температуры (второй столбец в файле, который после выполнения этапа 1 представлен в первом столбце матрицы).

Этап 3. Рассчитать число элементов в полученных векторах (это
число позволит определить диапазон изменения индексов элементов массива, чтобы указать его на графиках).

Этап 4. Указать диапазон изменения индексов элементов массива по результатам выполнения этапа 3.

Этап 5. Вывести результаты на график.
Выполнение этапа 1 «Ввод файла данных, записанных в ASCIIкодах, в среду Mathcad». Наберите какой-либо идентификатор матрицы
(например, X), в которую будете вводить данные, и введите функцию
чтения данных READPRN (имя функции нужно набирать ПРОПИСНЫМИ)
X : = READPRN(“4.txt”)
Этап 1 завершен.
Выполнение Этапа 2 «Формирование векторов из матрицы X».
Выборка векторов создается с помощью клавиш <Ctrl>+<^> («шляпка»
над цифрой 6 на левой части клавиатуры). Введите идентификатор для
значений топлива (например, Fuel), затем наберите знак присваивания, в
образовавшийся слот введите идентификатор матрицы (X) и нажмите
<Ctrl>+<^>. Образуется слот, в который нужно вписать номер столбца
X  READPRN( "4.txt" )
матрицы X (не забудьте – счет начи 0
 1 нается с нуля!). Аналогично обраFuel  X
Temperature  X
Рис. 2.7. Формирование векторов
из матрицы.
зуйте вектор для значений температуры (Temperature). Должно получиться так, как показано на рис. 2.7.
Этап 2 завершен.
Выполнение этапа 3 «Расчет числа элементов в векторах». Это
можно сделать, используя функцию rows( ), которая возвращает число
30
X  READPRN( "4.txt" )
 0
Fuel  X
 1
Temperature  X
n  rows ( Fuel)
n  375
m  rows ( Temperature)
m  375
Рис. 2.8. Определение числа строк
матрицы.
строк матрицы или вектора. Введите
идентификаторы числа строк векторов Fuel и Temperature и затем
проверьте, одинаковы ли числа
строк в обоих векторах. Если совпадения нет – имеется ошибка ввода.
Должно получиться так, как показано на рис. 2.8.
Этап 3 завершен.
Выполнение этапов 4 и 5. Диапазон изменения индексов векторов
Fuel и Temperature – от 0 до значения, на единицу меньшего, чем число
строк в этих векторах (так получается из-за нумерации с нуля). Вводим
диапазон (напоминание: наберите идентификатор индексной переменной,
например, s, затем знак присваивания «двоеточие», затем начальный номер индекса 0, затем знак диапазона «точка с запятой», затем номер последнего элемента). Затем вводим шаблон графика (лучше всего клавишами
<Shift>+<@>), в слот абсциссы вводим идентификатор индексной переменной, а в слоты ординаты – значения векторов (напоминание: для ввода
нового слота нужно охватить «старый» слот синим контуром и нажать клавишу
«запятая»). Выведется график. Приведите его к надлежащему виду: щелч-
ком левой кнопки мыши по его полю вызовите окно форматирования
графика, включите линии сетки, укажите «русское» расположение осей
(crossed). Должно получиться так, как показано на рис. 2.9.
Рис. 2.9. Вывод графика, показывающего элементы векторов.
Этапы 4 и 5 завершены, решение задачи закончено.
31
5.4. Добавление и удаление столбцов и строк
Пусть, например, нужно удалить третий столбец матрицы A, в результате чего должна образоваться матрица размером 33. Установите
синий указатель на третьем элементе первой строки матрицы A так, чтобы угол указателя был справа, вызовите окно «Матрицы» (<Ctrl>+<M>)
и укажите число удаляемых строк (равно 0) и столбцов (равно 1). После
этого нажмите клавишу Delete окна «Матрицы». Должно получиться так,
как показано на рис. 2.10.
После нажатия кнопки ОК
этот столбец будет удален
Нажмите для
удаления указанного числа
строк и столбцов
Рис. 2.10. Удаление строк и столбцов матрицы.
5.5. Вырезывание прямоугольных блоков из матрицы
(декомпозиция матрицы)
Для многих операций матричной алгебры требуется вырезать из
матрицы блоки. Чаще всего эти операции делаются для выделения блоков, все элементы которых равны 0. Такие блоки удобно хранить в памяти отдельно (просто указать размер блока, зная, что все элементы в нем –
нулевые). Матрицы, в которых число нулей существенно больше, чем
число значащих чисел, называются разреженными, и именно для них будет достигнуто сокращение объема памяти, если знать структуру расположения нулевых блоков.
Решим задачу. Пусть известно, что матрица размером nn имеет
структуру Якоби, т. е. такую, как показанная на рис. 2.11. Содержимое
всех свободных клеток – нули.
Выделим характерные блоки, показанные на рис. 2.11-б.
1. Столбец, содержащий первые (n-1) строк матрицы – целиком
нулевой;
2. Нижняя строка матрицы – заполнена значащими числами;
3. Субматрица размером (n-1)(n-1), размещенная выше этой
строки и правее нулевого столбца – диагональная матрица с единицами в
диагонали (т. е. единичная матрица).
32
а)
б)
Рис. 2.11. Сильно разреженная матрица: а) матрица Якоби; б) характерные блоки матрицы
Представим себе, что в результате решения некоторой инженерной
задачи получился ответ в виде матрицы со структурой Якоби, и нужно
записать этот результат на диск для использования в дальнейшем. Присвойте элементам матрицы какие-либо значения, например, как показано
на рис. 2.12. Удобнее всего ввести ее так: с помощью клавиши <Tab>
очень быстро «нащелкать» нули для всех элементов, а затем исправить
нужные на значащие числа. Размерность матрицы в примере 1010. Учитывая особенности нумерации с нуля, введите максимальное значение
индекса строк и столбцов (n := 9)
Легко увидеть (рис. 2.11-б и 2.12), что для последующей реконструкции такой матрицы достаточно хранить в памяти только нижнюю
строку. Остальные элементы можно
доопределить вычислениями.
Освоим функцию submatrix( ),
позволяющую вырезать из матрицы
прямоугольный блок. В нашем примере для запоминания всей матрицы
нужно вырезать строку, номера элементов которой – от первого до последнего элемента последней строки
матрицы D (рис. 2.13). Аргументы
функции (их пять, перечисляются через запятую):

идентификатор матрицы, из
которой производится извлечение
блока;

номера первой и последней
Рис. 2.12. Матрица Якоби
с числами.
строк матрицы, соответствующие извлекаемому блоку;
33

номера первого и последнего столбцов матрицы, соответствующие извлекаемому блоку.
Максимальное значение
строк и столбцов (нумерация – с нуля!)
Начальный и конечный
номера столбцов матрицы,
соответствующие извлекаемому блоку
Идентификатор матрицы,
из которой извлекаются
блоки
Результаты извлечения блоков
Начальный и конечный номера
строк матрицы, соответствующие извлекаемому блоку
Рис. 2.13. Операции извлечения блоков матрицы.
Введите соответствующие функции и рассмотрите, правильно ли получилось извлечение (наберите идентификатор блока и знак равенства).
Декомпозиция матрицы на блоки завершена.
34
5.6. Запись массивов данных на диск
В рассматриваемом примере информативная часть расчетов содержится в блоке D1. Сохраним его на диске. Далее (п. 5.7) будем имитировать ситуацию последующего использования матрицы D, но получим ее
путем реконструкции структуры Якоби.
Запись на диск делается с использованием функции WRITEPRN( ),
в качестве аргумента которой указывается имя файла в кавычках. Если
запись производится не в текущий каталог, нужно указать полное имя
файла (содержащее имя и путь к нему). Имя функции нужно набирать
ПРОПИСНЫМИ буквами.
WRITEPRN(“5.txt”) : = D1
Если выйти в текущий каталог, то мы найдем в нем файл с именем
5.txt, записанный из Mathcad’а в ASCII-кодах.
Запись на диск проведена.
5.7. Соединение (композиция) матриц и векторов
Продолжим решение задачи п. 5.5 – 5.6. – представим себе, что нужно реконструировать матрицу Якоби по записи ее последней строки в
файле 5.txt. «Забудем» также размерность матрицы (ее тоже нужно будет
реконструировать). Этапы решения:

Этап 1. Чтение строки матрицы из файла 5.txt.

Этап 2. Определение размерности матрицы, подлежащей реконструкции.

Этап 3. Формирование недостающих блоков (нулевого столбца
и диагональной субматрицы).

Этап 4. Соединение нулевого столбца и диагональной субматрицы, получение верхней части матрицы Якоби.

Этап 5. Соединение верхней части матрицы Якоби, полученной
на этапе 4, с информативной нижней строкой, считанной из файла на этапе 1.
Выполнение этапов 1 и 2 «Чтение с диска и определение размерности».
Выберем идентификатор матрицы (например, Z) и прочтем в нее
информативную строку матрицы Якоби из файла 5.txt. Определим число
элементов в этой матрице, зная, что она является строкой. Число столбцов определяется с помощью функции cols( ) (сокращение от columns –
столбцы). Определим также максимальное значение индекса элементов
строки (на 1 меньше числа столбцов, учитывая нумерацию с нуля).
Должно получиться так, как показано на рис. 2.14.
35
Z  READPRN( "5.txt" )
Результат чтения из файла
0
Z
0
1
1
3
2
5
3
6
4
8
5
7
6
9
7
2
8
6
9
3
Число столбцов в строке Z
n  cols ( Z)  1
n9
- максимальное значение
индекса элементов строки Z
Рис. 2.14. Чтение из файла в матрицу и определение размерности.
Этапы 1 и 2 завершены.
Выполнение этапа 3 «Формирование недостающих блоков», см.
рис. 2.11, 2.12.
Вначале сформируем левый столбец, все элементы которого – нулевые.
Индекс последнего элемента – на 1 меньше размерности матрицы, т. е. n-1.
Научимся вводить векторы по уравнениям элементов:
– задаем диапазон изменения индекса;
– записываем формулу (через оператор присваивания :=) для вычисления каждого элемента;
– выводим результат для проверки.
Должно получиться так, как показано на рис. 2.15.
Значения, которые принимает
индекс элементов вектора
 0 
0
V  0
j
0
0
 
Идентификатор индекса
V 0
(набор индекса – клавишей < [ >)
0
 
0
Идентификатор вектора
0
 0 
j  0  n  1
36
Результат
Рис. 2.15. Чтение из файла в матрицу и определение размерности.
E  identity ( n )
 1
0
0
0

E 0
0

0
0
 0
0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0


0
0

0
0
1 
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0
Получена
матрица 99
Ïîëó÷åíà ìàòðèöà
9õ9
Рис. 2.16. Генерация единичной
матрицы.
Следующий недостающий блок –
единичная матрица (правая верхняя
часть матрицы Якоби, рис. 2.11).
Размерность единичной матрицы –
на 1 меньше, чем размерность матрицы
Якоби.
Воспользуемся
встроенной
Mathcad-функцией, возвращающей единичную матрицу. Аргументом функции
является размерность этой единичной
матрицы (в нашем случае n – не путайте
с нумерацией индексов!).
Имя функции identity( ). Выберите
идентификатор (например, E) и присвойте ему значение единичной матрицы
размерности nn. Затем выведите матрицу на экран для проверки. Должно получиться так, как показано на рис. 2.16.
Этап 3 завершен.
Выполнение этапов 4 и 5 «Композиция («сращивание») блоков с целью получения матрицы Якоби».
При «сращивании» матриц главное – не напутать с размерностями.
Встык (слева направо) можно сращивать матрицы с одинаковым числом
строк (а число столбцов может быть разным). «Сверху вниз» можно,
наоборот, сращивать матрицы с одинаковым числом столбцов (а число
строк может не совпадать).
В нашем примере можно срастить нулевой вектор V и единичную
матрицу E. Соединение матриц встык (т. е. так, чтобы первая матрица
примкнула ко второй слева) производится встроенной функцией augment( ),
аргументами которой являются идентификаторы сращиваемых матриц
(можно сращивать 2 и более матрицы с обязательно совпадающим числом
строк). Введите идентификатор (например, Upper_Jacob) и присвойте ему
результат сращивания матриц. Должно получиться так, как показано на
рис. 2.17. Там же показано ошибочное соединение матриц с несовпадающим числом строк. Mathcad в этом случае выведет сообщение об ошибке,
если установить указатель мыши на часть формулы, показанной красным
цветом.
37
Соединение матриц «встык» с
согласованными размерностями
Попытка соединить матрицы, не
согласованные по размерностям. Выведено
сообщение об ошибке:
«Число строк и/или столбцов не совпадает»
Рис. 2.17. Соединение матриц встык.
Осталось соединить «сверху вниз» матрицу Upper_Jacob и введенную из файла строку Z. Такое соединение выполняется функцией stack( )
также с контролем согласованности размерностей (числа столбцов обязательно должны совпадать). Введите идентификатор (например, Jacob)
и присвойте ему результат стыковки матриц. В результате получится
матрица Якоби, которую мы «собрали» с помощью вычислений при
очень малом вводе из файла (там хранится только 10 % общего числа
элементов матрицы). Результат должен получиться таким, как показано
на рис. 2.18.
Рис. 2.18. Результат композиции матриц.
Выполнение этапов 4 и 5 завершено.
Решение задачи закончено.
38
§6. Алгебра матриц
Материал этого раздела особенно полезен тем, кто хочет хорошо
освоить дисциплину «Алгебра и геометрия» и успешно сдать экзамен.
6.1. Транспонирование матриц
Для транспонирования матрицы нужно ввести какой-либо идентификатор, затем ввести оператор присваивания и в появившийся слот ввести идентификатор транспонируемой матрицы. Этот идентификатор окажется охваченным синим контуром. Не снимая контур, нажмите клавиши
<Ctrl>+<1>. Введется символ транспонирования (рис. 2.19). Просмотрите результат: строки и столбцы поменяются местами.
Транспонирование изучено.
 2 4 5 6  Èñõîäíàÿ ìàòðèöà.
=3,
A   5 7 8 9  ×èñëî ñòðîê

 ÷èñëî ñòîëáöîâ =4
 1 7 6.8 9.3 
Îïåðàöèÿ òðàíñïîíèðîâàíèÿ
(êëàâèøè <Ctrl>+<1>)
T
C  A
 2
4
C
5
6

 Òðàíñïîíèðîâàííàÿ ìàòðèöà.
7 7 
×èñëî ñòðîê
=4,
÷èñëî
ñòîëáöîâ
=3
8 6.8 

9 9.3 
5 1
Рис. 2.19. Транспонирование матрицы.
6.2. Умножение матрицы на скаляр
Согласно аксиомам алгебры матриц умножение на скаляр состоит в
том, что на него умножается каждый элемент матрицы. Например, введите операцию умножения на скаляр как на параметр (рис. 2.20). Затем выведите идентификатор матрицы-произведения с каким-либо значением
параметра. Вы увидите результат умножения.
Умножение на скаляр изучено.
39
2 4 5 6 
A  5 7 8 9 


 1 7 6.8 9.3 
Èñõîäíàÿ
ìàòðèöà-ñîìíîæèòåëü
Ââîä îïåðàöèè óìíîæåíèÿ íà ñêàëÿð
 20 40 50 60 
D( 10)   50 70 80 90 


 10 70 68 93 
D      A
Ðåçóëüòàò óìíîæåíèÿ
ìàòðèöû íà ñêàëÿð 10
Рис. 2.20. Умножение матрицы на скаляр.
6.3. Операции умножения матриц
Запомните общее простое правило проверки размерностей матриц, при которых умножение возможно.
Подпишите размерности под матрицами и проследите, чтобы внутренние цифры были одинаковыми
Внешние цифры дадут размерность результата (рис. 2.21).
Рис. 2.21. Правило размерностей для умножения матриц.
6.3.1. Умножение матрицы на вектор справа и слева. Согласно
правилам матричной алгебры возможно умножение матрицы на вектор
справа. В результате получится вектор, содержащий столько же строк,
сколько исходная матрица. Умножение возможно только тогда, когда
число столбцов матрицы-сомножителя точно совпадает с числом элементов вектора (при попытке умножить матрицы, не согласованные по размерности, выведется сообщение об ошибке – такое же, как показано на
рис. 2.17).
40
Для умножения матрицы на вектор слева его нужно предварительно
транспонировать. Результат умножения – строка с таким же числом элементов, сколько столбцов у исходной матрицы. Умножение слева возможно только тогда, когда число элементов вектора точно совпадает с
числом строк матрицы-сомножителя. Сделайте упражнение, показанное
на рис. 2.22.
Умножение матрицы на вектор изучено.
1 
 
2 4 5 6 
1


A  5 7 8 9
B   


1 
 1 7 6.8 9.3 
 1 
 
Óìíîæåíèå ìàòðèöû íà âåêòîð ñïðàâà.
Ñîìíîæèòåëè: ìàòðèöà À è âåêòîð Â.
Ðàçìåðíîñòè ñîãëàñîâàíû:
÷èñëî ñòîëáöîâ À = ÷èñëó ýëåìåíòîâ  = 4
Ôîðìóëà ïðîèçâåäåíèÿ ìàòðèö:
F  A  B
 3 
Ðåçóëüòàò: ïðîèçâåäåíèÿ
ìàòðèöû íà âåêòîð åñòü âåêòîð F   3 
 
 5.5 
Ïîïûòêà óìíîæèòü ìàòðèöó íà âåêòîð ñëåâà.
Íåñîãëàñîâàííîñòü ðàçìåðíîñòåé:
÷èñëî ýëåìåíòîâ
âåêòîðà ÍÅ ðàâíî ÷èñëó ñòðîê ìàòðèöû.
Ñîîáùåíèå îá îøèáêå.
T
F1  B  A
The number of rows and/or column
in these array do not match
T
T
Óìíîæåíèå ñëåâà ñ ñîãëàñîâàííûìè ðàçìåðíîñòÿìè:
G  B  A
Ðåçóëüòàò óìíîæåíèÿ - ñòðîêà:
G  ( 3 3 5.5 )
Рис. 2.22. Умножение матрицы на вектор справа и слева.
6.3.2. Умножение вектора на вектор (частный случай п. 6.3.1).
Размерности векторов могут не совпадать. Второй вектор-сомножитель
должен транспонироваться. Результат умножения – матрица, число ее
строк равно числу элементов первого вектора-сомножителя, а число
столбцов – числу элементов второго вектора-сомножителя. Сделайте
упражнение, показанное на рис. 2.23.
Умножение вектора на вектор изучено.
6.3.3. Скалярное произведение векторов. Операция может быть выполнена только с векторами одинаковой размерности. Первый векторсомножитель нужно транспонировать. Результат умножения – скаляр.
Важное замечание: Mathcad выводит результат не в форме числа, а в
форме матрицы размерности 11. При некоторых вычислениях нужно указывать номер элемента этой «матрицы». Сделайте упражнение по рис. 2.23.
Скалярное произведение изучено.
41
Неудачная попытка умножить матрицу на скаляр (особенности
Mathcad: скалярное произведение
трактуется как матрица, поэтому
Mathcad считает что не соблюдается
правило размерностей)
Так нужно «обмануть»
Mathcad: указать номер элемента «матрицы» - скалярного
произведения (индекс вводится
скобкой [ )
Рис. 2.23. Умножение вектора на вектор. Скалярное произведение векторов.
6.3.4. Умножение матриц совершается аналогично умножению
матрицы на вектор (п. 6.3.1). Важнейшее требование – соблюдение правила размерностей матриц-сомножителей. При работе со сложными
формулами не поленитесь подписать размерности под матрицами, как
показано на рис. 2.21: это спасет Вас от многих ошибок.
Упражнение – в разделе 6.6.
Умножение матриц изучено.
6.4. Сложение матриц
Сложение матриц может быть выполнено только с матрицами
одинаковой размерности. При нашей работе с Mathcad выявилась ошибка, допущенная его авторами: Mathcad считает возможной операцию
сложения матрицы со скаляром (прибавляет этот скаляр к каждому элементу матрицы). Такая операция в алгебре матриц запрещена.
Упражнение – в разделе 6.6.
Сложение матриц изучено.
42
6.5. Операции с квадратными матрицами
Вначале подготовимся к работе. Образуйте матрицу размером 33:
Она нам понадобится для освоения операций с квадратными матрицами.
6.5.1. Определитель квадратной матрицы.
 1 3 9
Для вычисления определителя нужно ввести
A   7 6 11 
идентификатор матрицы (сама квадратная мат

рица должна быть определена на листе Mathcad
 0.7 4 5 
выше). Затем нужно нажать клавишу со значком
determinant  A
(выше клавиши <Ctrl> справа). Идентификатор матрицы окружат вертикальные линии. Если
determinant  175.7 нажать клавишу < = >, то выведется значение
определителя. Часто бывает удобно присвоить
Рис. 2.24. Определитель матрицы.
значение определителя некоторой переменной,
чтобы использовать ее в дальнейших вычислениях. Выполните упражнение, показанное на рис. 2.24.
Вычисление определителя изучено.
6.5.2. Длина вектора. Для вычисления длины вектора (квадратный
корень из суммы квадратов всех его элементов) используется та же клавиша , что и для вычисления определителя матрицы. Сделайте упражнение по рис. 2.25.
Определение длины изучено.
1
 
2
V   
3
4
 
dlina  V
dlina  5.477
T
V  V  ( 5.477 )
Ïðîâåðêà: òîò æå ðåçóëüòàò äîëæåí ïîëó÷èòüñÿ, åñëè
èçâëå÷ü
èçполучиться,
ñêàëÿðíîãî если
Проверка:
тотêâàäðàòíûé
же результатêîðåíü
должен
ïðîèçâåäåíèÿ
âåêòîðàкорень
ñàìîãî из
íà скалярного
ñåáÿ. Çíà÷îê
êîðíÿ
извлечь квадратный
произвеââîäèòñÿ
êëàâèøåé
\ >себя.
(íàäЗначок
êëàâèøåé
ñïðàâà)
дения вектора
самого<на
корняCtrl
вводится
клавишей < \ > (над клавишей Ctrl справа)
ÌûМы
ñíîâà
âèäèì
îñîáåííîñòü
âûâîäà
ðåçóëüòàòà
снова
видим
особенность
вывода
результата
ñêàëÿðíîãî
ïðîèçâåäåíèÿ
â
ôîðìå
ìàòðèöû
скалярного произведения в формате 11 1õ1
Рис. 2.25. Вычисление длины вектора.
6.5.3. Обращение квадратных матриц. Согласно аксиомам алгебры
матриц обратной матрицей называется такая, результат умножения которой на исходную матрицу есть единичная матрица. Обращение матрицы возможно только в том случае, когда ее определитель не равен нулю
43
(в противном случае Mathcad выведет сообщение об ошибке). Для обращения матрицы нужно охватить идентификатор обращаемой матрицы
синим контуром и нажать клавиши <Shift>+<6> (как для ввода степени).
В слот нужно ввести степень -1.
Упражнение – в разделе 6.6.
Операция обращения матрицы изучена.
6.6. Решение примеров с действиями алгебры матриц
6.6.1. Решим пример 1, иллюстрирующий все изученные операции.
Постановка задачи. Случается, что математический результат, полученный исходя из строгой формальной постановки задачи, не обладает прозрачностью, нужной для использования в инженерной практике. Так произошло с формулами, разработанными для выделения полезного сигнала из
результатов измерения с помехами. Математический результат был получен
М. Аоки в форме матричного выражения ( A  B  R 1  B T ) 1 .
nn
nm
mm
mn
Здесь A – квадратная матрица размерности nn, R – квадратная матрица
размерности mm, B – неквадратная матрица размерности nm. На рис.
2.26 показан результат проверки соответствия размерностей.
До работ М. Аоки в инженер1
T 1
ной практике уже использовались
(A  B  R
 B )
фильтры помех, но внешне струкnn n m m  m m n
тура известных фильтров не отвечала выведенному матричному
Должны быть
уравнению. М. Аоки предположил,
одинаковыми
что причина не в том, что синтезиРазмерность результата
рованный им фильтр не сходен с изумножения n  n
вестным, а в том, что полученная им
формула имеет другое тождеРазмерности суммиственное представление, отвечаюруемых матриц
щее структуре инженерного фильдолжны совпадать
тра.
Для подтверждения этого предположения было использовано специальное матричное тождество.
Рис. 2.26. Проверка размерностей.
A  BR 1BT 1
A
1
A
1
T
 B B  A
Замечание: представляет интерес – каким же образом автор тождества додумался до получения такой огромной формулы (ведь тождества не доказываются, а лишь проверяются, поэтому
их можно только придумать, а не вывести из теорем). Скорее всего, автор руководствовался
стремлением согласовать формулу с инженерными интуитивными выводами. Для этого нужно
было выделить A-1 в качестве вычитаемого. Если все величины – скаляры, такое выделение получается элементарно. После этого остается переписать формулу со скалярами в матричную
формулу с соблюдением размерностей и получить тождество как новый научный результат.
44
1
B  R
 1
Решение примера. Выполните проверку этого тождества по рис. 2.27.
В ходе проверки закрепите все знания по матричной алгебре, полученные
в ходе лабораторной работы. При расчетах с другой матрицей R используйте правила размерностей при сложении и умножении матриц.
Ñôîðìèðóéòå èñõîäíûå äàííûå:
 13 1 200 
R   0 19 1 


 0.1 0.3 0.9 
Âû÷èñëèòå
 7 2 0.5 
 0.5 0 
 A  

 11 0.1 3 
 0 0.4 
B  
A  BR 1BT 1
 1.286 0.8 


 0.185 0.11 
Äîëæíî ïîëó÷èòüñÿ
Âû÷èñëèòå
A
1
A
T
1
1
 B B  A  B  R
1.286 0.8 



 0.185 0.11 
 13
Âñòàâüòå ñòîëáåö è ñòðîêó
0
R  
â ìàòðèöó R, ÷òîáû ïîëó÷èëîñü:
 0.1
 3

Äîëæíî ïîëó÷èòüñÿ
 1BTA 1

19 1 7 
0.3 0.9 8 

9
23 19 
1
200 1
Âíåñèòå èñïðàâëåíèÿ â äðóãèå èñõîäíûå äàííûå, ÷òîáû ðàñ÷åòû
ñòàëè âîçìîæíûìè.
Рис. 2.27. Контрольные примеры.
6.6.2. Составьте сами примеры, иллюстрирующие аксиомы и теоремы алгебры матриц (по таблице заданий). При составлении примеров используйте размерности не ниже 3 и соблюдайте правила согласования
размерностей при сложении и умножении матриц.
Таблица заданий для разработки иллюстративных примеров.
Замечание: в строках таблицы использованы одни и те же обозначения (A, B, C), но
это не означает, что в примерах должны быть использованы одинаковые матрицы для всех
формул (нужно каждый раз переопределять матрицы, чтобы соблюдалось согласование
размерностей).
Составленные примеры покажите преподавателю. Постарайтесь за45
помнить формулы, приведенные в табл. 1, они многократно Вам понадобятся при изучении самых разных дисциплин.
Таблица 1
№ Аксиомы и теоремы теории
матриц
T
T
1. (AB) = B AT
2.
3.
4.
5.
6.
7.
Примечания
A, B – прямоугольные матрицы согласованных размерностей. Для
ввода знака транспонирования –
клавиши <Ctrl>+<1>.
A, B – квадратные матрицы, опре(AB)–1 = B–1A–1
делители которых не равны 0
A, B, C – прямоугольные матрицы
A + (B + C) = (A + B) + C =
согласованных размерностей
=A+B+C
--------«»-------A(B + C) = AB + AC
--------«»-------A(BC) = (AB) C = ABC
T
A A – симметричная матрица A – прямоугольная матрица произвольной размерности
aTb = bTa: скалярное произ- a, b – векторы одинаковой размерности.
ведение переместительно
6.7. Специальные приемы работы с матрицами
6.7.1. Собственные числа квадратной матрицы. Как известно,
собственные (иначе – характеристические) числа i, i = 1, … , n, квадратной nn матрицы A являются корнями уравнения det( A    E )  0 ,
где  – вектор собственных чисел с компонентами i, i = 1, … , n, E –
единичная nn матрица, det( ) – определитель.
В Mathcad имеется встроенная функция eigenvals( ), возвращающая
вектор собственных чисел. Испытайте эту функцию по рис. 2.28. Обратите внимание на небольшие неточности решения уравнения для собственных чисел. Конечно, они настолько малы, что не сказываются на качестве
расчетов.
46
 13

0
R  
 0.1
 3

1
200 1
19
1
0.3
0.9
9


Âåêòîð ñîáñòâåííûõ ÷èñåë
ìàòðèöû R:
7 


23 19 
  eigenvals ( R)
8
10.573




22.418

12.798i
Ñîáñòâåííûå ÷èñëà (äâà äåéñòâèòåëüíûõ 


è äâà êîìïëåêñíî ñîïðÿæåííûõ)
 22.418  12.798i 


17.637


Ïðîâåðêà íà ñîîòâåòñòâèå óðàâíåíèþ
äëÿ ñîáñòâåííûõ ÷èñåë:
i  0  rows ( R)  1
verify  R  i identity ( rows ( R) )
i
Óðàâíåíèå óäîâëåòâîðÿåò ñ î÷åíü ìàëîé ïîãðåøíîñòüþ (ïîðÿäêà 10
-11)
 12


8.356  10

 11
 11 
3.325  10
 2.981i  10


verify 

 11
 11 
 2.981i  10
 3.325  10

 12


1.448  10


Рис. 2.28. Собственные числа матрицы.
6.7.2. Характеристические векторы квадратной матрицы. Как
известно, квадратная nn матрица A имеет n характеристических векторов. Умножение матрицы на вектор приводит к получению нового вектора, направление которого в общем случае отличается от направления вектора-сомножителя. Характеристические векторы составляют исключение
из этого правила: умножение матрицы на них приводит к получению векторов, совпадающих с ними по направлению, т. е. характеристические
векторы удовлетворяют уравнению: A  vi  i  vi , i = 1, … , n, i – i-е
собственное число (см. п. 6.7.1). В Mathcad имеется встроенная функция
eigenvecs( ), возвращающая матрицу, каждый столбец которой является
характеристическим вектором матрицы, указанной в качестве аргумента
функции eigenvecs( ). Характеристические векторы выводятся нормированными, т. е. имеющими единичную длину (рис. 2.29).
47
 0 1 

 0.9 0.5 
H  
– квадратная матрица, характеристические
векторы которой нужно найти
  eigenvals ( H)
– собственные числа матрицы H
– матрица, столбцы которой –
z  eigenvecs ( H)
характеристические векторы
– значения элементов векторов
 0.807 0.63 
z

 0.59 0.776 
 0
v1  z
 1
v2  z
v1  1
v2  1
– каждому вектору можно присвоить отдельный идентификатор (вырезывание
столбца матрицы – клавишами <Ctrl>+<^>))
– характеристические векторы
нормированны: их длина равна 1 (для
определения длины нажмите клавишу < | > )
Äëÿ âûâîäà âåêòîðîâ íà ãðàôèê çàäàéòå
èíäåêñ ðàçìåðíîñòåé:
j  0  1
1.5
 0 v1 j
Ãðàôèê èëëþñòðèðóåò
ñîâïàäåíèå
õàðàêòåðèñòè÷åñêèõ
âåêòîðîâ ñ ðåçóëüòàòàìè
èõ ïîâîðîòà ìàòðèöåé H
0.75
( H  v1) j
 1 v2 j
( H  v2) j
1
0.25
0.5
1.25
0.75
1.5
j
Рис. 2.29. Характеристические векторы.
48
2
Научимся выводить векторы на график. Нужно выполнить следующие операции:
 Задать диапазон изменения индексов элементов вектора (в примере на рис. 2.29 вектора двумерны, соответственно индекс изменяется
от 0 до 1).
 Вывести шаблон графика (<Shift>+<2>) и на оси абсцисс указать
имя индекса (в примере j).
 Указать на оси ординат идентификатор элемента вектора с индексом таким, как на оси абсцисс (в примере j).
В результате выведется вектор.
Сделайте упражнение по рис. 2.29 и убедитесь, что действительно
поворот характеристического вектора матрицей приводит к получению
вектора, накладывающегося на сам характеристический вектор.
Изучение собственных чисел и характеристических векторов закончено.
6.7.3. Диагонализация квадратных матриц. Как известно, квадратную матрицу можно привести к диагональной форме, причем в диагонали располагаются собственные числа этой матрицы. Приведение к диагональной форме бывает полезным для того, чтобы упростить операции
умножения (Вы знаете, что умножение на диагональную матрицу не вызывает затруднений).
Рассмотрим пример. Пусть задана матрица R размерности 44 и
требуется возвести ее в 100-ю степень. Если мы будем использовать
длинную операцию умножения RR…R, используя правила умножения
матриц, то, скорее всего, в среде Mathcad никогда не досчитаем до результата. Однако Mathcad выводит результат почти мгновенно. Используется алгоритм, показанный на рис. 2.30. Выполните показанные там
вычисления.
49
 13 1 200 1 
0 19 1 7 
Пусть задана квадратная матрица:
R  
 0.1 0.3 0.9 8 
n
Требуется вычислить R , n = 100
 3 9 23 19 


АЛГОРИТМ:

10.573


1. Вычисляем вектор собственных чисел:
22.418

12.798i
 := eigenvals(R)


 22.418  12.798i 
2. Вычисляем матрицу


17.637


характеристических векторов:
T := eigenvecs(R)
3. Приводим матрицу R к диагональной форме (в диагонали получатся собственные числа):
0  0i
0  0i
0 
 10.573
 := T-1RT


0

0i
22.418

12.798i

0

0i
0 


(имеются небольшие
 0  0i
0i
22.418  12.798i
0 
вычислительные


0
0
17.637 
погрешности порядка 10-15)  0
4. Вводим степень, в которую нужно возвести матрицу R:
n := 100
5. Рассчитываем диагональную матрицу, в диагонали которой – степени собственных чисел:
n := diag( n )
6. Используем обратное преобразование из диагональной матрицы в Rn:
Rn := TnT-1
7. Выводим результат на экран:
Rn =
8. Для проверки вычисляем непосредственно: Rn =
Рис. 2.30. Диагонализация квадратных матриц.
Убедитесь, что матрицы R и Rn имеют одинаковый набор характеристических векторов при любом показателе степени n. Объясните, почему.
Изучение процесса диагонализации квадратных матриц закончено.
6.7.4. Свойства симметричных матриц. Симметричные матрицы,
т. е. такие, в которых совпадают элементы, симметрично расположенные
относительно главной диагонали, имеют много интересных свойств, часто используемых на практике. Выполните упражнение, показанное на
рис. 2.31, и постарайтесь запомнить свойства симметричных матриц.
50
 1
3
A  
4
7

Введем симметричную матрицу А:
ИЛЛЮСТРАЦИИ свойств
симметричных матриц:

3
4
7
11
2
5 
2 19 8 
5 8
9
 0 0 0
0 0 0
T
1. Матрица и транспонированная к ней равны:
AA 
0 0 0
 10.195   0 0 0
2. Собственные числа симметричной
16.732 
матрицы – ВЕЩЕСТВЕННЫ:

 2.378 
 := eigenvals(R)
 22.549 


3. Характеристические векторы
0.164
симметричной матрицы ВЕЩЕСТВЕННЫ:
 0.569
 0.687
T := eigenvecs(R)
0.624
T
 1.033  10 3 0.183

0.741
 0.452
0
0
0
0


4. Транспонированная матрица,
0
0
0
0
1 
составленная из характеристических
T
T T

векторов, равна обратной матрице
0 0 0 0
характеристических векторов:
0 0 0 0




0

0
0

0



0.333 0.925 

0.401 0.29 
0.768 0.245
0.372
0
5. Диагонализация симметричной матрицы
 10.195 0
проводится по формуле:
0
16.732
0
DiagA := TTAT
Diag_A  
 0
0
2.378
 0

0
0
0.01


0 

22.549 
0
0
Рис. 2.31. Свойства симметричных матриц.
Изучение свойств симметричных матриц закончено.
6.7.5. Квадратичные формы. Как известно, квадратичной формой
называется скаляр, структура
Симметричная
которого показана на рис. 2.32.
матрица
Транспонированный
Вектор
Если развернуть этот скаляр в
вектор-строка
виде сумм и произведений, то
T
мы увидим, что в формулу
x  Q x
войдут в качестве слагаемых
1n nn n1
квадраты каждого элемента
Размерность результата
вектора x и перекрестные про11 = скаляр
изведения одних элементов на
другие. Коэффициентами при
Рис. 2.32. Структура квадратичной формы.
51
этих слагаемых будут элементы симметричной матрицы, которая, как Вы
знаете, называется ядром квадратичной формы.
Проиллюстрируем графически свойства квадратичной формы (Вы
неоднократно встретите квадратичные формы в самых различных учебных дисциплинах).
Вначале научимся выполнять матричные преобразования в режиме
live symbolic (см. Часть 4). Символьные преобразования с матрицами
можно делать при не слишком высокой размерности (иначе формулы получались бы совершенно необозримыми). Для наших целей достаточно
размерности ядра квадратичной формы 22 (соответственно вектор x будет иметь 2 элемента). Набираем по рис. 2.33:
Набор <Ctrl>+<1>
(транспонирование)
T
 x1 
 x2 
 
 q11
 q21


q 12 
x
   1  
q 22   x2 
 
Вызов шаблонов матриц и
векторов <Ctrl>+<М>
x
Набор <Ctrl>+<Shift>+<точка>
(символический знак присваивания)
В результате получится:
T
 x1 
 x2 
 q11
 q21

q 12 
x
   1   x  q  x  q  x  x  q  x  q  x
 1 11 2 21 1  1 12 2 22 2
q 22   x2 
 
Скопируйте результат и упростите:
x 1q 11  x 2q 21x 1  x 1 qx 12  x 2 q 22x 2 simplify  x 12q 11  x 1x 2q 21  x 2x 1q 12  x 22
2
2
∙х2∙q
+ х2∙х1∙q
11x+2 х
q 122
x 12
x 1х22q∙q11
1 ∙q
21 +
22  x 1 x 2 q 21  x 2 x 1 q 12 
x 1q 11  x 2q 21x 1  x 1 qх12
2 simplify
Получим формулу квадратичной формы в скалярах:


2
2
f x 1 x 2 q 11 q 12 q 22  x 1  q 11  2 x 1 x 2 q 12  x 2  q 22
Рис. 2.33. Запись квадратичной формы в скалярах.
В зависимости от состава собственных чисел матрицы Q значение
функции
может оказаться таким, что:
 При любых значениях элементов вектора x значение функции положительно. Соответствующая квадратичная форма называется положительно определенной. Собственные числа ее ядра положительны (и,
конечно, действительны, т. к. Q – симметричная матрица).
52
 При любых значениях элементов вектора x значение функции отрицательно. Соответствующая квадратичная форма называется отрицательно определенной. Собственные числа ее ядра отрицательны (и, конечно, действительны).
 При некоторых значениях элементов вектора x значение функции
положительно, а при других – отрицательно.
Рассмотрим пример для всех трех случаев и проиллюстрируем его
графиками. Сделайте вычисления и построения, показанные на рис. 2.34.
Ââåäåì 3 ìàòðèöû:
Q1 
Çíà÷åíèÿ ýëåìåíòîâ:
5 3


3 9
Q2  Q1
Q3 
 2 3 


 3 1
q 11
5  q 12
3  q 22
q 11
5  q 12
3  q 22
q 11
2  q 12
3  q 22
9
9
1
Îïðåäåëèì ñîñòàâ ñîáñòâåííûõ ÷èñåë:
 3.394  - âñå ïîëîæèòåëüíû


 10.606 
 3.394  - âñå îòðèöàòåëüíû
eigenvals ( Q2)  

 10.606 
 3.854 
eigenvals ( Q3)  
 - îäíî îòðèöàòåëüíîå, äðóãîå ïîëîæèòåëüíîå
 2.854 
eigenvals ( Q1) 

Êâàäðàòè÷íàÿ ôîðìà â ñêàëÿðàõ:
2

2
f x1  x2  q 11  q 12  q 22  x1  q 11  2 x1 x2 q 12  x2  q 22
Ïîñòðîèì ãðàôèê ôóíêöèè f(...) íà èíòåðâàëå èçìåíåíèÿ x1 è x2 îò -0.15 äî +0.15
×èñëî òî÷åê íà êàæäîé îñè ãðàôèêà - ïî 20.
Èíäåêñû òî÷åê: i  0  20
j  0  20
Êîîðäèíàòû àðãóìåíòîâ ñîîòâåòñòâóþùèå èíäåêñàì:
x1  0.15  0.015 i
i
x2  0.15  0.015 j
j
Ìàññèâû äëÿ âûâîäà òðåõìåðíûõ ãðàôèêîâ:
- äëÿ ÿäðà êâàäðàòè÷íîé ôîðìû Q1
i j
 i j

F2  f  x1  x2  5  3  9  - äëÿ ÿäðà êâàäðàòè÷íîé ôîðìû Q2
i j
 i j

F3  f  x1  x2  2  3  1  - äëÿ ÿäðà êâàäðàòè÷íîé ôîðìû Q3
i j
 i j

F1
 f  x1  x2  5  3  9 
Рис. 2.34. Подготовка к выводу графических образов квадратичных форм.
Теперь вызовите шаблон трехмерного графика (<Ctrl>+<2>) и в появившийся слот впишите имя массива F1. Затем выведите такие же графики и для других массивов. Получится так, как на рис. 2.35.
53
Изучение квадратичных форм закончено.
F1
а) Положительно определенная квадратичная форма
– график «дном вниз»
F2
б) Отрицательно определенная квадратичная
форма – график «дном
вверх»
F3
в) Неопределенная квадратичная форма – график в форме
… (догадайтесь сами, как
называется фигура)
Рис. 2.35. Графические образы различных квадратичных форм.
6.8. Ранг матрицы
Как известно, рангом прямоугольной матрицы называется наибольший порядок неравного нулю определителя (из всех возможных вырезок
определителей из данной матрицы. Для вычисления ранга используется
функция rank (идентификатор_матрицы)
Рассмотрите пример вычисления ранга матриц:
0 4 0 1 0
R1   0 1 0 0 0 


 0 2 0 3 0 .
0 0 0 1 0
R  

 0 0 1 0 0 ,
§7. Некоторые применения матриц и векторов
7.1. Нахождение всех корней уравнения n-й степени
Согласно Основной теореме алгебры (Нильс Хенрик Абель) уравнение n-й степени имеет n корней. Среди них могут быть действительные и
комплексные. Каждый комплексный корень обязательно имеет свою пару – сопряженный корень, у которого такая же вещественная часть, а
мнимая имеет противоположный знак. Для нахождения всех корней используется встроенная Mathcad-функция polyroots( ) (переводится «много корней»). Научимся пользоваться этой очень полезной функцией.
ДАНО: уравнение n-й степени:
a 0  y n  a1  y n 1  a 2  y n  2  ...  a n 1  y  a n  0 ,
(n+1) его коэффициентов ai, i = 0, …, n–1 заданы.
ПОЛУЧИТЬ: все корни yi, i = 1, …, n, удовлетворяющие заданному
уравнению.
54
Способ решения: Сформируем (n+1)-мерный вектор, элементами
которого являются коэффициенты уравнения. Важное замечание: если в
уравнении отсутствуют некоторые промежуточные степени переменной,
в соответствующий слот вектора следует вставить 0. Порядок ввода коэффициентов – с «конца» уравнения к началу, так что нулевому элементу
вектора нужно присвоить значение an, а n-му – значение a0. Идентификатор этого вектора и будет аргументом функции polyroots( ).
Пример показан на рис. 2.36. Выполните его по шагам и обязательно сделайте проверку. Вы увидите небольшие вычислительные неточности (это и не удивительно: выразить
корни через коэффициенты уравнения можно точно только в том случае, когда его порядок
– не выше четвертого: этот результат получил юный гений Эварист Галуа в 21 год, за сутки
до дуэли, на которой он был убит).
Уравнение, корни которого нужно найти:
7
4
7 y  3 y  5y  17
Шаг 1. Формируем 8-ми
мерный вектор D
Элементы вектора, соответветствующие несуществующим в уравнении степеням переменной y, считаем
равными нулю
 17 
 5 
 
0 
0 
D   
3 
0 
0 
 
7 
Шаг 2. Используем функцию polyroots(…), которая
возвращает вектор корней
уравнения:
z := polyroots(D)
0
Жирный знак равенства
исключает вычисления
<Ctrl>+<=>
1.231





0.688

0.895i


 0.688  0.895i 
z   0.348  1.11i 


 0.348  1.11i 
 0.955  0.48i 
 0.955  0.48i 


1.2


 0.688 
Шаг 3. Выводим значения корней на экран:
 0.688 
 0.348 
z

Шаг 4. Делаем проверку. Для этого:

а) Вводим счетчик индексов корней j := 0 .. 6
 0.348 
 0.955 
б) Рассчитываем, чему равна левая часть
6

  0.955 
уравнения при подстановке каждого j-го
4.742  10


корня (должна быть равна правой части, т.е.
9
8 

нулю)
9.646  10  8.726i  10


7
4
verify  7 z  3 z  5 z  17
8
8 

j
j
j
j
1.899  10  2.191i  10


verify   1.736  10 8  5.121i  10 9 
в) Выводим на экран вектор значений левой


части уравнения, в которое подставлены
 6.856  10 6  1.1i  10 6 
найденные корни:

6
7 
4.549  10  1.159i  10


Имеют место незначительные
8
8 
вычислительные погрешности 
 4.996  10  6.16i  10 


Рис. 2.36. Использование функции polyroots(…) для нахождения корней уравнения.
55
7.2. Применение матриц и векторов для решения систем линейных уравнений
7.2.1. Теоретические сведения. Традиционно решение систем линейных уравнений рассматривается в терминах матричной алгебры.
Пусть задана система из n линейных уравнений. Коэффициенты этих
уравнений – не обязательно постоянные, они могут зависеть от какоголибо внешнего параметра (на практике чаще всего – от времени), но не
должны зависеть от искомых переменных (в этом случае уравнения были
бы нелинейными).
Система уравнений, записанная в обычной форме, имеет вид:
a11 (t ) x1  a12 (t ) x 2    a1n (t ) x n  b1 (t )
a 21 (t ) x1  a 22 (t ) x 2    a 2n (t ) x n  b2 (t )
             
a n1 (t ) x1  a n 2 (t ) x 2    a nn (t ) x n  bn (t )
Здесь t – некоторый параметр, от которого зависят коэффициенты
уравнения.
Сформируем квадратную nn матрицу из коэффициентов левой части и n-мерный вектор из значений bi(t), i = 1, … , n, входящих в правую
часть. Эти матрицы будут иметь вид:
a11 (t ) a12 (t )  a1n (t )
b1 (t )
a (t ) a 22 (t )  a 2n (t )
b (t )
A(t )  21
, B(t )  2





a n1 (t ) a n 2 (t )  a nn (t )
bn (t )
Согласно правилам матричной алгебры решение системы линейных
уравнений для случая, когда правая часть – не нулевой вектор, возможно
тогда и только тогда, когда определитель матрицы не равен 0 ни для одного значения параметра t из диапазона, на котором он задан. В этом
случае решение будет n-мерным вектором, зависящим от параметра t:
x(t )  [ A(t )] 1  B(t ). Как видим, для получения решения используются
следующие матричные операции:
 Обращение квадратной матрицы;
 Умножение матрицы на вектор;
 Диагностика отличия определителя матрицы от 0 (для установления существования решения).
7.2.2. Пример. Найдем значения двумерного вектора x(t) при изменении параметра t в диапазоне 0,…,5 с шагом 0.01. Пусть каждый элемент матрицы A(t) – экспонента с заданным показателем степени, а каж56
дый элемент вектора B(t) – синусоидальная функция. Решение показано
на рис. 2.37, 2.38. Воспроизведите его. Попутно Вы научитесь делать
массовые операции над всеми элементами матриц (рис. 2.37).
7.2.2.1. Векторизация. Термин «векторизация» означает применение
одной и той же функции тотально ко всем элементам матрицы. Этот прием
часто экономит время и при вводе, и при вычислениях за счет параллельных действий над всеми элементами матрицы сразу. Освоим технику векторизации на примере, показанном на рис. 2.37, 2.38 Для того чтобы над
всеми элементами матрицы выполнялась одна и та же операция, нужно:
1. Ввести матрицу с постоянными элементами, которые будут использоваться как коэффициенты в формулах для операций с матрицей;
2. Ввести идентификатор матрицы с указанием ее зависимости от
параметра (можно – тот же, что и для матрицы коэффициентов), присвоить ему значение функции, которую мы хотим применить ко всем элементам матрицы.
3. Результат охватить синим контуром и нажать клавиши
<Ctrl>+<(минус)>. Над функцией появится горизонтальная стрелка –
символ векторизации.
Изучение операции векторизации закончено.
 1 1.5 

2 4 
Øàã 1. Çàäàåì ìàòðèöó è âåêòîð êîýôôèöèåíòîâ.
A  
Øàã 2. Ïðîâîäèì âåêòîðèçàöèþ ìàòðèöû À. Êàæäûé
ýëåìåíò åå ïðåâðàòèòñÿ â ýêñïîíåíòó. Ïîêàçàòåëåì
áóäåò ñîîòâåòñòâóþùèé ýëåìåíò ìàòðèöû À
A ( t)  e


 A t 
Äëÿ îñóùåñòâëåíèÿ
âåêòîðèçàöèè íàæìèòå
<Ctrl>+<(ìèíóñ)>
 e1 t e1.5 t 

 2 t 4 t 
e
e

Øàã 3. Äëÿ êîíòðîëÿ ïðîâåäåì âû÷èñëåíèå ýêñïîíåíò
íåïîñðåäñòâåííî (äîëæåí áûòü ïîëó÷åí òîò æå
ðåçóëüòàò, ÷òî è ïðè âåêòîðèçàöèè):
A1( t)  
Øàã 4. Ïðîâîäèì âåêòîðèçàöèþ âåêòîðà Â. Êàæäûé
åãî ýëåìåíò äîëæåí ïðåâðàòèòüñÿ â ñèíóñ ñ
ñîìíîæèòåëåì-ýëåìåíòîì âåêòîðà Â:


B( t)  sin ( B t)
Øàã 5. Äëÿ êîíòðîëÿ ââîäèì ôóíêöèþ ñèíóñà
íåïîñðåäñòâåííî:
B1( t)  
Øàã 6. Ïðîâåðÿåì, äåéñòâèòåëüíî
A ( t) 
ëè âûïîëíèëàñü âåêòîðèçàöèÿ,
íàïðèìåð, ïðè t  0.5
5

7
B  
 sin ( 5 t) 

 sin ( 7 t) 
 1.649 2.117 
 1.649 2.117 

 A1( t)  

2.718
7.389


 2.718 7.389 
 0.598 

 0.351 
B( t)  
Рис. 2.37. Векторизация матриц и векторов.
57
 0.598 

 0.351 
B1( t )  
 ìàòðè÷íî-âåêòîðíûõ îáîçíà÷åíèÿõ (ñ ó÷åòîì MathCAD-íóìåðàöèè ýëåìåíòîâ
ìàòðèö ñ íóëÿ) ñèñòåìà óðàâíåíèé èìååò âèä:
A ( t)
0 0
 x( t)  A ( t)
0
0 1
 x( t)  A ( t)
A ( t)
 x( t)
 x( t)
1
B( t)
0
B( t)
1 0
0
1 1
1
1
Ââåäåì âåêòîð èñêîìûõ ïåðåìåííûõ (æèðíûé çíàê ðàâåíñòâà <Ctrl>+<=>
èñêëþ÷àåò âû÷èñëåíèÿ)
:
x( t)
 x( t) 0 


 x( t) 
 1
Ýëåìåíòû ìàòðèö A(t) è B(t) íàéäåíû ðàíåå â ïðîöåññå âåêòîðèçàöèè, ðèñ. 4.37
 A ( t) 0  0 A ( t) 0  1 


 A ( t) 1  0 A ( t) 1  1 


A ( t)
B( t )
 B( t) 0 


 B( t) 1 


Ðåøåíèå ñèñòåìû óðàâíåíèé â ìàòðèöàõ:
1
x( t)  A ( t )
 B( t )
Èññëåäîâàíèå ðåøåíèÿ ïî ãðàôèêó. Çàäàåì äèàïàçîí èçìåíåíèÿ ïàðàìåòðà t:
t  0  0.001  5
Âûâîäèì ãðàôèêè ýëåìåíòîâ âåêòîðà x(t) (äëÿ ïîëó÷åíèÿ øàáëîíà ãðàôèêà
íàæìèòå <Shift>+<2>)
2
2
1.25
1
x( t ) 0
0
1.5
3
4.5
6
x( t ) 1
0.5
1
0.25 0
2
1
t
1.5
3
4.5
6
t
Рис. 2.38. Решение системы линейных уравнений с помощью матриц.
7.3. Применение матриц и векторов в задаче интерполяции
7.3.1. Необходимые теоретические сведения. Интерполяцией
называется группа методов восстановления значений функции в промежутках между точками, заданными своими координатами.
Реализуем с помощью матрично-векторных операций один из
наиболее применяемых методов интерполяции – интерполяция с помощью так называемых кубических сплайнов. Сплайны широко используются в компьютерной технике (компьютерной графике, компьютерном
черчении, компьютерной фотографии).
58
ДАНО: координаты точек (рис. 2.39).
ПОЛУЧИТЬ: уравнение гладкой кривой, которая проходит через все
заданные точки. Такая кривая позволяет вычислить значение функции
между заданными точками – т. е. решить задачу интерполяции.
Рис. 2.39. Точки, через которые должна пройти интерполяционная кривая.
Если просто соединить точки участками прямых линий, то получится ломаная линия – так называемая кусочно-линейная интерполяция
(иначе – сплайн первого порядка). Она непрерывна, но ее производные
(начиная с первой) разрывны, поэтому ломаная линия не кажется нам
гладкой (рис. 2.40).
Рис. 2.40. Интерполяция сплайном первого порядка.
59
В результате многолетних исследований особенностей восприятия
зрительных образов человеком было установлено, что кривая воспринимается как вполне гладкая, если она сама и две первые ее производные непрерывны. Так пришли к идее кубических сплайнов – когда точки соединяются участками кубических парабол.
Примечание: слово «сплайн» в переводе с английского языка означает гибкую металлическую линейку, которую чертежники 19-го века изгибали для плавного соединения точек. Термин «кубический» ассоциируется с кубической зависимостью. Другое название кубического сплайна – сплайн третьего порядка (если для интерполяции использовать
обычные параболы, получится сплайн второго порядка, а если прямые, как на рис. 2.40 –
сплайн первого порядка).
Основная идея интерполяции кубическими сплайнами:
Кубическая парабола y ( x)  a 0  x 3  a1  x 2  a 2  x  a3 содержит 4
коэффициента ai, i = 0, … , 3, поэтому если взять 4 значения аргумента xi
подряд, i = 1, 2, 3, 4 и соответствующие им значения функции y(xi), то
по этим данным можно рассчитать все ai, i = 0, … , 3. Тогда, если построить график функции y(x), то он пройдет точно через эти точки. В промежутках между точками можно будет рассчитать значение функции для
любого аргумента, используя формулу кубической параболы.
Обычно точек гораздо больше, чем 4. Тогда поступим так: будем
строить для каждых 4-х точек свою кубическую параболу – аналогично
тому, как мы строили свою прямую линию для каждых двух точек при
аппроксимации первого порядка, см. рис. 2.40. В узлах сопряжения двух
соседних кубических парабол значения функции и первых двух производных окажутся равными, в результате чего кривая, составленная из
участков кубических парабол с разными коэффициентами, будет восприниматься глазом как гладкая.
Опишем последовательность шагов для получения интерполяционной кривой, построенной на кубических сплайнах.
Шаг 1. Берем координаты первых четырех точек, охватываем их окном (рис. 2.41). Составляем систему уравнений для определения коэффициентов ai, i = 0, … , 3, решаем ее и получаем уравнение кубической
параболы. Система уравнений имеет вид, показанный на рис. 2.41.
Шаг 2. Используя найденные на шаге 1 значения коэффициентов ai,
i = 0, … , 3, можно построить график функции y(x) = a0x3 + a1x2 + a2x + a3
на интервале изменения аргумента x1  x  x4 (рис. 2.42).
Шаг 3. Но для интерполяции функции используем не весь график
для интервала x1 x  x4, а лишь его фрагмент между точками x2 и x3,
т. е. прорисовываем кубическую параболу y(x) = a0x3 + a1x2 + a2x + a3
только на интервале изменения аргумента x2  x  x3 (см. рис. 2.42).
60
Окно захвата точек для сплайна
Система уравнений для определения коэффициентов
кубической параболы:
 x13  a0  x12  a1  x11  a2  x10  a3  y ( x1 )
 3
2
1
0
 x2  a0  x2  a1  x2  a2  x2  a3  y ( x2 )
 3
2
1
0
 x3  a0  x3  a1  x3  a2  x3  a3  y ( x3 )
3
2
1
0

 x4  a0  x4  a1  x4  a2  x4  a3  y ( x4 )
В этой системе уравнений неизвестные: a0, a1, a2, a3
Известные:
xi, y(xi), i = 1, 2, 3, 4
Рис. 2.41. Иллюстрация к построению сплайна.
Шаг 4. Далее сдвигаем окно, в которое попадают точки интерполируемой кривой, на одну точку (рис. 2.43). Мы видим, что точка с абсциссой x1 в «новое» окно не попала; точки x2, x3 и x4 из «старого» окна перекочевали в новое, а точка с абсциссой x5, появившаяся в «новом» окне,
«старым» окном не охватывалась. Теперь, если мы рассчитаем значения
коэффициентов ai, i = 0, … , 3 по координатам точек «нового» окна (x2,
x3, x4 и x5), то получим другую кубическую параболу (но отличающуюся
от первой не слишком сильно, т.к. обе они должны пройти через общие
для обоих окон точки x2, x3 и x4), рис. 2.44.
Шаг 5. Теперь прорисуем второй участок интерполирующей кривой
по уравнению второй параболы, коэффициенты которой рассчитаны для
аргументов «нового» окна x2, x3, x4 и x5. Мы видим (рис. 2.45), что участки
примыкают друг к другу гладко, без разрывов. Можно показать, что в точке сопряжения участков (ее абсцисса равна x3) у обеих парабол одинаковы
значения самих функций и их производных первого и второго порядков.
61
Рис. 2.42. Иллюстрация к шагу 3: прорисовка первого фрагмента интерполирующей
функции.
Рис. 2.43. Иллюстрация к шагу 4: точки для построения второй кубической параболы.
Последующие шаги выполняются в цикле, начиная с шага 4: последовательно сдвигаем окно, в которое попадают очередные 4 точки; по их
координатам вычисляем коэффициенты соответствующей кубической
параболы; прорисовываем эту параболу между второй и третьей точкой
окна. Так получим кривую, плавно соединяющую точки, начиная со второй и заканчивая предпоследней.
62
Точки, по которым вычислены коэффициенты для первой кубической параболы
Область аргументов для
вычисления интерполирующей функции: по
уравнению первой параболы
Область аргументов для
вычисления интерполирующей функции: по уравнению второй параболы
Точки, по которым вычислены коэффициенты для второй
кубической параболы
Рис. 2.44. Иллюстрация к шагам 4 и 5: построены две кубические параболы.
Первая – по точкам 1,2,3,4. Вторая – по точкам 2,3,4,5.
Показаны области определения аргументов для построения интерполирующей кривой.
Рис. 2.45. Иллюстрация к шагу 5: два фрагмента интерполирующей функции.
Первый – участок кубической параболы, коэффициенты которой рассчитаны
по точкам 1,2,3,4. Второй – участок кубической параболы, коэффициенты которой
рассчитаны по точкам 2,3,4,5.
Первый и последний участки (от первой до второй точки и от
предпоследней, N–1-й, до последней, N-й точки) оказываются не охваченными интерполяционной функцией. Имеются разные варианты обхода этого недостатка. Первый – просто отбросить первую и последнюю
63
точки. Область интерполяции будет уже области, занятой точками, но если точек много, то это может оказаться несущественным. Второй – дополнить первый и последний участок либо прямыми линиями, либо параболами. Можно также продлить участки прорисовки первой и последней
кубических парабол (первую использовать для интерполяции не только
между точками 2 и 3, но также и между точками 1 и 2; последнюю – для
интерполяции между точками N-2 и N-1, но и между точками N-1, N).
7.3.2. Решение задачи интерполяции функции в среде Mathcad с
использованием матриц и векторов.
ДАНО: координаты точек в форме файла Data.txt. Файл нужно скопировать в текущий каталог студента, чтобы для чтения файла не нужно
было указывать путь к нему. Структура файла (просмотрите ее средствами оболочки операционной системы): первый столбец – значения абсцисс
точек, второй – значения ординат точек.
ПОЛУЧИТЬ: гладкую кривую, соединяющую точки.
Решение проводится поэтапно.
Этап 1. Чтение файла с диска, определение числа точек, вывод точек
на график.
Этап 2. Расчет параметров кубических парабол для интерполирующей функции.
Этап 3. Указание интервалов изменения абсциссы для каждой кубической параболы.
Этап 4. Построение интерполирующей кривой.
7.3.2.1. Выполнение этапа 1: «Чтение файла с диска, определение
числа точек, вывод точек на график».
а) Выбираем идентификатор массива (например, Points) и считываем
файл с координатами точек в этот массив:
Points := READPRN(“Data.txt”).
б) Определяем число точек (m) в массиве (по числу строк) с использованием функции rows( ):
m := rows(Points)
Выводим значение m:
m=6
в) Учитывая нумерацию элементов массива в Mathcad с нуля, вводим
индексы точек:
k := 0 .. m-1
г) Для того чтобы избежать громоздких обозначений, вводим раздельные идентификаторы для абсцисс (xk) и ординат (yk) точек:
 0
 1
x  Points
y  Points
.
64
Для слота номера столбца используйте клавиши <Ctrl>+<6>.
д) Выводим точки на график, чтобы наглядно представить себе их расположение. Используем шаблон графика (<Shift>+<2>) и указываем абсциссы и ординаты точек. Должно получиться так, как показано на рис. 2.46.
Для того чтобы показать точки, щелкните левой кнопкой мыши по области графика,
выберите вкладку Trace (линии) и укажите тип (Type) Points (точки). Укажите для них
толщину (Weight) 3 и одинаковый цвет (Color). Затем выберите вкладку XY-axes (оси),
включите линии сетки (Grid lines), отключите автоматическое определение числа точек
(AutoGrid) и введите по 5 линий сетки на осях X и Y. Затем введите русский стиль осей
(Axes Style) – пересечение (Crossed).
хк
Рис. 2.46. Исходные данные для построения интерполяционной функции.
Этап 1 завершен.
7.3.2.2. Выполнение этапа 2: «Расчет параметров кубических парабол для интерполирующей функции». Пусть в окно, охватывающее
очередные 4 точки для построения фрагмента интерполирующей функции, попали точки yk, yk+1, yk+2, yk+3 с абсциссами xk, xk+1, xk+2, xk+3, k = 0,
1, … , N–3, N – индекс последней точки,
N := m-1,
N = 5.
По координатам этих точек нужно найти параметры k-й кубической параболы, проходящей через них. Уравнение параболы на участке xk  x  xk+3
имеет вид:
y  ak ,0  ak ,1  x  ak , 2  x 2  ak ,3  x 3 .
Исходя из того, что этому уравнению должны удовлетворять все точки
yk, yk+1, yk+2, yk+3 , получим систему уравнений для определения парамет65
ров параболы:
 a k , 0  a k ,1  x k  a k , 2  x k 2

2
 a k , 0  a k ,1  x k 1  a k , 2  x k 1

2
a k , 0  a k ,1  x k  2  a k , 2  x k  2
 a k , 0  a k ,1  x k 3  a k , 2  x k 3 2

 a k ,3  x k  y k
3
 a k ,3  x k 1  y k 1
3
 a k ,3  x k  2  y k  2
3
 a k ,3  x k 3  y k 3
3
Введем матричные обозначения для этой системы уравнений:
1 xk

1 xk 1
Ak  
1 x
k 2

1 xk 3
xk
2
xk 1
2
xk  2
2
x k 3
2
3
xk 
3
xk 1 
3
xk  2 
3
xk 3 
 yk 
y 
Bk   k 1 
 yk 2 


 y k 3 
Тогда коэффициенты параболы найдутся так:
ak  ( Ak ) 1  Bk ,
где ak – вектор коэффициентов параболы:
ak ,0 
a 
k ,1
ak    .
ak , 2 
 
 ak ,3 
Формула для интерполяции значений функции на интервале xk  x  xk+3
имеет вид:
k 
f a x
a
T
x
k ,
где
1
x
x   2.
x 
 3
x 
Оформим эти вычисления в Mathcad (рис. 2.47).
66
Èíäåêñû ýëåìåíòîâ ìàòðèö À è Â:
i  0  3
j  0  3
k  0  N  3
Ìàòðèöû, â êîòîðûå âõîäÿò âñå ìàòðèöû êîýôôèöèåíòîâ äëÿ
âñåõ êóáè÷åñêèõ ïàðàáîë:
j
A
 x
B  y
i k  j
i k
i k
i k
 
×èñëîâûå çíà÷åíèÿ, êîòîðûå äîëæíû ïîëó÷èòüñÿ:
 1 1.25 1.563 1.953 
1 2

4
8


1
3.333
11.109
37.026

A
1 4
16
64 
1 5

25
125


 1 6.5 42.25 274.625 
 0.707 
 0.951 


0.866

B
 0.588 
 0 


 0.809 
Âûðåçêè ìàòðèö äëÿ êàæäîé êóáè÷åñêîé ïàðàáîëû:
A
k 0
 submatrix( A  k  k  3  0  3)
B  submatrix( B k  k  3  0  0)
k
Ôîðìóëà äëÿ ðàñ÷åòà
ïàðàìåòðîâ ïàðàáîëû:

a  A
k
 1Bk
k 0
Ôîðìóëà äëÿ èíòåðïîëÿöèè
çíà÷åíèé ôóíêöèè:
1
 
z
T
f ( a  z)  a   2 
z 
 z3 
 
Рис. 2.47. Формулы для расчета параметров кубической параболы.
Выполнение этапа 2 завершено.
7.3.2.3. Выполнение этапа 3: «Указание интервалов изменения абсциссы для каждой кубической параболы». Удобно указать вектор, элементами которого будут области определения абсцисс для каждой кубиче67
ской параболы. Это не совсем обычный вектор: значения его элементов –
не числа, а числовые последовательности. Если попытаться его ввести как
обычно (XXk := ), то Mathcad расшифрует это как команду вывода значений. Для того чтобы «обмануть» Mathcad, делайте так: сначала наберите
XX  x  x
 0.01 x
k 1 k 1
k 2
(не обращайте внимание на «красный» сигнал об ошибке), а затем подставьте индекс под идентификатором XX скобкой < [ > ). Должно получиться так:
XX  x
k
x
k 1 k 1
 0.01  x
k 2
 2  2.01 3.333 
XX   3.333  3.343  4 


 4 4.01 5 
Мы видим, что каждый элемент вектора XX показывает, на каком
интервале должны рассчитываться значения по соответствующей кубической параболе.
Как указывалось выше, для первого и последнего интервала нужно
использовать дополнительные участки первой и последней кубической
параболы. Соответствующие интервалы изменения аргументов:
Xstart  x  x  0.01 x
0 0
1
Xfinish  x
x
N 1 N 1
 0.01 x
N.
Этап 3 завершен.
7.3.2.4. Выполнение этапа 4: «Построение интерполирующей
кривой». Должно получиться так, как показано на рис. 2.48. Вы увидите
гладкую кривую, соединяющую точки графика.
Выполнение этапа 4 завершено.
Решение задачи интерполирования значений функции закончено.
Нужно обратить внимание, что после соответствующей тренировки
матрицы позволяют находить решение почти сразу: весь текст примера
содержал только пояснения, а нужные расчеты «уложились» в показанные на рис. 2.47.
68
x0  XX
0
x1  XX
1
x2  XX
2
k  0  N
Начальный участок (рассчитан по параметрам первой кубической параболы)
k  0 рассчитанный
N
Участок,
по параметрам
первой кубической параболы
1.5
yk
f  a0  x0 0
f  a1  x1 0
Участок, рассчитанный по параметрам
второй кубической параболы
1
0.5
f  a2  x2 0
f  a0  Xstart  0
1
2.2
3.4
Участок, рассчитанный по параметрам третьей кубической
параболы
Концевой участок (рассчитан по параметрам
последней кубической
4.6
5.8
параболы)7
f  a2  Xfinish 0 0.5
1
xk  x0интерполирующей
 x1  x2  Xstart  Xfinish
Рис. 2.48. График
функции.
Замечание: В одной из монографий по теории матриц в качестве эпиграфа было записано: «Матрицы экономят бумагу, но расходуют мозги». Монография устарела: после появления Mathcad матрицы экономят не только бумагу, но и мозги.
§8. Учебная задача
8.1. Постановка задачи
ДАНО: координаты вершин A, B, C, D параллелограмма (табл. 2).
Ребра AB, AC, AD – смежные (т. е. выходят из одной вершины A).
Таблица 2
Таблица координат вершин:
Вершина A:
Вершина B:
Вершина C:
Вершина D:
xA :=1
xB :=2
xC :=3
xD :=3
yA :=2
yB :=1
yC :=3
yD :=3
zA :=3
zB :=2
zC :=1
zD :=8
ПОЛУЧИТЬ:
1. Координаты остальных вершин параллелограмма;
2. Построить чертеж параллелограмма.
3. Найти длину ребер AB, GH.
4. Найти угол между ребрами AB и AC, сделать проверку.
69
5.
6.
Найти площадь грани, содержащей вершины A, B, C.
Найти объем параллелепипеда.
8.2. Решение
8.2.1. Пояснения к заданиям 1 и 2. Задания 1 и 2 выполняем параллельно, т. к. построение целесообразно делать по ходу нахождения координат вершин (иначе неизбежно запутаемся).
Этапы решения:
Этап 1. Строим плоскость PABC, проходящую через 3 вершины (A, B, C)
параллелограмма. На этой плоскости
разместится одна из граней параллелограмма. Способ построения плоскости по
координатам 3-х точек подробно описан
в учебной задаче к части 1 (§3).
Показываем на этой плоскости точки (вершины) (A, B, C) параллелограмма.
Получится так, как показано на рис.
2.49.
Рис. 2.49.
Рис. 2.50.
Этап 2. Строим плоскость PD, параллельную построенной на этапе 1 и
проходящую через вершину D. На ней
разместится грань параллелограмма, противоположная к находящейся на плоскости этапа 1.
Показываем на плоскости точку D.
Получится так, как показано на рис.
2.50.
Этап 3. На плоскости PABC с вершинами A, B, C (этап 1) проводим отрезки прямых (ребра параллелограмма)
AB, AC. Проводим отрезок прямой от
точки A к точке D (ребро параллелограмма).
Получится так, как показано на рис.
2.51.
Рис. 2.51.
70
Этап 4. На плоскости PABC из вершины C строим отрезок, параллельный грани AB и равный ему по
величине. Получаем координаты
вершины E и грань СE.
Затем проводим отрезок, соединяющий вершины B и E тем же
способом, что при выполнении этапа 3. Получаем грань BE. Этим завершается построение основания
параллелепипеда.
Получится так, как показано на
рис. 2.52.
Рис. 2.52.
Этап 5. Переходим к нахождению координат вершин на противоположной грани, располагаемой на плоскости PD. Одна из вершин задана (точка D в исходных
данных). Используем ее для того
чтобы аналогично этапу 3 провести
отрезок, соединяющий заданные
вершины A и D. Получаем ребро
AD. Затем из точек B, C, E проводим отрезки такой же длины с таким же углом наклона, что и ребро
AD. Получаем точки F, G, H и ребра BF, CG, EH. Получится так, как
показано на рис. 2.53.
Рис. 2.53.
D
G
F
H
A
C
B
E
Этап 6. Соединяем отрезками
прямых линий точки на плоскости
PD, получаем ребра DG, GH, FH,
DF. Построение параллелограмма
завершено.
Получится так, как показано на
рис. 2.54.
Рис. 2.54.
71
Этап 7. Расчет масштабов для
плоскостей PABC и PD, соответствующих координатам вершин
параллелограмма (этап выполняется для того чтобы чертеж выглядел
профессионально). Невидимые ребра нужно показать пунктиром.
Получится так, как показано
на рис. 2.55.
Рис. 2.55.
Указания к выполнению этапа 1 «Построение плоскости PABC,
проходящей через 3 вершины (A, B, C) параллелограмма, показ вершин A,
B, C». Подробное описание см. в Учебной задаче к части 1 (§3). Кратко:
1. Формируем определитель (сначала формируется матрица 3×3,
<Ctrl>+<M>, затем в ее слоты вписываются нужные данные, затем матрицу нужно охватить синим контуром и набрать знак определителя | ) на
основе координат вершин A, B, C. Приравниваем определитель нулю и решаем полученное уравнение относительно координаты z. Для вычисления
используем символьные преобразования (<Ctrl>+<Shift>+<точка>, в слот
вставляем команду solve (реши) и через запятую имя переменной, относительно которой ищется решение, т. е. z). НЕ ЗАБУДЬТЕ! Знак равенства ЖИРНЫЙ (<Ctrl>+<=>). Получится так:
 x  xA y  y A z  z A 


 xB  xA y B  y A z B  z A 
x  x y  y z  z 
A C
A
 C A C
0 solve  z  x  4
(т. е. уравнение плоскости PABC имеет вид z = – x + 4).
2. Формируем вектор 3×1 для координат плоскости, подлежащих
выводу на график. Затем, используя функцию CreateMesh( ), вводим
диапазоны аргументов x и y и частоту сеток. Поскольку до окончания
расчета координат вершин параллелограмма нужный диапазон точно не
известен, принимаем его на основании исходных данных «с запасом».
Получится так:
72
 x
PlaneABC( x y )   y

 x 



4
Минимальное и максимальное
значение аргумента y


PABC  CreateMesh PlaneABC 0  6  0  6  4  4
Минимальное и максимальное
значение аргумента x
Число линий сетки
по аргументам х и y
3. Формируем векторы из координат вершин A,B,C, D (это нужно
для того, чтобы их легко было вывести на чертеж). В обозначениях PointA, PointB, PointC, PointD использована «косметическая» (т. е. не индекс,
а просто украшение текста, чтобы не писать PointA) точка (набирается,
например, так: Point <точка> A).
 xA 
 xB 
 xC 
 xD 
 
 
 
 
Point A ( x y )   y A  Point B( x y )   y B  Point C( x y )   y C  Point D( x y )   y D 
z 
z 
z 
z 
 A
 B
 C
 D
4. Подготавливаем данные для вывода точек на чертеж (число линий
сетки можно не указывать, т. к. точка – не объемная фигура. Это проявляется в том, что начальные и конечные значения аргументов записываются одинаковыми). В обозначениях использована «косметическая» точка:


TB  CreateMesh  PointB xB xB y B y B
TC  CreateMesh  PointC xC xC y C y C
TD  CreateMesh  Point D  xD  xD  y D  y D
TA  CreateMesh Point A  xA  xA  y A  y A
5. Выводим шаблон пространственного графика (<Ctrl>+<2>), в слотах через запятые указываем идентификаторы плоскости и точек. Без
настройки опций чертежа точки не будут видны. Для того чтобы показать их, щелкните дважды левой кнопкой мыши по графику, в появившемся окне выберите для графиков (Plot) показа точек (Plot 2, Plot 3, Plot
4) вкладку Appearance (внешний вид). Включите кнопку Draw Points
(рисовать точки), укажите ее форму (Symbol) в виде точки (dots), размер
(Size) не менее 2 (иначе точка будет незаметна на чертеже) и цвет (Solid
Color). Цвета для точек выберите разными, чтобы можно было легко разобрать, к какой из них (A, B или C) относится изображенная точка. Для красоты чертеж плоскости также сделайте цветным: вкладка Plot 1, кнопка
73
Color Map (Цветовая гамма), заполнение (Fill Options) – кнопка No Fill
(не заполнять, т. е. сделать чертеж плоскости прозрачным). Получим рис.
2.56:
Рис. 2.56.
Этап 1 завершен.
Указания к выполнению этапа 2 «Построение плоскости PD, параллельной плоскости PABC, построенной на этапе 1; показ вершины D».
Формулы, позволяющие определить уравнение для плоскости, параллельной заданной и проходящей через заданную точку, приведены в Приложении 3. Последовательность действий:
74
1. Используем уравнение плоскости PABC, выведенное при выполнении этапа 1: z = – x + 4, см. п. 1 этапа 1. Сравниваем это уравнение со
стандартным уравнением плоскости и определяем параметры стандартного уравнения:
Стандартное уравнение: P1∙x + P2∙y + P3∙z + P4 = 0
«Наше» уравнение:
–1∙x + 0∙y –1∙z + 4 = 0
Находим: P1 = – 1; P2 = 0; P3 = – 1.
2. Решаем уравнение для плоскости PD, параллельной плоскости
PABC и проходящей через точку D. В общем виде такое уравнение имеет
вид: P1∙(x – xD) + P2∙(y – yD) + P3∙(z – zD) = 0. Используя параметры п.1,
решаем (символьными вычислениями, жирный знак равенства <Ctrl>+<=>,
символьный знак равенства «стрелка» <Ctrl>+<Shift>+<точка>, в слот
solve, z). Получится так:
1 x  x D  0 y  y D  1 z  z D 0 solve  z  x  11






(т. е. уравнение плоскости PD имеет вид z = – x + 11).
3. Для вывода чертежа плоскости и точки D на ней используем те же
действия, что описаны в п. 2, 4, 5 этапа 1. Цвет точки D желательно выбрать тем же, что и для точки A (чтобы помнить, что в параллелограмме
точки A и D соединяются ребром). Получим рис.2.57:
 x 

PlaneD( x y )   y


 x  11 


PD  CreateMesh PlaneD  0  8  0  8  5  5
Обозначения точек внесены в среде
MSPaint (в Mathcad внесение обозначений не предусмотрено). Эти обозначения
нужны для пояснения этапов решения.
Вы тоже можете их вставить. Для этого
нужно выделить чертеж синим контуром, скопировать его в буфер
(<Ctrl>+<C> или иконка копирования),
вызвать MSPaint, извлечь в него рисунок
из буфера (<Ctrl>+<V> или иконка
вставки) и «подрисовать» обозначения.
Затем выделить нужную часть рисунка,
скопировать в буфер, возвратиться в
Mathcad, извлечь из буфера на поле второй страницы справа от «живого» чертежа. Вам легче будет следить за построениями.
PABC TA Рис.
TB2.57.
TC PD  TD
Этап 2 завершен.
75
Указания к выполнению этапа 3 «Построение ребер параллелограмма AB, AC на плоскости PABC и ребра AD между плоскостями PABC
и PD». Для этой цели нужно использовать уравнение отрезка, соединяющего точки с заданными координатами. Имеется известное соотношение,
связывающее текущие координаты (x, y, z) прямой с координатами (x0,
y0, z0) и (x1, y1, z1) концов отрезка:
x  x0
y  y0
z  z0
. Но для


x1  x0 y1  y0 z1  z 0
построения ребер это уравнение использовать нецелесообразно по следующим причинам:
Во-первых, может оказаться, что у отрезка одна из координат одинакова, тогда знаменатель обратится в нуль, возникнет останов алгоритма
из-за попытки деления на нуль. Придется вводить в общие формулы поправки (заменить формулу вводом одинаковой координаты), и формулы
потеряют универсальность.
Во-вторых, возникнут трудности масштабирования, оно тоже окажется не универсальным.
Поэтому ниже использовано другое представление прямой – в параметрической форме: Прямая линия – одномерная, поэтому параметр u –
единственный. Каждая из координат прямой линии рассчитывается так:
 x 0  x 1  x 0 u 


Line( u )  y 0   y 1  y 0  u 
 z  z  z u 
 0  1 0 
Формула не содержит делений, поэтому более универсальна, чем
приведенная выше. Если нужно показать только отрезок между x0 и x1, то
параметр u изменяется в универсальном диапазоне, от 0 до 1, и это снимает трудности масштабирования. При u = 0 получаем точку (x0, y0, z0),
при u = 1 получаем точку (x1, y1, z1), при изменении параметра u в пределах 0 < u < 1 получаем все промежуточные точки отрезка. Параметрическая форма идеально отвечает задаче построения ребер параллелограмма (т.е. отрезков прямых между вершинами).
Замечание: поскольку строится трехмерное изображение отрезков,
нужно записывать в формулах не один, а два параметра (иначе Mathcad
«не поймет», что требуется трехмерный график). Второй параметр задается произвольно и в расчетах не участвует.
76
Используем параметрические уравнения прямых для построения ребер:
 xA  xB  xA  u 

 Ðåáðî ÀÂ
LineAB( u  v )   y A  y B  y A  u 
LAB  CreateMesh LineAB 0  1  0  0
 z  z  z u 
Обратите внимание: масштаб
B A
 A









для CreateMesh получился
универсальным: от 0 до 1 для
всех отрезков одинаково.
 xA  xC  xA  u 


LineAC( u  v )   y A   y C  y A   u 
 z  z  z u 
 A  C A 
Ðåáðî ÀÑ


LAC  CreateMesh LineAC 0  1  0  0
 xA  xD  xA   u 

 Ðåáðî ÀD
LineAD( u  v )   y A   y D  y A   u 
L
 CreateMesh  LineAD  0  1  0  0
 z  z  z  u  AD


D
A
 A

u  0  1
v  0  1
(диапазон изменения параметров; диапазон для v
задается любым, v в вычисления не входит)
Обратите внимание: не нужно (но, конечно, можно) задавать шаг
изменения параметра, достаточно указать 0 и 1 (отрезки прямой Mathcad
построит самостоятельно).
Получим чертеж (рис. 2.58):
Рис. 2.58
Этап 3 завершен.
77
Указания к выполнению этапа 4 «Определение координаты четвертой вершины параллелограмма (вершины E) на плоскости PABC. Построение граней CE, BE на этой плоскости». Нужно из точки B провести отрезок, параллельный отрезку AC и равный ему по длине. Используем коэффициент при параметре u такой же, как у ребра AC, но отсчет
отрезка начинаем с координат точки B. Получим:
 xC  xA  u  Óðàâíåíèå ðåáðà, ïàðàëëåëüíîãî ðåáðó ÀÑ


è ïðîõîäÿùåãî ÷åðåç òî÷êó Â:
LineBE( u  v )  Point B( u  v )    y C  y A   u 
 z  z u 
LBE  CreateMesh  LineBE 0  1  0  0
  C A 
Координаты точки E найдем, присваивая параметру u значение 1:
PointE( u  v)  LineBE( 1 0)


TE  CreateMesh PointE 1 1 0 0
После нахождения вершины E определяем уравнение ребра CE, используя формулы, описанные в Указаниях к этапу 3:
 PointE( u  v) 0  xC  PointE( u  v) 0 u 


LineCE( u  v )   Point E( u  v ) 1   y C  Point E( u  v ) 1  u 
 Point ( u  v)  z  Point ( u  v)  u  L  CreateMesh Line  0 1 0 0
2  C
2  CE
CE
E
E

Получится так (рис. 2.59):
Рис. 2.59
Этап 4 завершен.
78
Указания к выполнению этапа 5 «Нахождение координат вершин
F, G, H на плоскости PD, построение ребер BF, CG, EH между плоскостями PABC и PD». Техника расчета – та же, что использована в пояснениях к этапу 4 для построения ребра BE. Все ребра BF, CG, EH параллельны друг другу и параллельны уже построенному ребру AD. Поэтому используем тот же коэффициент при параметре u, что и для ребра AD, а отсчет отрезков (ребер) начинаем с точек B, C, E соответственно. Получим
уравнения ребер и координаты вершин на плоскости PD (для этого в
уравнениях ребер параметр u принимаем равным 1):
Получится так (рис.2.60):
79
Рис. 2.60
Этап 5 завершен.
Указания к выполнению этапа 6 «Построение ребер FD, FH, HG,
DG на плоскости PD». Уравнения для ребер получаются как уравнения
отрезков между заданными точками (см. Указания к выполнению этапа 3).
Координаты вершин определены на этапе 5. Получим:
 PointF( u  v ) 0  xD  PointF( u  v) 0  u 


LineFD( u  v )   Point F( u  v ) 1   y D  Point F( u  v ) 1  u 
 Point ( u  v )  z  Point ( u  v)  u 
2  D
2 
F
F

Ðåáðî FD
 PointD( u  v ) 0  PointG( u  v ) 0  xD u 


LineDG( u  v )   Point D( u  v ) 1   Point G( u  v ) 1  y D  u 
 Point ( u  v )  Point ( u  v )  z  u 
2 
2
D
G
D 

Ðåáðî DG




LFD  CreateMesh LineFD  0  1  0  0
LDG  CreateMesh LineDG 0  1  0  0
 PointF( u  v) 0  PointH( u  v) 0  PointF( u  v) 0 u 


LineHF( u  v )   Point F( u  v ) 1   Point H( u  v ) 1  Point F( u  v ) 1  u  Ðåáðî HF
 Point ( u  v)  Point ( u  v)  Point ( u  v)  u  L  CreateMesh Line  0 1  0 0
2 
2
2 
HF
HF
F
H
F

 PointG( u  v ) 0  PointH( u  v ) 0  PointG( u  v) 0 u 


LineGH( u  v )   Point G( u  v ) 1   Point H( u  v ) 1  Point G( u  v ) 1  u  Ðåáðî GH
 Point ( u  v )  Point ( u  v )  Point ( u  v)  u  L  CreateMesh Line  0 1 0  0
 GH

2 
2
2 
GH
G
H
G

Построение параллелограмма завершено (рис. 2.61):
80
Рис. 2.61
Этап 6 завершен.
Указания к выполнению этапа 7 «Придание чертежу профессионального вида: расчет масштабов для плоскостей PABC и PD, соответствующих координатам вершин параллелограмма, показ невидимых ребер пунктиром».
1. Сначала рассчитаем диапазоны переменных для плоскостей PABC и
PD соответственно размерам параллелограмма. Для этого составим для
каждой плоскости матрицу координат вершин так, чтобы координаты каждого аргумента (x, y, z) всех вершин находились в отдельном столбце. Затем найдем максимальные и минимальные значения координат x и y с помощью функции min( ), применяя ее к соответствующему столбцу. Составная матрица для вершин, расположенных на плоскости PABC, имеет
вид:
T
T
T
T
Point ABCE  stack stack stack Point A( 1 0)  Point B( 1 0)   Point C( 1 0)   Point E( 1 0) 






2. Без привычки такие сложные конструкты безошибочно создать
трудно. Поэтому на первых порах лучше наращивать число строк матрицы постепенно, начиная с координат двух вершин. Последовательность
действий:
 Выбираем произвольно две любые вершины (например, вершины A
и B). Их координаты заданы векторами PointA(1,0), PointB(1,0).
Транспонируем векторы (<Ctrl>+<1>) и соединяем две строки «одна
под другой», с помощью функции stack( ). Получится:
stack Point A( 1 0)  Point B( 1 0)

T
81
T

 Охватываем полученный фрагмент синим контуром и вырезаем его
в буфер (<Ctrl>+<x> или иконка «ножницы»)
 Для того чтобы подсоединить третью строку, соответствующую координатам вершины C, набираем stack( ). В слот, не думая, извлекаем из буфера часть формулы, заготовленной ранее (получится
stack stack Point A( 1 0)  Point B( 1 0)

T
T

 ). Перебрасываем синий
контур направо (клавишей <Insert>), ставим запятую (получится
stack stack Point A( 1 0)  Point B( 1 0)

T
T


  и в образовавшийся
слот вводим Point C( 1 0). Перебрасываем синий контур направо и
нажимаем <Ctrl>+<1> для транспонирования. Получится:
stack stack Point A( 1 0)  Point B( 1 0)

T
T

T
  Point C( 1 0) 
 Точно так же добавляем координаты еще одной точки. Получится:
stack stack stack Point A( 1 0)  Point B( 1 0)



T
T
T
T
  Point C( 1 0)   Point E( 1 0) 
 Всю формулу вырезаем в буфер, набираем идентификатор
Point ABCE  и в слот извлекаем сконструированную формулу из
буфера. Получится нужный конструкт. Результат расчета (с пояснениями):
Координаты:
x y z
 1
2
Point ABCE  
3
4

2 3

1 2
3 1

2 0
Точка А
Точка B
Точка C
Точка E
 Находим диапазон изменения аргументов x и y путем расчета минимального и максимального значения первого и второго столбцов
(согласно нумерации, принятой в Mathcad – нулевого и первого
столбцов). Извлечение столбца – клавишами <Ctrl>+<^>:
82
 0
xmin ABCE  min  Point ABCE 


xmin ABCE  1
 0
xmaxABCE  max Point ABCE 


xmaxABCE  4
 1
ymin ABCE  min  PointABCE 

 1 

 ymaxABCE  max PointABCE 
ymin ABCE  1
ymaxABCE  3
Правильность расчетов подтверждается просмотром столбцов матрицы PointABCE.
Эти расчеты позволяют уточнить диапазон переменных для вывода
плоскости PABC на чертеж:


P ABC  CreateMesh Plane ABC xmin ABCE xmax ABCE ymin ABCE ymax ABCE 5 5
Полностью аналогично определяем диапазон переменных для вывода плоскости PD.
Выводим чертеж и показываем невидимые ребра пунктиром (щелчком по графику вызываем окно форматирования графика, выбираем
вкладку Special и для невидимых ребер указываем Line Style (стиль линий) Dashed (пунктир). Этой операцией заканчивается построение чертежа. Получится так (рис. 2.62):
83
Рис. 2.62
Этап 7 завершен.
Задания 1,2 выполнены.
8.2.2. Пояснения к заданию 3 «Найти длину ребер AB, GH».
Из курса алгебры мы знаем, что длина вектора определяется как корень квадратный из суммы квадратов разностей координат начала и конца вектора:
LengthAB 
xB  xA2  yB  yA2  zB  zA2
Length AB  1.732
Средства Mathcad позволяют такие вычисления делать быстрее, с
помощью встроенной функции «длина вектора», которая обозначается
вертикальными линиями. Формируем разность векторов координат точек
A и B и вычисляем длину:
LengthAB  PointB( 1 0)  PointA( 1 0)
Длина ребра GH находится аналогично.
84
LengthAB  1.732
8.2.3. Пояснения к заданию 4 «Найти угол между ребрами AB и
AC, сделать проверку».
Последовательность решения:
 Этап 1. Формируем векторы AB и AC, используя найденные выше
координаты вершин A, B, C.
 Этап 2. Пользуясь встроенной процедурой Mathcad или формулой,
изученной в курсе алгебры, находим скалярное произведение векторов AB и AC по значениям проекций этих векторов на оси.
 Этап 3. Сопоставляем результат этапа 2 с иной формулой скалярного произведения (произведение длин векторов на косинус угла между ними). Приравнивая два варианта формул скалярного произведения друг к другу, находим угол между векторами.
 Этап 4. Для проверки находим угол между векторами BA и BE, см.
чертеж к этапу 7 заданий 1, 2. Для параллелограмма сумма углов между векторами (AB, AC) и (BA, BE) должна составить  радиан (180).
Выполнение этапа 1 «Формирование векторов AB и AC». Используя формулы алгебры, рассчитываем проекции векторов на оси по разности координат точек на их границах:
1 
AB  PointB( 1  0)  PointA ( 1  0)
AC  PointC( 1  0)  PointA ( 1  0)
Этап 1 завершен.
AB   1 
 
 1 
2 
AC   1 
 
 2 
Выполнение этапа 2 «Расчет скалярного произведения векторов
AB и AC». Формула для расчета скалярного произведения ScalarAB_AC,
известная из курса алгебры:
2
ScalarAB_AC 

AB  AC
k
k
ScalarAB_AC  3
k 0
В Mathcad имеется встроенная функция, позволяющая найти скалярное произведение быстрее, используя транспонирование одного из векторов (любого) (<Ctrl>+<2>):
85
Обозначение транспонирования Т НЕ НАБИРАЙТЕ,
используйте <Ctrl>+<1>
T
ScalarAB_AC  AB  AC
ScalarAB_AC  ( 3 )
Этап 2 завершен.
Выполнение этапа 3 «Расчет угла между векторами». Используем
способ вычисления скалярного произведения как произведения длин векторов на косинус угла между ними. Поскольку значение скалярного произведения вычислено (этап 2), то единственным неизвестным будет косинус угла между векторами. Найдем его (символьная процедура, вызывается <Ctrl>+<Shift>+<точка>). Длину вектора определяем так, как
описано в Пояснении к заданию 3 (идентификатор вектора окружаем вертикальными линиями):
В слот нужно вставить команду:
solve, φ («Реши относительно φ»)
Жирный знак равенства –
<Ctrl>+<=>
AB  AC  cos  
Scalar AB_AC

Вид формулы после вызова символьной
процедуры <Ctrl>+<Shift>+<точка>)
В результате решения получим:
AB  AC  cos  
1
Scalar AB_AC solve    acos   3
3 
Так в Mathcad обозначается arccos()
 3
 . Если мы хотим увидеть

3


Решение читается так:   arccos 

числовой ответ, нужно охватить формулу синим контуром и нажать знак
равенства. Результат выведется в радианах:
1
AB  AC  cos   Scalar AB_AC solve    acos   3  0.955
3 
Для того чтобы вывести ответ в градусах, нужно в слот ввести
наименование единицы измерения: меню Insert (Вставить) Units (Единицы измерения) Angular (Единицы измерения углов) Degrees (Градусы)
86
Получим (рис. 2.63):
Рис. 2.63
1
Scalar AB_AC solve    acos   3  54.736 deg
3 
Решение читается так:  = 54.736.
AB  AC  cos  
Этап 3 завершен.
Выполнение этапа 4 «Проверка». Аналогично описанному вычисляем угол между векторами BA и BE. Получаем:
BA  PointA ( 1  0)  PointB( 1  0)
BE  PointE( 1  0)  PointB( 1  0)
T
BA  BE
1
BA  BE  cos   solve      acos   3 
3 
Мы видим, что     , как и должно быть в параллелограмме.
Проверка успешно завершена.
Этап 3 завершен.
Выполнение задания 4 закончено.
87
§9. Индивидуальные задания по части 2
Индивидуальные задания те же, что в учебной задаче. Индивидуальные исходные данные приведены в табл 3.
Таблица 3
Исходные данные к индивидуальным заданиям
Координаты вершин параллелограмма
ВАРИАНТЫ
Вершина A
Вершина B
Вершина C
Вершина D
XA
YA
ZA
XB
YB
ZB
XC
YC
ZC
XD
YD
ZD
0
3
2
-1
3
6
-2
4
2
0
5
4
№2
4
2
5
0
7
2
0
2
7
1
5
0
№3
-1
2
0
-2
2
4
-3
3
0
-1
4
2
№4
4
4
10
4
10
2
2
8
4
9
6
4
№5
2
2
3
1
2
7
0
3
3
2
4
5
№6
4
6
5
6
9
4
2
10
10
7
5
9
№7
0
-1
2
-1
-1
6
-2
0
2
0
1
4
№8
3
5
4
8
7
4
5
10
4
4
7
8
№9
3
0
2
2
0
6
1
1
2
3
2
4
№10
10
6
6
-2
8
2
6
8
9
7
10
3
№1
88
ЧАСТЬ 3. ПРОГРАММИРОВАНИЕ В MATHCAD
Введение. О программировании в среде Mathcad
Mathcad содержит собственные (правда, очень скромные) средства
программирования; имеется также возможность встраивания программ,
написанных на C++.
Перечислим некоторые особенности программирования в Mathcad.
1. Операторы программы НЕЛЬЗЯ набирать вручную. Их вводят
щелчками мыши по наименованиям операторов из окна программирования
(рис. 3.1). Окно вызывается из меню View – Toolbars – Programming.
2. Все программы являются функциями (не процедурами!).
3. Переменные, объявленные выше и / или левее текста программы,
передаются в программу как значения (by value) и не изменяются, если по
ходу программы им присваиваются другие значения (часто это обстоятельство забывается и служит источником ошибок).
4. Программы пишутся с указанием начала и конца операторных
скобок (for…, while…, if…); такое указание производится с помощью
вертикальных линий (рис. 3.2, на котором показан пример программы).
5. В арифметических выражениях используется специфический знак
присваивания: стрелка справа налево ().
6. В логических выражениях и для организации циклов используются:
 знаки отношения:
а) равно – жирный знак равенства (ввод <Ctrl>+<=>);
б) больше (ввод клавишей >);
в) меньше (ввод клавишей <);
г) больше или равно (ввод <Ctrl >+<круглая закрывающая
скобка>);
д) меньше или равно (ввод <Ctrl>+<круглая открывающая
скобка>);
 знаки логических действий:
условия «И» и «ИЛИ» (ввод знаком умножения (*) и сложения
(+)).
7. Функция должна заканчиваться идентификатором возвращаемых
переменных (простая переменная, матрица или структура – т. е. некоторые из переменных, указанных в идентификаторе, являются простыми
переменными, а другие – векторами или матрицами).
8. Программы могут содержать рекурсии.
89
Рис. 3.1. Окно программирования и его особенности.
Рис. 3.2. Так выглядит программа в Mathcad.
90
§10. Осваиваем технику программирования в Mathcad.
Ваша первая программа
При освоении техники программирования (любой, не только в
Mathcad) наилучшим способом является решение конкретной задачи и
(по его ходу) освоение операторов и приемов. Такой способ имеет специальное название DIY («do it yourself» – «делай сам»). Используем его и
мы.
Позиции способа DIY применительно к изучению программирования:
1. Этап 1. Составить требования к входным данным и к форме выдачи результата.
2. Этап 2. Разобрать способ получения результата, описанный в литературе, или самому разработать способ получения результата. Рассчитать контрольные примеры, иллюстрирующие разные варианты
окончания работы алгоритма.
3. Этап 3. Составить алгоритм и представить его в схематичной
форме (блок-схема или Исполнитель по А.П. Ершову).
4. Этап 4. Рассчитать контрольные примеры применительно к алгоритму.
5. Этап 5. Составить программу, отладить ее на контрольных примерах.
Опыт показывает, что в этой схеме обязательно будут возвраты и рециклы: никто не умеет составить алгоритм так, чтобы программа сразу
заработала без ошибок. Качество программиста измеряется не числом
ошибок (их делают все), а скоростью их обнаружения.
Освоим все этапы применительно к разработке программы, содержательная постановка задачи для которой такова:
требуется составить программу для перевода правильной десятичной
дроби в новую систему счисления и представить результат в слове с заданным числом позиций.
10.1. Выполнение этапа 1 «Выработка требований к исходным
данным и к форме выдачи результата»
10.1.1. Требования к исходным данным. Вначале определяем, что в
данной задаче представляют собой исходные данные. Согласно заданию
в состав исходных данных войдут:
91
1. Основание новой системы счисления, в которую должна переводиться дробь;
2. Число разрядов (если переводится в двоичную систему) или позиций (если система не двоичная), отведенных для представления результата;
3. Правильная десятичная дробь, подлежащая переводу в новую
систему счисления.
Поскольку программа имеет форму функции, исходные данные
должны быть указаны в виде ее абстрактных аргументов (формальных
параметров). Примем обозначения:
 osnovanie – основание новой системы счисления;
 n_bit – число разрядов или позиций для представления результата;
 fraction – правильная десятичная дробь, подлежащая переводу в
новую систему счисления;
 Z – идентификатор функции, программу для которой предстоит
разработать.
В этих обозначениях функция с аргументами будет записана так:
Z(osnovanie, n_bit, fraction)
Позиция 10.1.1 завершена.
10.1.2. Требования к форме выдачи результата. Согласно содержательной постановке задачи функция Z(osnovanie, n_bit, fraction) должна
возвратить массив, j-й элемент которого представляет собой сомножиj
тель, с которым слагаемое Разряд j  osnovanie
входит в представление дроби fraction в новой системе счисления.
Для того чтобы прочесть и проверить результат, нужно перевести
его снова в десятичную форму:
Дес _ знач  [ разряд ]1  [основание] 1  [ разряд ] 2  [основание] 2  
 [ разряд ] n _ bit  [основание]  n _ bit
Например, пусть задано значение основания osnovanie = 2 новой системы счисления. Пусть десятичная дробь, подлежащая переводу, равна:
fraction = 0.625. Пусть число разрядов в слове равно n_bit = 8.
Тогда
функция
должна
возвратить
массив
–
строку
1 0 1 0 0 0 0 0 . Для того чтобы прочесть это число (т. е. перевести его в десятичную форму), рассчитываем:
1  2 1  0  2 2  1  2 3  0  2 4  0  2 5  0  2 6  0  2 7  0  2 8  0.625
Мы знаем, что не всякую десятичную дробь можно точно представить в любой системе счисления, если число позиций для выдачи результата ограничено. Поэтому полезно дополнить состав переменных, возвращаемых функцией, сведениями:
92
– о погрешности представления дроби fraction в новой системе
счисления;
– о числе значащих разрядов (если дробь представима точно, то
часть разрядов справа будет нулями). В примере, рассмотренном выше,
число значащих разрядов равно 3.
Таким образом, определяем перечень переменных, которые должна
возвратить функция Z(osnovanie, n_bit, fraction):
 Число значащих разрядов Nr;
 Массив-строку x из n_bit элементов (столбцов) с результатами перевода дроби в новую систему счисления;
 Погрешность  от перевода десятичной дроби fraction в новую систему счисления.
Состав возвращаемых переменных неоднороден: часть переменных
(Nr, ) являются простыми переменными, другая часть (x) – массив с индексом j {0, .., n_bit-1}. Как известно, смешанные типы данных называются структурами.
Позиция 10.1.2 завершена.
Этап 1 завершен.
10.2. Выполнение этапа 2 «Разбор способа получения результата.
Расчет примеров»
Алгоритм перевода десятичной дроби в новую систему счисления
состоит из последовательности умножения дроби на новое основание,
выделения целой части (она записывается в очередную позицию словаответа), вычисления остатка и повторного умножения его на основание
– до тех пор, пока (а) либо не будет получен остаток, равный нулю, либо
(б) не будут исчерпаны позиции, отведенные для хранения числа.
Нужно составить примеры для обоих вариантов окончания работы
алгоритма.
Пример 1. Пусть число разрядов в слове n_bit = 8. В результате вычислений, показанных на рис. 3.3, число 0.7810 в двоичной системе представлено неточно: (0.1 1 0 0 0 1 1 1)2. Его дробная часть читается «сверху
вниз» в ходе последовательных умножений остатка от вычитания целой
части на 2.
Проверка:
1
1
1
1
1
1
1
1
1  1  0   0   0   1  1
 1
 0.77734375
2
4
8
16
32
64
128
256
Погрешность  = (0.78-0.77734375) = 0.00265625
Это же значение можно прочесть и при выводе результата: остаток
93
после последнего шага равен 0.68, номер последнего разряда равен 8, тогда погрешность равна:  = 0.68  2 –8 = 0.00265625.
Число значащих разрядов получи0.78
лось равным числу разрядов слова (в
2 =
примере 8).
1
1.56
1
0
0
– 1.00
0.56 остаток  0
2 =
1.12
– 1.00
0.12 остаток  0
2 =
0.24
– 0.00
0.24 остаток  0
2 =
0.48
– 0.00
0.48 остаток  0
2 =
0.96
– 0.00
0.96 остаток  0
2 =
1.92
– 1.00
0.92 остаток  0
2 =
1.84
– 1.00
0.84 остаток  0
2 =
1.68
– 1.00
0.68 остаток  0
Пример 2. Перевод правильной десятичной дроби к такой, которая представима в новой системе счисления без погрешности. Переводим 0.625 в двоичную
систему. 0.625  2 = 1.25, остаток 0.25  2
= 0.5, остаток 0.5  2 = 1, остаток равен 0.
Ответ имеет вид: (0.10100000), число значащих разрядов равно 3, погрешность
равна 0.
Проверка:
1
1
1
1  0   1  0.625
2
4
8
10.3. Выполнение этапа 3 «Составление алгоритма и представление его в
схематичной форме» (Исполнитель по
акад. А. П. Ершову).
При разборе алгоритма полезно следить
за операциями по примеру (этап 2).
1
ДАНО: создать функцию, переводящую заданную десятичную правильную
дробь в новую систему счисления с заданным основанием. Число позиций для
1
представления результата задано.
Идентификаторы аргументов:
 osnovanie – основание новой системы
счисления;
1
 n_bit – число позиций для представления результата;
 fraction – правильная десятичная
дробь,
подлежащая переводу в новую сиРис. 3.3. Пример перевода десятичстему счисления.
ной дроби в двоичную систему.
ПОЛУЧИТЬ: функция Z(osnovanie,
n_bit, fraction) возвращает СТРУКТУРУ {Nr x }
Комментарии:
0
94
 Nr – число значащих разрядов (позиций) в слове длиной n_bit.
 x – матрица-строка с числом элементов, равным n_bit. Элемент xj
является сомножителем, с которым слагаемое xj  (osnovanie)-(j+1)
входит в формулу расчета значения дроби; j = 0,…,n_bit – 1 (нумерация элементов матрицы – с нуля, как это принято в Mathcad);
  – погрешность представления правильной десятичной дроби
fraction в системе счисления с основанием osnovanie в слове с
числом позиций n_bit.
Для ОБРАЩЕНИЯ к функции Z(osnovanie, n_bit, fraction) ЗАДАТЬ числовые значения аргументов (osnovanie, n_bit, fraction);
АЛГОРИТМ вычисления функции Z(osnovanie, n_bit, fraction)
НАЧАЛО расчета значения функции Z(osnovanie, n_bit, fraction).
ПРИСВОИТЬ начальное значение (нуль) счетчику значащих разрядов Nr
ПРИСВОИТЬ начальное значение (fraction) переменной c, обозначающей остаток;
ЦИКЛ ПОКА значение числа значащих разрядов Nr < n_bit
ВЫПОЛНЯТЬ
ВЫЧИСЛИТЬ c * osnovanie;
ПРИСВОИТЬ результат вычисления переменной d;
ПРИСВОИТЬ элементу массива-строки x0, N r [целую часть d];
ВЫЧИСЛИТЬ ostatok как РАЗНОСТЬ между d и [целой частью d];
ПРИСВОИТЬ переменной c значение переменой ostatok;
УВЕЛИЧИТЬ на 1 значение счетчика значащих разрядов Nr;
ЕСЛИ ostatok = 0 ТО ПРЕРВАТЬ ЦИКЛ и ПЕРЕЙТИ к КОМАНДЕ
за скобкой КОНЕЦ ЦИКЛА
ПРИСВОИТЬ новое значение ostatok переменной c;
КОНЕЦ ЦИКЛА ПОКА…
ЕСЛИ число значащих разрядов Nr меньше заданного числа n_bit разрядов ТО
Комментарий: разряды, оставшиеся свободными, заполнить нулями.
ЦИКЛ ДЛЯ КАЖДОГО j = Nr + 1, …, n_bit - 1 ВЫПОЛНЯТЬ
ПРИСВОИТЬ нуль j-му элементу массива-строки x0,j;
КОНЕЦ ЦИКЛА ДЛЯ КАЖДОГО…
КОНЕЦ ЕСЛИ
ПРИСВОИТЬ переменной  значение ostatok * osnovanie – n_bit
ПРИСВОИТЬ возвращаемые значения структуре
{Nr ×.  }
КОНЕЦ АЛГОРИТМА
95
Этап 3 завершен.
10.4. Выполнение этапа 4 «Расчет контрольных примеров применительно к алгоритму»
В качестве контрольных примеров используем примеры, рассчитанные на этапе 2.
Пусть число разрядов n_bit = 8, основание новой системы счисления
osnovanie = 2.
Пример 1 (для проверки правильности перевода в новую систему
счисления с погрешностью): перевести десятичную правильную дробь
0.78 в двоичную систему счисления.
ФУНКЦИЯ Z(2,8,0.78) должна возвратить:
Z(2,8,0.78)0,0 = 8 (число значащих разрядов)
Z(2,8,0.78)0,1 = (11000111) (дробная часть числа 0.78 в двоичной системе счисления)
Z(2,8,0.78)0,2 = 0.00265625 (погрешность)
Пример 2 (для проверки правильности перевода в новую систему
счисления без погрешности): перевести десятичную правильную дробь
0.65 в двоичную систему счисления.
ФУНКЦИЯ Z(2,8,0.625) должна возвратить:
Z(2,8,0.625)0,0 = 3 (число значащих разрядов)
Z(2,8,0.625)0,1 = (10100000) (дробная часть числа 0.625 в двоичной
системе счисления)
Z(2,8,0.625)0,2 = 0 (погрешность)
Этап 4 завершен.
10.5. Выполнение этапа 5 «Составление программы, отладка на
контрольных примерах»
10.5.1. Составление программы будем проводить шаг за шагом.
Удобно следить за реализацией алгоритма по Исполнителю (этап 3).
Шаг 1. Вводим идентификатор функции, в скобках перечисляем аргументы, нажимаем знак присваивания (вводится двоеточием). Получится так:
Шаг 2. На панели «Программирование» (если ее нет на экране – вызовите из Меню View – Toolbars – Programming) найдите иконку Add Line
96
(«добавить линию») и щелкните по ней левой кнопкой мыши. Введется операторная скобка «начало программы – конец программы». Получится так:
Шаг 3. Установите указатель мыши на верхний слот и щелкните левой кнопкой. Получится так:
Шаг 4. Щелчком левой кнопки мыши введите с панели программирования знак присваивания. Получится так:
Шаг 5. Пользуясь мышью, присвойте начальное значение (нуль)
счетчику числа значащих разрядов Nr (он же будет использован и как
счетчик циклов). Получится так:
Шаг 6. Аналогичными действиями присвойте исходное значение переменной c, которую согласно алгоритму будем в цикле умножать на основание системы счисления. Исходное значение равно той десятичной
дроби, которую мы переводим в новую систему счисления. Получится так:
Шаг 7. Длина вертикальной линии (операторной скобки), установленная по умолчанию, исчерпана. Нужно ее увеличить. Предварительная
операция: охватите синим контуром нижнюю строку программы. Получится так:
97
Шаг 8. Теперь щелчком левой кнопки мыши по иконке Add Line на панели «Программирование» удлините операторную скобку. Получится так:
Шаг 9. Оформляем условие цикла: делать вычисления, пока не будут исчерпаны разряды слова (записаны в составе аргументов функции,
n_bit). Для этого щелкните левой кнопкой мыши по оператору while на панели «Программирование» (НЕЛЬЗЯ набирать от руки!). Получится так:
Шаг 10. Введите условие вхождения в цикл. Получится так:
Шаг 11. Образуйте операторную скобку оператора цикла while
(щелчком в слоте оператора while введите скобку с панели «Программирование», иконка Add Line), установите указатель в верхнем слоте внутри операторной скобки цикла. Получится так:
98
Шаг 12. Согласно алгоритму перевода десятичной дроби в другую
систему счисления присвойте переменной d значение произведения дроби на основание, выделите целую часть произведения и присвойте его Nr
-му элементу строки x, т. е. элементу с индексами x0,s (напоминание: нумерация элементов массива в Mathcad начинается с нуля, а не с единицы). При первом входе в цикл значение индекса Nr равно 0.
Подготовьтесь к удлинению операторной скобки (охватите нижнюю
строку программы целиком синим контуром). Получится так:
Шаг 13. Чтобы каждый раз не тратить время на удлинение операторной скобки, «нащелкайте» с помощью иконки Add Line (панель
«Программирование») сразу несколько слотов. Не бойтесь образовать
лишние слоты – их легко будет удалить. Получится так:
99
Шаг 14. Согласно алгоритму следует вычислить остаток (разность
между результатом умножения дроби и его целой частью, присваивается
переменной ostatok) и подготовиться к новому циклу (присвоить цикловой переменной значение Nr+1). Получится так:
Шаг 15. Оформление досрочного выхода из цикла. Для этого введем
щелчком кнопки мыши оператор условия if (иконка if на панели «Программирование»). Получится так:
100
Шаг 16. Вводим условие досрочного прекращения цикла: ЕСЛИ
ostatok = 0. Условие вводится справа от оператора if – вот так:
Шаг 17. Показываем, что должно быть сделано, если ostatok = 0. В
данном случае должен быть прерван цикл (оператор break, вводится
щелчком по соответствующей иконке на панели «Программирование»).
Получится так:
101
Шаг 18. Если досрочный выход из цикла не произошел, нужно присвоить новое значение остатка ostatok переменной c. Получится так:
Шаг 19. Дальше текст программы должен записываться вне операторной скобки while. Чтобы выйти из нее, охватите синим контуром часть
программы до оператора цикла while включительно. Угол контура должен
быть справа (иначе слот для ввода продолжения программы появится выше while). Переброску угла синего контура удобно делать клавишей <Insert>, а увеличение охвата – клавишей <Пробел>. Получится так:
102
Шаг 20. Теперь, если щелкать левой кнопкой мыши по иконке Add
Line, то появятся слоты для продолжения программы вне цикла. Заготовьте несколько таких слотов. Получится так:
103
Шаг 21. Теперь нужно циклически присвоить нули тем разрядам,
которые остались незаполненными (если цикл while оказался прерванным досрочно, т. е. если для представления дроби fraction достаточно
меньшего, чем n_bit числа разрядов). Вводим условный оператор и справа указываем условие, при котором следует дописывать незаполненные
позиции. Получится так:
104
Шаг 22. Показываем, что должно быть сделано, если Nr < n_bit.
Согласно алгоритму следует циклически присваивать нулевые значения
разрядам числа, начиная с Nr+1 –го до последнего разряда (его номер
n_bit-1, учитывая Mathcad-нумерацию с нуля, а не с единицы). Оператор
for введем с соответствующей иконки щелчком мыши в слот слева от
оператора if. Внутреннюю операторную скобку цикла for Mathcad оформит сам. Получится так:
В этом случае в цикле – только один оператор, поэтому Mathcad не
вводит линию-границу операторной скобки (считает, что и так поймем).
105
Шаг 23. В ходе вычислений получены данные для определения погрешности (если данная дробь fraction не может быть представлена в новой системе точно), см. пример 1. Присваиваем значение погрешности
переменной , входящей в состав структуры, возвращаемой функцией
Z(osnovanie, n_bit, fraction). Получится так:
Шаг 24 (последний). Все составляющие структуры (Nr x ), которые
должны возвращаться функцией Z(osnovanie, n_bit, fraction), получены.
После окончания цикла или после его досрочного прерывания значение
переменной Nr окажется равным числу значащих разрядов в слове длины
n_bit. Значащие разряды – такие, за которыми:
 либо следуют все нули, если заданная дробь fraction может быть
представлена без потерь точности меньшим, чем n_bit, числом разрядов;
 либо число разрядов окажется исчерпанным с потерей точности
представления дроби fraction. В этом случае число значащих разрядов
равно n_bit.
Рассчитаны также элементы матрицы-строки x с результатом пере106
вода дроби в новую систему счисления и погрешность , возникающая
при переводе. Осталось записать структуру, возвращаемую функцией.
Оформляем перечень значений, возвращаемых функцией Z(osnovanie,
n_bit, fraction). Согласно заданию функция должна возвращать:
 Число значащих разрядов (в обозначениях программы Nr);
 Массив значений из 8-ми элементов (матрица-строка x), содержащий перечень значений в разрядах числа.
 Погрешность  от представления заданной дроби fraction в новой
системе счисления с основанием osnovanie.
В данном случае нужно, чтобы функция возвратила разнородную
структуру данных (в ней и простые переменные, и массив). Такая структура данных так и называется – структура (в отличие от простой переменной или массива).
Для ввода перечня возвращаемых значений в слот программы используем шаблон матрицы. Можно использовать меню Insert – Matrix,
но лучше запомнить сочетание клавиш <Ctrl>+<M> (мнемоника M от
matrix). Указываем число строк (rows) 1, число столбцов (columns) 3 по
числу выводимых элементов структуры. В каждый из слотов матрицы
вводим идентификаторы переменных. Если остались лишние слоты –
удалите их. Получится так:
107
Разработка программы завершена. Мы получили функцию в форме
матрицы-строки, первый элемент которой – число значащих разрядов,
второй – строка представления заданной дроби в новой системе счисления, третий – погрешность этого представления.
Позиция 10.5.1 завершена.
10.5.2. Тестирование программы на контрольных примерах.
Сначала посмотрим, что возвратит функция при обращении к ней.
Набираем:
Z(2,8,0.78) =
Выведется структура:
Чтобы прочесть позиции в массиве {1,8}, нужно обратиться к соответствующему элементу структуры. Сделаем это в ходе тестирования
программы, для чего используем заранее рассчитанные примеры. Для
удобства чтения скопируем результаты, которые должна показать программа.
Пример 1 (для проверки правильности перевода в новую систему
счисления с погрешностью): перевести десятичную правильную дробь
0.78 в двоичную систему счисления.
ФУНКЦИЯ Z(2,8,0.78) должна возвратить:
Z(2,8,0.78)0,0 = 8 (число значащих разрядов)
Z(2,8,0.78)0,1 = (11000111) (дробная часть числа 0.78 в двоичной системе счисления)
108
Z(2,8,0.78)0,2 = 0.00265625 (погрешность)
Тестируем программу. Набираем
Пример 2 (для проверки правильности перевода в новую систему
счисления без погрешности): перевести десятичную правильную дробь
0.625 в двоичную систему счисления.
ФУНКЦИЯ Z(2,8,0.625) должна возвратить:
Z(2,8,0.625)0,0 = 3 (число значащих разрядов)
Z(2,8,0.625)0,1 = (10100000) (дробная часть числа 0.625 в двоичной
системе счисления)
Z(2,8,0.625)0,2 = 0 (погрешность)
Тестируем программу. Набираем:
После успешного прохождения тестов позиция 10.5.2 завершена.
Этап 5 завершен.
Разработка программы закончена.
10.6. Эксперименты с программой
Любопытно, что программа позволяет переводить десятичные дроби
в системы счисления с нецелыми основаниями (не только положитель109
ными, но и отрицательными). И сама правильная десятичная дробь не
обязательно должна быть положительной (программа «съест» и такое –
кто бы мог подумать заранее!). Почти так всегда и бывает: с помощью
программы почти всегда удается сделать больше, чем предусмотрено заданием.
Например, переведите десятичную дробь 0.625 в систему счисления
с основанием . Получим:
Оформление паспорта программы. Проведите еще какие-либо эксперименты (например, попытайтесь перевести отрицательную дробь, неправильную дробь, используйте отрицательные основания системы счисления). На основании эксперимента оформите паспорт программы, гарантирующий получение правильного результата при соблюдении ограничений, указанных в нем. В паспорте укажите:
Число, подлежащее переводу, должно быть ……………….…………
(например: правильной десятичной дробью, правильной положительной
десятичной дробью…)
Максимальное число позиций, отводимых для выдачи результата:
……………………………………………………..…………………….…
(например: не ограничивается или ограничивается возможностями ЭВМ,
или равно какому-то конкретному числу – в этом случае нужно указать,
какому …)
Основание новой системы счисления должно быть .............................
(например, целым, целым положительным, любым…)
110
§11. Задания для самостоятельной разработки программы
Ниже приводятся два задания на самостоятельную разработку программы. Не обязательно выполнять оба задания, достаточно одного (любого).
11.1. Задание 1 (более простое) для тех, кто не очень уверенно
программирует
Переработайте программу, разработанную после выполнения п. 8.5
так, чтобы она переводила правильную десятичную дробь в новую систему счисления с минимальным числом позиций так, чтобы число было
переведено с погрешностью не выше заданной. Если максимального числа позиций, предусмотренных для выдачи результата, не достаточно для
перевода числа с погрешностью не выше заданной – перевести десятичную дробь в новую систему счисления с максимальным числом позиций.
Переделка окажется очень малой и простой.
ДАНО:
osnovanie – основание новой системы счисления;
pogreshnost – желательная погрешность перевода дроби в новую систему счисления (желательно, чтобы погрешность перевода была не выше значения
pogreshnost. Это «желание» не всегда выполнимо: для некоторых десятичных дробей точное представление в новой системе при конечном числе позиций окажется невозможным);
n_bitmax – максимально допустимое число позиций для выдачи результата;
fraction – десятичная правильная дробь, подлежащая переводу в новую систему счисления.
ПОЛУЧИТЬ: функция Z(osnovanie, pogreshnost, n_bitmax, fraction),
возвращает СТРУКТУРУ (Nr x ) с элементами:
Nr – число позиций, либо достаточных для представления дроби
fraction с погрешностью не выше заданной pogreshnost (при этом получится Nr  n_bitmax), либо (если при максимально допустимом числе разрядов n_bitmax требуемая точность не достигается) Nr получится равным
n_bitmax;
x – матрица-строка с числом элементов, равным Nr (в этой программе, в отличие от разработанной, число элементов в строке x будет различным в зависимости от требований к погрешности и от максимально
допустимого числа позиций);
 – погрешность представления дроби fraction в новой системе счисления. Может быть выше требуемой pogreshnost, если числа разрядов
n_bitmax недостаточно для представления дроби с требуемой точностью.
111
11.2. Задание 2 (более сложное) для программистов, уверенных в
своих силах
11.2.1. Постановка задачи. Разработайте функцию, генерирующую
импульсы прямоугольной формы (рис. 3.4). Прямоугольный импульс характеризуется четверкой параметров: {продолжительность импульса;
верхний уровень (максимум); нижний уровень (минимум); начальное значение}. Эти параметры, показанные на рис. 3.4, должны принимать значения, указанные пользователем. Им же задается максимальная продолжительность серии импульсов (на рис. 3.4 – максимальное число тактов
отсчета дискретного времени).
Рис. 3.4. Иллюстрация к содержательной постановке задачи.
ДАНО:
Xmax – максимальное значение импульса (действительное число);
Xmin – минимальное значение импульса (действительное число);
s – продолжительность импульса (число тактов дискретного времени, в течение которого значение импульса не изменяется (целое число);
N – число тактов дискретного времени, для которого должна быть
получена серия импульсов.
Xstart – начальное состояние (стартовое значение), задается для первого импульса серии.
ПОЛУЧИТЬ: функция X(Xmax, Xmin, s, N, Xstart), возвращает вектор
X с элементами Xs, показывающими значение импульса в s-м такте, s =
0,...,N. Значение элемента вектора X0 должно быть равно заданному аргументу функции Xstart.
112
11.2.2. Help для программистов, не совсем уверенных в своих силах.
Позиция 1: нахождение идеи алгоритма
Зададим себе вопрос – чем отличается номер такта дискретного времени, в который происходит «переброска» импульса с минимума на максимум и наоборот, от других номеров тактов, в которых импульс не изменяет своего значения? Пусть, например, заданная пользователем продолжительность импульса составляет 11 тактов, а номер текущего такта 28.
Ясно, что число 28 не удается представить как целое число продолжительностей. Поэтому в текущем такте импульс будет иметь то же значение, что и в предшествующем, 27-м.
Если же номер текущего такта равен, например, 44, то (поскольку в
44 такта укладывается целое число 11-тактных продолжительностей)
нужно изменять импульс с выполнением следующего правила:
1. Если на предшествующем такте импульс имел максимальное значение, то его значение нужно заменить на минимальное;
2. Если же на предшествующем такте импульс имел минимальное
значение, то его значение нужно заменить на максимальное.
Отсюда следует, что можно использовать такой «ключ» переброски
импульса с минимума на максимум и наоборот:
Пусть имеет место s-й такт дискретного времени. Тогда, если
s
–
s
целое число, значение импульса нужно «перебросить», а в противном
случае – сохранить прежнее значение.
Позиция 1 закончена.
Позиция 2: подбор встроенных Mathcad-функций.
Полный список функций Mathcad’а можно просмотреть с помощью
иконки f(x) на строке Standard (если эта строка на мониторе не показана
– включите ее из меню View – Toolbars – Standard). Подходящие функции – округление до целого числа сверху ceil( ) («до потолка») или снизу
floor( ) («от пола»). Обе они могут быть использованы для определения
момента переброски значения импульса. Остановимся на функции округления снизу floor( ). Ее действие легко понять на примере:
 18 
 43 
 44 
4
floor    1; floor    3; floor    4; floor    0.
 11 
 11 
 11 
 11 
Мы видим, что если номер такта кратен s, то s  floor  s  ,
s
 s 
44
44


например, floor    . Для номеров тактов, не кратных s,
 11 
11
43 .
s , например,
 43 
 s 
floor    3 
floor 

11
11

s

s
 


113
Это свойство можно использовать как ключ для изменения импульса
с минимума на максимум и наоборот.
Позиция 2 закончена.
Позиция 3. К разработке алгоритма: фрагмент Исполнителя для
переключения значений импульса.
ЕСЛИ s  floor  s  И значение импульса Xs-1 в (s-1)-м такте
s
 s 
было меньше или равно () минимальному значению Xmin ТО
присвоить импульсу Xs в s-м такте максимальное значение;
ЕСЛИ s  floor  s  И значение импульса Xs-1 в (s-1)-м такте
s
 s 
было больше или равно () максимальному значению Xmax ТО
присвоить импульсу Xs в s-м такте минимальное значение;
В ОСТАЛЬНЫХ СЛУЧАЯХ присвоить импульсу Xs в s-м такте то
же значение Xs-1, что и в предыдущем, (s-1)-м такте.
КОНЕЦ ЕСЛИ
Позиция 3 закончена.
Позиция 4. Некоторые детали.
1. Запись условий с логическим оператором И делается с использованием знака умножения (*).
2. В записи условий нужно использовать жирный знак равенства.
3. Пример записи условия (рис.3.5):
Рис. 3.5. Пояснения к записи условий переключения импульсов.
Позиция 4 закончена.
Позиция 5. Так будут выглядеть графики (рис. 3.6), если программа
будет работать правильно.
114
Опция графика, выводящего
прямоугольные импульсы:
Trace – Type - Step
а) Импульсы стартуют с
максимального значения
в) Импульсы стартуют со значения,
несовпадающего ни с минимальным
ни с максимальным
б) Импульсы стартуют с
минимального значения
г) Две сериии, показанные на одном
графике. Параметры импульсов различны
Рис. 3.6. Вывод результата работы программы на график.
Позиция 5 закончена.
Help закончен.
§12. Учебная задача
12.1. Введение
В замечательной книге Дж. Пойа «Как решать задачи» указываются
следующие этапы, выполнение которых (при наличии изобретательности и развитого мышления) может привести к успеху:
Фаза 1. Понять существо задачи.
Фаза 2. Разработать план решения задачи.
Фаза 3. Выполнить план.
Фаза 4. Оценить точность решения, а также его потенциал в качестве средства для решения других задач.
115
Внешне эти фазы просты, но если задача трудна, то приходится решать ее с возвратами к предыдущим фазам для корректировки или даже
полного пересмотра идеи решения.
Применительно к процессу разработки программ эти фазы таковы:
Фаза 1. Понять существо задачи.
Фаза 2. Предложить идею алгоритма.
Фаза 3. Сформулировать алгоритм и реализовать его в виде программы.
Фаза 4. Оценить точность программы, а также ее потенциал в качестве средства для решения других задач.
Одно из самых распространенных заблуждений неопытных программистов: СРАЗУ садиться за ЭВМ – авось идея явится сама собой.
Такое никогда не происходит. Пялиться в оболочку операционной системы или интерфейс языка программирования, не имея плана решения задачи, БЕССМЫСЛЕННО: это ВСЕГДА приводит к потерям времени и, в
конечном счете, к утрате интереса к профессии.
Запомните: время, потраченное на составление программы, ОБРАТНО
ПРОПОРЦИОНАЛЬНО времени, затраченному на обдумывание задачи и выработку идеи ее решения!
12.2. Общие положения
(ПРОЧИТАЙТЕ ОБЯЗАТЕЛЬНО! Не начинайте сразу программировать. Вначале придумайте АЛГОРИТМ: это сэкономит очень много
времени!)
Иллюстрация общих рекомендаций по технологии решения задач
(на примере решения учебной задачи)
Постановка задачи.
ДАНО: массив чисел.
ПОЛУЧИТЬ: функцию, возвращающую значение максимального
элемента массива и номер позиции в массиве, на которой этот элемент
записан.
Исходные данные: массив чисел M:
 2.2 
 1.9 
 
0.6 
M  
 2.3 
 2.5 
 
 2.1 
116
12.3. Выполнение фазы 1 решения задачи «Понять существо
задачи»
Если на массив посмотрит человек (рис. 3.7), то он сразу увидит максимальный элемент (в нашем примере 2.5) и скажет, что этот элемент расположен на позиции № 4 (счет позиций, как в Mathcad’е, с нулевого, рис. 3.8).
Рис. 3.7. Исходные данные.
Рис. 3.8. Точка и позиция максимума.
Решение человеку удается сделать так быстро благодаря параллельности анализа (глаз воспринимает весь массив целиком). Если бы массив
был длиннее (например, не вмещался бы на странице), то такая простота
была бы для человека недостижимой. В этом случае он бы поступал так:
просмотрел бы первую страницу и нашел бы максимальный элемент на
ней. Запомнил бы его. Затем просмотрел бы вторую страницу, нашел бы
в ней максимальный элемент и сравнил бы с максимумом первой страницы. Если бы максимум первой страницы оказался меньше максимума
второй, то человек стал бы использовать максимум второй страницы для
анализа третьей страницы, а о первой странице больше не вспоминал. В
противном случае человек забыл бы о второй странице и сохранил бы
максимум первой страницы для анализа третьей страницы. И так делал
бы в течение всего просмотра данных: либо сохранял значение максимума, обнаруженного ранее, либо заменял бы это значение максимумом,
обнаруженным на данной странице (если этот максимум окажется выше
обнаруженного ранее).
В отличие от человека обычная ЭВМ работает последовательно, т. е.
анализирует только одно значение массива в каждый данный момент
времени.
Примечание: Вы уже знаете, что есть и другие, более совершенные ЭВМ, осуществляющие параллельные расчеты: SIMD и MIMD-машины, нейрокомпьютеры и др.). Но для данной задачи мы будем использовать простейшую схему последовательных вычислений.
117
12.4. Выполнение фазы 2 решения задачи «Предложить идею
алгоритма»
Давайте придумаем алгоритм, который будет похож на описанный
выше «человеческий» способ обнаружения максимума, но будем «показывать» машине элементы массива последовательно. Для этого полезно
представить себе, что Вы – не Вы, а ЭВМ, и логика у Вас машинная, а не
человеческая. Покажем машине нулевой первый элемент (рис. 3.9). Поскольку больше ничего машина «не видит», она решит, что это и есть
максимум, а номер его позиции – нулевой (рис. 3.10). Предполагаемое
значение максимума равно 2.2.
Рис. 3.9. Показ нулевого элемента.
Затем покажем машине первый элемент (рис. 3.11). ЭВМ «увидит»,
что он меньше первого и сохранит прежнее значение предполагаемого
максимума (на нулевой позиции массива). О первом элементе машина
«забудет» как о бесперспективном (поскольку ранее уже найден элемент,
значение которого больше).
Затем покажем второй элемент (рис. 3.12). Ситуация та же: предположение о максимуме на нулевой позиции останется в силе.
Предполагаемый
максимум
Рис. 3.10. Предположение о
максимуме на основе показа
нулевого элемента.
Предполагаемый
максимум
Рис. 3.11. Показ первой точки. Предполагаемый максимум остается на прежней
позиции.
118
Предполагаемый
максимум
Рис. 3.12. Показ второй
точки. Предполагаемый
максимум по-прежнему
там же.
Когда же мы приоткроем третью точку, ситуация изменится (рис.
3.13). Значение в этой точке оказалось больше, чем в той, которую машина держала в памяти как подозреваемую на максимум. Поэтому машина «передумает»: теперь она будет предполагать, что максимум – на
третьей позиции, а значение максимума равно 2.3 (о значении 2.2 можно
забыть). При показе четвертой точки (рис. 3.14) машина снова «передумает», т. к. новое значение (2.5) больше найденного ранее (2.3).
Показ пятой точки (рис. 3.15) не приведет к изменению предположения
о максимуме (значение в ней меньше, чем найденное ранее значение 2.5).
Предполагаемый
максимум
Рис. 3.13. Показ третьей точки.
Значение БОЛЬШЕ прежнего
предположения о максимуме.
Теперь предполагаемый максимум – на третьей точке.
Предполагаемый
максимум
Рис. 3.14. Показ четвертой точки. Положение
предполагаемого максимума снова перемещается.
Предполагаемый
максимум
Рис. 3.15. Показ последней точки. Предположение о максимуме не изменяется.
Поскольку все точки исчерпаны, то машина покажет ответ (рис.
3.16): максимум – на четвертой (считая от нулевой) позиции массива,
значение максимума равно 2.5.
Рис. 3.16. Окончательный диагноз максимума.
119
Теперь заметим, что в действиях машины наблюдается ЦИКЛИЧНОСТЬ:
– показ ОЧЕРЕДНОГО элемента;
– сравнение его с текущим ПРЕДПОЛАГАЕМЫМ МАКСИМУМОМ:
– если:
очередной элемент меньше ПРЕДПОЛАГАЕМОГО МАКСИМУМА
или равен ему, оставить предположение в силе, «забыть» об очередном элементе;
– иначе
(т. е. если очередной элемент БОЛЬШЕ предполагаемого максимума), то переопределить предполагаемый максимум, т. е
считать ОЧЕРЕДНОЙ элемент новым ПРЕДПОЛАГАЕМЫМ
МАКСИМУМОМ, а о старом «забыть»;
– так делать, пока не будут просмотрены ВСЕ элементы массива;
– после окончания циклического просмотра показать результат: значение
максимума и номер позиции в массиве исходных данных, на которой
расположен максимум.
Таким образом, задача придумывания идеи алгоритма решена.
12.5. Выполнение фазы 3 «Сформулировать алгоритм
и реализовать его в виде программы»
Для этого используем условный язык, пригодный для записи алгоритма и чтения его человеком, но «не понимаемый» машиной. Такой
язык называется метаязыком. В нём, в отличие от машинных языков,
нет подробностей о вводе и выводе данных, но алгоритм записывается
так, что его легко перевести на любой машинный язык.
Мы будем использовать метаязык «исполнителей», предложенный
академиком А. П. Ершовым. Под исполнителем (нашей воли) понимается
машина, на которой реализуется алгоритм.
Исполнитель функция max_value с аргументом M (M – массив значений точек с нумерацией, начиная с нулевой). Исполнитель должен сообщить пользователю значение максимального элемента массива M и
номер позиции, на которой находится этот максимум.
ДАНО: массив действительных чисел M с номерами; нумерация
начинается с нуля.
ПОЛУЧИТЬ: функцию max_value(M) с аргументом – массивом M,
возвращающую вектор значений, нулевой элемент которого равен максимальному числу из массива M, а первый элемент равен номеру позиции, на которой размещается максимальное число из массива M.
НАЧАЛО
ПРИСВОИТЬ значение нулевого элемента массива M переменной max,
которую на данной стадии работы алгоритма ЭВМ будет считать
предполагаемым максимумом;
120
ПРИСВОИТЬ значение нуль переменной number_max (мы будем обозначать number_max номер позиции, на которой ЭВМ предполагает
размещение максимума);
РАССЧИТАТЬ число элементов в массиве M, присвоить переменной n
значение, равное числу элементов в массиве M;
ЦИКЛ ДЛЯ КАЖДОГО k = 1,…, n ВЫПОЛНЯТЬ:
ПРОЧЕСТЬ k-й элемент Mk из массива M;
СРАВНИТЬ его с предполагаемым максимумом max;
ЕСЛИ окажется, что Mk > max, ТО
ЗАМЕНИТЬ значение max на Mk;
ЗАМЕНИТЬ значение number_max на значение k;
КОНЕЦ ЕСЛИ
КОНЕЦ ЦИКЛА
ПРИСВОИТЬ значение max нулевому элементу массива, возвращаемого функцией max_value(M) и значение number_max первому
элементу массива, возвращаемого функцией max_value(M);
КОНЕЦ
Реализация алгоритма с помощью средств программирования
Mathcad.
 2.2  Вначале введите исходные данные (записаны слева от тек 1.9  ста).
 
Затем выведите график (он понадобится для проверки
0.6 

алгоритма).
График получится как на рис. 3.7. Для его вывоM 
 2.3  да определите число элементов в массиве (n : = rows(M) - 1 с
 2.5  учетом нумерации в Mathcad с нулевого элемента), задайте
  диапазон изменения аргументов s : = 0 .. n (для многоточия
 2.1  используйте клавишу <точка_с_запятой>).
Затем попытайтесь составить программу без подсказок, прямо по
тексту Исполнителя. В приложении 2 помещено описание программных
средств Mathcad.
Если не сумеете, то используйте текст программы, приведенный ниже. Но обязательно комментируйте КАЖДУЮ строчку программы.
121
Комментарий, см. описание Исполнителя
Текст программы
max_value( M ) 
max  M
Переменной max присваивается значение нулевого элемента
0 массива М (предполагаемый максимум)
number_max  0
Переменной number_max присваивается нулевая позиция массива М (позиция предполагаемого максимума)
n  rows ( M )  1 Расчет числа элементов в массиве исходных данных
for k  1  n
Цикл по номерам элементов массива, начиная с первого
Проверка условия – превышает ли текущее значение
if M  max
элемента массива величину предположения о максимуме
k
max. Если условие выполняется – входим в конструкт if
При выполнении условия заменяем значение макmax  M
k
симума на текущее значение элемента массива, а
number_max  k номер – на номер позиции текущего элемента
Если условие не выполняется – в конструкцию if алгоmax

 ритм «не заходит»

 После завершения цикла вводим шаблон матрицы
 number_max  (<Ctrl>+<M>) и присваиваем ее нулевому элементу значение максимума, а первому – номер позиции, на которой он размещен
12.6. Выполнение фазы 4 «Оценить точность программы, а
также ее потенциал в качестве средства для решения других задач»
После ввода протестируйте программу. Выведите вектор, возвращаемый функцией, и убедитесь, что максимальное число равно 2.5, размещается на позиции 4:
 2.5 
max_value( M)  

 4 
А затем попытайтесь обобщить программу так, чтобы она искала и
максимальный, и минимальный элемент массива M и указывала номера
позиций в массиве, на которых эти элементы расположены.
§13. Индивидуальные задания по части 3
Общая часть всех задач: в файле April.prn находятся данные о
среднесуточных температурах в каждые сутки апреля. Структура файла
(рис. 3.17): в столбце № 0 записаны даты апреля (по формату это – обычные числа в формате с двумя позициями после десятичного разделителя).
В столбце 1 записаны среднесуточные температуры, измеренные с точностью до 0.1 С. Для того чтобы осмыслить задачу (фазы 1 и 2, см. в §12
описание учебной задачи), постройте график изменения температур. Он
имеет вид, показанный на рис. 3.18.
122
Среднесуточные температуры,
градусы Цельсия
Столбец № 0: Столбец № 1:
Дата
Температура
Рис. 3.17. Структура файла
April.prn.
Даты апреля
Рис. 3.18. Изменение температур в апреле.
Варианты:
№ 1. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать массив. В столбце № 0 должны быть даты апреля, в которые температуры
были отрицательными, а в столбце № 1 – значения этих отрицательных
температур. Если отрицательных температур в массиве исходных данных
нет, функция должна выводить сообщение «Нет дней с отрицательной
температурой».
№ 2. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать массив средних значений температур за 5-дневки (если хотите, усложните
задачу, чтобы функция возвращала массив средних температур за заданное число дней, не обязательно за 5).
№ 3. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать дату,
начиная с которой сумма всех положительных температур с начала апреля превысит заданное значение (для примера 10 С). Функция должна
помочь крестьянам установить дату сева. Эта дата определяется по числу
накопленных (т. е. просуммированных) положительных температур с
начала апреля. Пример: для сева яровой пшеницы накопленные положительные температуры должны быть не менее 10 С.
№ 4. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать дату,
для которой имело место самое большое (т. е. самое близкое к 0) значение отрицательной температуры. Если отрицательных температур в мас123
сиве исходных данных нет, функция должна выводить сообщение «Нет
дней с отрицательной температурой».
№ 5. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать:
(а) дату, для которой имело место значение температуры, самое близкое к
среднемесячной температуре; (б) среднемесячную температуру; (в) значение температуры, самое близкое к среднемесячной.
№ 6. Разработайте программу-функцию, аргументами которой являются: (а) массив дат и температур апреля; (б) шифр дня недели, приходящегося на 01.04. Шифры: 0 – воскресенье, 1 – понедельник, … , 6 –
суббота. Функция должна возвращать массив дат и температур всех воскресений апреля.
№ 7. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать значение высоты ростков помидоров, посаженных 01.04, если известна формула, определяющая высоту. Высота ростков на текущую дату пропорциональна корню квадратному из суммы положительных температур, накопленных к текущей дате; коэффициент пропорциональности равен 1.5.
№ 8. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать значение месячной (за апрель) оплаты за электроэнергию, израсходованную
Вашей сплит-системой. Сплит-система настроена на поддержание заданной температуры в комнате (например, на 22 С). Расход электроэнергии
в данные сутки пропорционален квадрату отклонения температуры в эти
сутки от заданной для сплит-системы. Коэффициент пропорциональности равен 0.01. Стоимость 1 кВт-ч электроэнергии равна 1.1 рубля.
№ 9. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать:
(а) продолжительность дня (светлой части суток), в который имела место
самая высокая за весь апрель температура; (б) дату этого дня; (в) значение температуры в этот день. Указание. Продолжительность светлой части суток внутри годичного периода изменяется по закону синуса. Минимальное значение (9 часов) приходится на 22.12. Максимальное значение (15 часов) приходится на 22.06. Выведите формулу для продолжительности светлой части суток и используйте ее для расчета
продолжительности светлой части суток в апреле.
№ 10. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать
(а) продолжительность периода, в течение которого все температуры от
текущей даты до конца апреля были положительными; (б) дату, начиная
124
с которой в апреле уже не было отрицательных температур или, если период положительных температур отсутствует, сообщение «Нет дат с положительными температурами»; (в) температуру на дату п. (б) или, если
период положительных температур отсутствует, сообщение «Нет положительных температур».
№ 11. Разработайте программу-функцию, аргументом которой является массив дат и температур апреля. Функция должна возвращать максимальное (по абсолютной величине) отклонение температуры в апреле
от среднемноголетней, заданной формулой: < среднемноголетняя температура, рассчитываемая по номеру суток апреля> = – 5 + 0.5 <номер суток апреля>. Например, среднемноголетняя температура в 10-е сутки апреля равна: -5 +0.5 10 = 0С.
125
ЧАСТЬ 4. СИМВОЛЬНЫЕ ПРЕОБРАЗОВАНИЯ В MATHCAD
Введение. Сведения о символьных преобразованиях в Mathcad
Mathcad содержит замечательные средства работы не только с числами, но и с формулами (т. е. может оказать помощь в упрощении сложных выражений, приведении подобных слагаемых, нахождении пределов,
интегрировании, дифференцировании, решении уравнений в виде формулы зависимости от коэффициентов и во многих других вопросах…).
Символьная математика, встроенная в Mathcad, заимствована из известного пакета программ для символьных вычислений Maple.
§14. Осваиваем операции символьной математики
Операции символьной математики проводятся из Меню Symbolics.
Освоим ряд его позиций.
14.1. Опция Evaluate – Symbolically
Опция Evaluate – Symbolically позволяет сделать с формулой то, что
Вы сами обычно бы сделали для ее приведения к красивой форме. Обратите внимание: понятие «красивая формула» – совершенно неформальное. Но, поскольку символьную математику разрабатывали профессиональные научные работники, в понятие «красота формулы» они вложили
свои, привычные представления. Например: все подобные слагаемые
должны быть приведены; формула должна быть как можно короче; если
есть слагаемые с дробными коэффициентами, не представимыми точно
десятичной дробью, то ответ нужно представить с коэффициентами в
форме дробей и т. п. Поэтому чаще всего (но не всегда!) результат использования опции Evaluate – Symbolically будет таким же, как Вы сами
бы его получили (если бы умели считать быстро и без ошибок).
Рассмотрим пример. Введите выражение:
1
2 4
2
4 x  15 y   x  19 x  99 x 
x
7
19 ,
охватите его синим контуром (как объект выделения в Mathcad), выберите опцию Evaluate – Symbolically из меню Simbolics (или, БЫСТРЕЕ,
нажмите <Shift>+<F9>). Получится:
3128
2
2
 x  15 y  99 x
133
Теперь представьте себе, что Вы выполняете эти действия вручную,
а формула – в 10 раз длиннее!
126
Эту же операцию можно сделать в форме «живой символьной алгебры» (live symbolics) – чтобы ответ изменялся при изменении исходных данных. Научимся этому. Снова наберите (скопируйте) выражение
1
2 4
2
4 x  15 y   x  19 x  99 x 
x
7
19 ,
охватите его синим контуром так, чтобы вертикаль расположилась справа, т. е. так:
2
4 x  15 y 
4
7
2
 x  19 x  99 x 
1
19
x
,
после этого введите символьный знак равенства (он имеет форму
стрелки) нажатием клавиш <Ctrl>+<Shift>+<точка> (на английской клавиатуре). Получится:
1
2 4
2
4 x  15 y   x  19 x  99 x 
x 
7
19
Примечание: клавиша точка в американском варианте называется period.
Сотрите слот (можно и не стирать) и нажмите Enter или щелкните
левой кнопкой мыши где-нибудь вне формулы. Получится:
1
3128
2 4
2
2
2
4 x  15 y   x  19 x  99 x 
x 
 x  15 y  99 x
7
19
133
Теперь посмотрите, какие замечательные возможности представляет
Вам режим live symbolics! Допишите еще несколько слагаемых вначале или
внутри формулы. Символический результат будет отслеживать эти изменения и вносить их в результат автоматически, без Вашего участия!
Например, внесите в формулу 16x слева (но НЕ набирайте формулу заново, иначе live symbolics не сработает). Для внесения добавлений слева нужно после охвата формулы синим контуром нажать клавишу Insert. Угол
контура переместится влево, давая нам возможность вносить изменения.
2
16 x  4 x  15 y 
4
7
1
2
 x  19 x  99 x 
19
 x
Вы увидите, что результат автоматически учтет новые данные:
2
16x  4 x  15 y 
4
7
1
2
 x  19 x  99 x 
19
x 
5256
133
2
2
 x  15 y  99 x
Пример 1. Пользуясь режимом live symbolics, найдите предел, к которому стремится выражение
1 


1
x

x
если х  0. Для ввода предела используйте панель Calculus из меню
View – Toolbars, на появившейся панели найдите иконку пределов (lim)
127
со слотом для ввода имени переменной, по которой ищется предел. Введите формулу, чтобы получилось так:
lim
x
1 

0
1
x

x
Затем <Ctrl>+<Shift>+<точка> и щелчок левой кнопки мыши.
Пример 2. Пользуясь режимом live symbolics, найдите предел, к которому стремится выражение при х  0:
sin ( 2x)
lim
x  0 sin ( 3x)
14.2. Опция Symbolics – Simplify
Опция Symbolics – Simplify позволяет упрощать и приводить к красивой форме более сложные выражения, чем алгебраические. В такие
выражения могут входить дроби, для сокращения которых нужно искать
корни уравнения, элементарные функции (тригонометрические, логарифмические…) и т. п. Решим несколько примеров.
log( x 2)
Введите 2
. Встроенная функция «логарифм» log(x,2) в этом
случае читается как «логарифм числа x с основанием 2». Охватите выражение синим контуром и выберите опцию Simplify из меню Symbolics.
Получится x.
Эти же действия можно сделать в режиме live symbolics. Для этого
log( x 2)
охватите 2
синим контуром справа, введите символьный знак равенства (<Ctrl>+<Shift>+<точка>), в появившийся слот введите ключевое слово simplify (переводится – упрощай). Получится:
log( x 2)
2
simplify  x
Испытайте режим live symbolics, например, так: замените основание
2 на 10, автоматически выведется:
1
log( x 10)
( ln( 2)  ln( 5) )
 ln( 2)
2
simplify  x
Рассмотрите еще несколько примеров. Они позволят Вам испытать
восхищение перед уровнем алгоритмизации и программирования, позволившим получить замечательные возможности. Упростите выражения
(либо Simplify из меню Symbolics, либо в режиме live symbolics) (для
ввода степени используйте клавиши <Shift>+<6>):
sin( x)
tan( x)
1  4x  4x2
 cos ( x)  sin( x)  tan( x)  cos ( x)
( 1  2x)
,
128
lim
, x 
 ( x  1) 
 ( x  3) 


2 x 1
Примечания: 1. Функция tan(x) соответствует принятому у нас обозначению тангенса tg(x).
2. Знак «бесконечность» () выводится с панели Calculus меню View –Toolbars.
14.3. Опция Symbolics – Expand
Опция Symbolics – Expand позволяет раскрывать скобки в сложных
выражениях.
Пример 1. Наберите выражение
x2  ax  b3 ,
охватите его (целиком!) синим контуром, затем используйте меню Symbolics – Expand. Получится:
6
5
4
4 2
3
2 2
3 3
2 2
2
x  3 x  a  3 x  b  3 x  a  6 x  a b  3 x  b  a  x  3 a  x  b  3 a x b  b
3
Можете поэкспериментировать с гораздо более сложными выражениями.
Для использования режима live symbolic Mathcad’у нужна информация о том, какие из переменных относятся к коэффициентам, а какие обозначают переменные. Поэтому следует при наборе использовать для переменных ПРОПИСНЫЕ литеры. Покажем это на примере 2.
Пример 2. Наберите выражение
 X2  a X  c2 ,
различая строчные и прописные обозначения, охватите его (целиком!)
синим контуром, затем введите символьный знак равенства (<Ctrl>+
<Shift>+<точка>). В появившийся слот введите ключевое слово expand
(«разложи в ряд») и щелкните левой кнопкой мыши где-нибудь вне выражения. Получится «живая» формула, автоматически реагирующая на
вносимые изменения:
 X2  a X  c2 expand
4
3
2
2
2
 X  2 X  a  2 X  c  a  X  2 a X c  c
2
Например, замените показатель степени на 7, увидите моментальный
результат (который вряд ли кто-то сможет получить вручную за обозримое время).
14.4. Опция Symbolics – Variable
Опция Symbolics – Variable содержит весьма полезные позиции:
символьное решение уравнений; символьное дифференцирование; символьное интегрирование и др.
14.4.1. Опция Symbolics – Variable – Solve служит для нахождения
решений уравнений в символьной форме. Как и в описанных выше позициях, возможно однократное («мертвое») решение путем выделения ис129
комой переменной и использования позиций меню, а также возможен
режим live symbolic, в котором искомые переменные обозначаются
ПРОПИСНЫМИ литерами. Покажем это на примерах 1 и 2.
Пример 1. Решение уравнения в режиме live symbolic. Наберите
уравнение
2
a X  b X  c 0,
причем знак равенства нужно набрать как жирный (<Ctrl>+<=> ) (с
помощью такого набора уравнение остается похожим внешне на публикуемые в литературе, а внутренне вводится различие между обычным
знаком равенства (используемым в Mathcad для вывода значений переменных) и знаком равенства в уравнениях. Охватите всё уравнение синим контуром, затем введите символьный знак равенства (<Ctrl>+<Shift>+
<точка>). В появившийся слот введите ключевое слово solve («реши») и
через запятую рядом – идентификатор искомой переменной (Х) и щелкните левой кнопкой мыши где-нибудь вне выражения. Получится «живая»
формула, автоматически реагирующая на вносимые изменения (естественно, ответ имеет форму вектора, т. к. квадратное уравнение имеет два решения; каждое решение записано в «своем» элементе вектора-ответа):




 1   b  b2  4 a c
 2 a 
2
a X  b  X  c 0 solve  X  



 1 
2
 2 a   b  b  4 a c



1 

 2  



2 



1
Пример 2. Решение системы уравнений в режиме live symbolic.
Сформируйте слоты для вектора (можно через Меню Insert – Matrix,
лучше (быстрее) с помощью клавиш <Ctrl>+<M>), укажите число строк
(rows) 2, число столбцов (columns) 1. В появившуюся «заготовку» для
вектора введите строки системы уравнений, используя жирный знак равенства (<Ctrl>+<=> ):
 2 X2  3 Y 10 


 7 X  19 Y 14 
Охватите весь вектор с уравнениями синим контуром, затем введите
символьный знак равенства (<Ctrl>+<Shift>+<точка>). В появившийся слот введите ключевое слово solve («реши») и через запятую рядом –
130
вектор идентификаторов искомых переменных  X  и щелкните левой
Y 


кнопкой мыши где-нибудь вне выражения. Получится «живой» ответ в
форме матрицы с решением, автоматически реагирующий на вносимые
изменения.
14.4.2. Опция Symbolics – Variable – Differentiate служит для дифференцирования в символьной форме. Как и в описанных выше позициях,
возможно однократное («мертвое») дифференцирование путем выделения переменной, по которой ищется производная, и использования позиций меню, а также возможен режим live symbolic, в котором переменная
дифференцирования обозначается ПРОПИСНЫМИ литерами. Покажем
это на примерах 1 и 2.
Пример 1. Нахождение первой производной. Введите шаблон производной из Меню View –Toolbars – Math – иконка «интеграл» или (лучше и быстрее) используйте клавиши <Shift>+<?>. В слоты шаблона введите выражение, подлежащее дифференцированию. Получится:
2
d X
a  sin ( X)
dX
Охватите всё выражение вместе с обозначением производной синим
контуром, затем введите символьный знак равенства (<Ctrl>+<Shift>+
<точка>) и щелкните левой кнопкой мыши где-нибудь вне формулы.
Получится «живой» ответ, автоматически реагирующий на вносимые изменения:
2
X
2
X
d X
a  sin( X)  a  ln( a)  sin( X)  2 a  sin( X)  cos ( X)
dX
Операция дифференцирования пригодится Вам при выполнении индивидуальных заданий по дисциплине «Математический анализ» для
проверки результатов Ваших выкладок.
Пример 2. Нахождение производных высших порядков. Введите
шаблон производной порядка выше первого из Меню View – Toolbars –
Math-иконка «интеграл» или (лучше и быстрее) используйте клавиши
<Ctrl>+ <Shift>+<?>. В слоты шаблона введите выражение, подлежащее
дифференцированию. Получится:
d
3
3
X
a  sin ( X)
dX
Охватите всё выражение вместе с обозначением производной синим
контуром, затем введите символьный знак равенства (<Ctrl>+<Shift>+
131
<точка>) и щелкните левой кнопкой мыши где-нибудь вне формулы.
Получится «живой» ответ, автоматически реагирующий на вносимые изменения:
d
3
3
X
X
3
X
2
X
X
a  sin ( X)  a  ln( a)  sin ( X)  3 a  ln( a)  cos ( X)  3 a  ln ( a)  sin ( X)  a  cos ( X)
dX
14.4.3. Опция Symbolics – Variable – Integrate служит для интегрирования в символьной форме. Как и в описанных выше позициях, возможно однократное («мертвое») интегрирование путем выделения переменной, по которой ищется интеграл, и использование позиций меню, а
также возможен режим live symbolic. Рассмотрим 2 примера – один в режиме «мертвого» результата, другой – в режиме live symbolic.
Пример 1. Нахождение неопределенного интеграла. Введите выражение:
 x
e
 cos    x,
щелчком левой кнопки мыши выделите переменную интегрирования x,
таким образом,
 x
e
 cos    x
а затем используйте позиции Меню Symbolics –Variable – Integrate.
Получится:


 exp    x  cos    x 
 exp   x  sin   x
2  2
2  2
Охватите полученное выражение синим контуром и упростите (Меню Symbolics – Simplify), получится компактная красивая формула:
   cos    x    sin   x 
exp    x 
2  2
Пример 2. Нахождение определенного интеграла в режиме live symbolic. Образуйте шаблон интеграла из Меню View – Toolbars – Math –
иконка «интеграл» или (лучше и быстрее) используйте клавиши
<Shift>+<&> (значок конкатенации, над цифрой 7 в верхней части клавиатуры). В слоты шаблона введите выражение, подлежащее интегрированию:






2
x
e
2
0
dx
.
Напоминание: знак «бесконечность» – на вкладке Calculus из Меню View –Toolbars –
Math – иконка «интеграл».
132
Охватите всё выражение вместе с обозначением интеграла синим
контуром, затем введите символьный знак равенства (<Ctrl>+<Shift>+
<точка>) и щелкните левой кнопкой мыши где-нибудь вне формулы.
Получится «живой» ответ:






2
x
e
0
2
1
dx 
1
2
 2 
2
.
Возможности символьных вычислений не исчерпываются описанными. Вы можете просмотреть и другие позиции меню Symbolics.
§15. Учебная задача
15.1. Постановка задачи
Mathcad, в отличие от текстового редактора Word или графического
редактора Paint, требует не только (и не столько!) умения находить нужные
опции и нажимать нужные клавиши. Необходимо наличие алгоритмического мышления, позволяющего составить и реализовать схему решения.
Чтобы проиллюстрировать это, решим довольно сложную задачу.
Не поленитесь проделать весь путь от постановки задачи до полного ее
решения. Это будет маленькой иллюстрацией к объему и сложности исследований, которые Вам придется часто делать при изучении естественнонаучных и профессиональных дисциплин.
ДАНО: радиус окружности r, координаты ее центра c1 (абсцисса) и c2
(ордината), параметры a и b уравнения прямой линии.
ПОЛУЧИТЬ: координаты пересечения окружности с прямой в
функции от параметров задачи (a, b, r, c1, c2) и указать, при каких соотношениях этих параметров задача имеет решение.
15.2. Этапы решения (не только этой задачи, но и любой другой):
1. Обдумывание задачи.
2. Составление словесного описания алгоритма.
3. Формализация задачи.
4. Решение.
5. Графическое построение и проверка.
15.3. Выполнение этапа 1 «Обдумывание задачи» (без компьютера)
Работа над задачей начинается с ее обдумывания. По шутливому закону «[Время на обдумывание задачи до выхода на компьютер] + [Время
работы за компьютером] = const» затраты времени на обдумывание всегда
133
рентабельны. Мы понимаем, что задача не всегда имеет решение: может
оказаться, что окружность и прямая вовсе не пересекаются. На рис. 4.1 показаны два случая: а) – решение существует, б) – решение не существует.
Рис. 4.1. Графическая иллюстрация к постановке задачи:
(а) решение задачи существует; (б) решения отсутствуют.
Кроме того, ясно, что если решение существует, то могут быть либо
2 точки пересечения, либо одна (если прямая касается окружности).
Выполнение этапа 1 завершено.
15.4. Выполнение этапа 2 «Составление словесного описания
алгоритма» (без компьютера).
Словесное описание алгоритма:
1. Составить уравнение окружности с параметрами (радиус окружности r, координаты ее центра c1 (абсцисса) и c2 (ордината)).
2. Составить уравнение прямой линии с параметрами a и b.
3. Составить систему уравнений для точек пересечения (эти точки
должны удовлетворять как уравнению окружности, так и уравнению
прямой, см. рис. 4.1-а).
4. Решить эту систему уравнений в символьной форме, получить ответ в виде координат двух точек пересечения.
5. Проанализировать решение. По смыслу задачи (рис. 4.1-б) в решение должны войти элементы, показывающие, что решение может не существовать. Зная уравнение окружности, догадываемся, что эти элементы
будут входить в формулу под корнем, извлечение которого возможно
только в том случае, если подкоренное выражение неотрицательно.
6. Находим соотношение между параметрами задачи (a, b, r, c1, c2),
при которых подкоренное выражение будет положительным. При выполнении этого соотношения задача будет иметь 2 различных решения (прямая линия пересечет окружность в двух точках).
134
7. Находим соотношение между параметрами задачи (a, b, r, c1, c2),
при которых подкоренное выражение будет равно 0. При выполнении
этого соотношения задача будет иметь одно решение (прямая линия коснется окружности в одной точке).
8. Находим соотношение между параметрами задачи (a, b, r, c1, c2),
при которых подкоренное выражение будет отрицательным. При выполнении этого соотношения задача не будет иметь решений (прямая линия
не пересекает окружность).
Выполнение этапа 2 завершено.
15.5. Выполнение этапа 3 «Формализация задачи» (на компьютере)
Порядок действий следует пунктам 1, 2, 3 алгоритма, разработанного
на этапе 2.
15.5.1. Выполнение пунктов 1, 2 алгоритма: составление уравнений окружности и прямой линии. Из курса математики известно уравнение прямой Y = aX + b (параметр a характеризует наклон прямой по
отношению к абсциссе X, а параметр b показывает, на какой отметке
прямая линия пересекает ординату Y при X = 0). Также из курса математики известно уравнение окружности (X–c1)2 + (Y–c2)2 = r2 (параметры
c1 и c2 – координаты центра окружности, параметр r – ее радиус).
15.5.2. Выполнение пункта 3 алгоритма: составление системы
уравнений для точек пересечения (эти точки должны удовлетворять
как уравнению окружности, так и уравнению прямой, см. рис. 4.1-а).
Составляем вектор, компонентами которого будут эти выражения
(аналогично примеру 2 п. 14.4.1). Помним, что уравнения нужно записать
с использованием жирного знака равенства <Ctrl>+<=>.
Образуйте «заготовку» для ввода вектора уравнений (можно через
Меню Insert – Matrix, лучше (быстрее) с помощью клавиш <Ctrl>+<M>),
укажите число строк (rows) 2, число столбцов (columns) 1. В появившуюся
«заготовку» для вектора введите строки системы уравнений, используя
жирный знак равенства (<Ctrl>+<=> ). Должно получиться:
( Y  a X  b ) 0


2
2
2
  X  c 1  Y  c 2  r 0 


(4.1)
Набор c1 и c2 – через так называемую КОСМЕТИЧЕСКУЮ точку.
Здесь цифры 1 и 2 – не индексы, а просто запись идентификатора в форме, принятой в научной литературе: вместо c1 записываем c1 для красоты. Набираем так: с (точка) 1, при этом каретка смещается на 0.5 межстрочного интервала. НЕ НУЖНО ПУТАТЬ с индексом, который набирается с помощью квадратной скобки [.
Напоминание: для набора показателя степени используйте клавиши <Shift>+<6> (клавиша 6 – в верхнем ряду, где ^).
Выполнение этапа 3 завершено.
135
15.6. Выполнение этапа 4 «Решение» (на компьютере)
15.6.1. Выполнение пункта 4 алгоритма: решение системы уравнений, определяющих координаты точек пересечения, получение ответа в символьном виде (в виде формул для расчета координат двух точек
пересечения по заданным параметрам прямой (a, b) и окружности (c1, c2, r)).
После этого делайте так, как в примере 2 п. 14.4.1 описания символьных вычислений. Кратко:
 Охватите синим контуром ф-лу (4.1);
 Введите символьный знак равенства клавишами <Ctrl>+
<Shift>+<точка>;
 В слот введите через запятые запрос на решение и перечень искомых переменных solve,X,Y и щелкните левой кнопкой мыши гденибудь вне формулы.
Ответ, который Вы увидите, будет огромным. Мы видим, что он
представлен в форме матрицы размера 22.
136
Первый столбец ответа выглядит так:
(4.2 а)
137
второй столбец ответа выглядит так:
(4.2 б)
«Расшифруем» ответ Mathcad. Верхняя строка даст абсциссу (элемент матрицы с индексами 0,0) и ординату (элемент матрицы с индексами 0,1) первой точки пересечения, а вторая – то же для второй точки
(элементы матрицы с индексами 1,0 и 1,1):
Элемент 0,0
Элемент 0,1
Элемент1,0
Элемент1,1
.
Нужно привыкнуть, что нумерация элементов массива в Mathcad следует американскому стилю (не с 1, а с нуля!).
Просмотрите полученный ответ. А теперь представьте, сколько
ошибок в выкладках Вы сделали бы, если бы выводили такое выражение
вручную!
15.6.2. Выполнение пункта 5 алгоритма: анализ решения.
1) Подготовительные операции. Скопируйте ответ (только ответ!)
целиком: охватите его синим контуром, затем используйте иконку «копия» или лучше (быстрее) нажмите <Ctrl>+<C>. Копия будет передана в
буфер для хранения и для последующего использования.
Присвойте скопированной матрице какой-либо идентификатор
(например, Z – прописная литера), нажмите <двоеточие> и в появившийся слот введите копию из буфера (либо иконкой «извлечь из буфера»,
либо нажмите <Ctrl>+<V>). Получится (формула приведена не полностью, из-за своего большого размера):




2
Z  



 2

a
a
1
2
1
2

1

1


2
2
2 2
2
2
  2 a b  2 c 2 a  2 c 1  2  2 a b  c 1  2 c 2 a c 1  a  c 1  …
a  r  c 2  b  2 c 2 b  r




2
2
2 2
2
2
  2 a b  2 c 2 a  2 c 1  2  2 a b  c 1  2 c 2 a c 1  a  c 1  …
a  r  c 2  b  2 c 2 b  r


(4.3)
Итак, мы заготовили матрицу, в которой записан ответ задачи: координаты точек пересечения окружности и прямой линии.
2) Нахождение фрагментов формул, по которым можно установить, имеется ли решение. Как указывалось в описании алгоритма, по
смыслу задачи (рис. 4.1-б) в решение должны войти элементы, показывающие, что решение может не существовать. Мы видим, что в каждом
из элементов матрицы Z имеется одинаковое выражение в форме квадратного корня:
1
 2 a b c  2 c  a c  a2 c 2  a2 r2  c 2  b2  2 c  b  r2 
1
2
1
1
2
2


138
2
(4.4)
Из курса элементарной математики Вы знаете, что извлечение корня
возможно только в том случае, когда подкоренное выражение неотрицательно. Следовательно, для того чтобы гарантировать наличие решения,
нужно, чтобы соотношение параметров задачи (a, b, c1, c2, r) было таким,
чтобы подкоренное выражение было неотрицательным.
15.6.3. Выполнение п. 6, 7, 8 алгоритма: нахождение соотношения
между параметрами задачи (a, b, r, c1, c2), при которых подкоренное
выражение будет:
 Положительным. При выполнении этого соотношения задача будет иметь 2 различных решения (прямая линия пересечет окружность в
двух точках).
 Нулевым. При выполнении этого соотношения задача будет иметь
2 различных решения (будут получены 2 варианта прямых линий, каждая из которых будет касаться окружности в одной точке на противоположных концах диаметра окружности).
 Отрицательным. При выполнении этого соотношения задача не
будет иметь решения (прямая линия не пересечет окружность).
1) Предварительные замечания. Мы видим, что граница между областью параметров, в которой отсутствует решение, и областью, в которой прямая линия пересекает окружность в двух точках, проходит через
соотношение, в котором подкоренное выражение равно 0.
 2 a b c  2 c  a c  a2 c 2  a2 r2  c 2  b2  2 c  b  r2  0 (4.5)
1
2
1
1
2
2


Таким образом, решение вопроса о существовании точек пересечения прямой линии и окружности свелось к простой задаче: выразить один
из параметров (любой) через все другие так, чтобы подкоренное выражение получилось равным нулю.
2) Формула, связывающая один из параметров (a, b, r, c1, c2) задачи
через остальные параметры, при которых подкоренное выражение равно 0. Выберем один из параметров (например, b) и выразим его через
остальные (a, r, c1, c2), с использованием символьного решения уравнения
подкоренное выражение = 0.
Действуем так, как в примере 1 п. 14.4.1 описания символьных вычислений. Кратко:
 Наберите формулу (4.5) ОБЯЗАТЕЛЬНО через жирный знак равенства (<Ctrl>+<=>).
 Введите символьный знак равенства клавишами <Ctrl> + <Shift>
+ <точка>;
 В слот введите через запятые запрос на решение и перечень искомых переменных solve,b и щелкните левой кнопкой мыши где-нибудь
вне формулы).
139
Должно получиться так:
(4.6)
3) Ответы.
а) Условия, при которых прямая линия касается окружности. Из
геометрических соображений ясно, что таких прямых линий будет две:
одна коснется окружности «сверху», а другая – «снизу», на противоположном конце диаметра, проходящего через первую точку касания.
Введите идентификатор функции b1(a, c1, c2, r) для обозначения
функциональной зависимости параметра b от других параметров (a, c1, c2,
r), нажмите двоеточие и в появившийся слот введите копию первого
элемента вектора-решения (это будет условием касания прямой линии
окружности «сверху»). Копию делайте так: охватите нужную часть формулы синим контуром, нажмите <Ctrl>+<C> (т. е. скопируйте ее в буфер), затем установите курсор в слот и извлеките копию из буфера (лучше всего – клавишами <Ctrl>+<V>).
Получится:
1

2

2
2
2
b1 a  c 1  c 2  r  a c 1  c 2  a  r  r
(4.7)
Затем введите другой идентификатор функции b2(a, c1, c2, r) ,
нажмите и двоеточие и в появившийся слот введите копию второго элемента вектора-решения (это будет условием касания прямой линии
окружности «снизу»).
Получится:
1

2

2
2
2
b2 a  c 1  c 2  r  a c 1  c 2  a  r  r
(4.8)
Функции b1(a, c1, c2, r) и b2(a, c1, c2, r) отличаются знаком перед корнем.
Таким образом, ответом на вопрос о касании окружности прямой
линией будет:
ЕСЛИ [b = b1(a, c1, c2, r)] ИЛИ [b = b2(a, c1, c2, r)] ТО прямая касается
окружности.
(4.9)
140
б) Условия, при которых прямая линия не пересекает окружность.
Параметр b в уравнении прямой линии показывает, на какой отметке прямая линия пересекает ординату, когда абсцисса равна нулю, см. п. 15.5.
Значения b1(a, c1, c2, r) и b2(a, c1, c2, r) определяют граничные значения
этой отметки: если прямая линия пересекает ординату выше отметки
b1(a, c1, c2, r) или ниже отметки b2(a, c1, c2, r), то она проходит выше или
ниже окружности, не пересекая ее.
Таким образом, ответом на вопрос об отсутствии пересечения
окружности и прямой будет:
ЕСЛИ [b > b1(a, c1, c2, r)] ИЛИ [b < b2(a, c1, c2, r)] ТО пересечение отсутствует.
(4.10)
в) Условия, при которых прямая линия пересекает окружность в
двух точках. Если прямая линия пересекает ординату ниже отметки b1(a,
c1, c2, r) и выше отметки b2(a, c1, c2, r), то она проходит через точки внутри и пересекает ее в двух точках.
Таким образом, ответом на вопрос об отсутствии пересечения
окружности и прямой будет:
ЕСЛИ [b < b1(a, c1,c 2, r)] И [b > b2(a, c1,c 2, r)] ТО пересечение в двух
точках .
(4.11)
Выполнение этапа 4 завершено.
15.7. Выполнение этапа 5 «Графическое построение и проверка»
(на компьютере)
15.7.1. Идея проверки правильности вычислений. Представим себе,
какой результат мы ожидали бы увидеть на графике, показывающем
окружность и касающиеся ее прямые. ТАКОЕ ПРЕДЧУВСТВИЕ
РЕЗУЛЬТАТА ВСЕГДА ПОЛЕЗНО! Если задаться значениями параметров (a, c1, c2, r), а затем вычислить b1(a, c1, c2, r), то прямая линия a x +
b1(a, c1, c2, r) коснется окружности в одной из точек. Если при тех же параметрах (a, c1, c2, r) вычислить b2(a, c1, c2, r), то прямая линия ax +
b2(a, c1, c2, r) коснется окружности в точке на противоположном конце
диаметра, проходящего через первую точку. Обе эти касательные будут
параллельными (т. к. у них одинаковый угол наклона, определяемый параметром a).
15.7.2. Реализация идеи.
1) Сначала проверим, правильно ли мы определили координаты точек касания. Мы уже выполнили необходимые расчеты: координаты
находятся в массиве Z (формула (4.3)), осталось только обозначить ответ
как функцию переменной b. Для этого просто подправьте (не набирайте
снова!) формулу (4.3): запишите слева Z(b) вместо Z.
141
Получится (формула приведена не полностью, из-за своего большого
размера):
c1  2




2
Z( b )  



 2

a
1
2
1
c2  4

1
a2  1
r  10
a  0.5


2 2
2 2
2
2
  2 a b  2 c2 a  2 c1  2  2 a b  c1  2 c2 a c1  a  c1  a  r  c2  b  2




2 2
2 2
2
2
  2 a b  2 c2 a  2 c1  2  2 a b  c1  2 c2 a c1  a  c1  a  r  c2  b  2


… (4.12)
Мы выводили ф-лу (4.3) для определения координат двух точек пересечения окружности прямой линией. Пока прямая проходит через точки внутри окружности, таких точек действительно будет две, и они
должны иметь различные координаты. Если прямую смещать так, как показано стрелкой на рис. 4.2, то точки пересечения будут сближаться, а затем сольются в одну (это и будет точкой касания), и их координаты будут
одинаковыми.
Проверим, получились ли одинаковые числа
в строках матрицы (4.12). Наберите
Z b2 a  c 1 c 2 r 
Z b1 a  c 1 c 2 r 
и
.
Если окажется, что первая и вторая строки у каждой матрицы одинаковые, то это убедит Вас в
правильности нахождения точек касания.
 

 

2) Реализация проверки с помощью графика.
Построим график и укажем на нем не только
окружность и касательные к ней (если получатся
правильно), но и координаты точек касания.
Фаза 1 построения графика. Для построения графика нужно
научиться строить окружность. Это можно сделать разными способами,
самый простой из которых – использовать параметрическое представление окружности:
Задаться значениями угла поворота радиуса окружности вокруг центра в пределах от 0 до 2:
  0 0.01 2 
(это и будет один из наших параметров; второй параметр – радиус
окружности).
Абсцисса с учетом того, что координаты центра окружности равны
Рис. 4.2. Сближение точек
пересечения.
142
(с1, с2), вычисляется так:
r cos    c 1
(эту формулу не набирайте, покажем ее прямо на графике).
Ордината с учетом того, что координаты центра окружности равны
(с1, с2), вычисляется так:
r sin   c 2
(эту формулу тоже не набирайте, покажем ее прямо на графике).
Теперь образуйте шаблон графика (можно из меню Insert – Graph –
XY plot; лучше (быстрее) клавишами <Shift>+<2>) и в слоты абсциссы и
ординаты впишите формулы, как показано на рис. 4.3-а.
а)
б)
Рис. 4.3. Начальный этап построения графика для проверки правильности расчетов:
а) график окружности, б) отметка центра окружности.
Приведите график к надлежащему виду, введя нужные опции щелчком мыши по полю графика: нанесите сетку (опция XY-axes, включите
Grid lines, отключите AutoGrid и введите число градаций сетки –
например, 4 на каждой из осей); перейдите к «русской» форме указания
координат (опция XY-axes, кнопка Crossed). Добейтесь, чтобы график
выглядел так, как на рис. 4.3.
Укажите (точкой) центр графика. Для этого введите дополнительные
координаты (как на рис. 4.3-б). Способ ввода: охватите уже имеющуюся
подпись оси синим контуром и нажмите запятую. Появится новый слот, в
который можно ввести новые координаты. Укажите, что вывод нужно
сделать точкой. Для этого щелчком мыши вызовите опции графика, выберите вкладку Traces (линии графика), перейдите ко второй строке
(trace 2), откройте список типов Types (типы линий) и выберите points
(точки). В списке Width (ширина) выберите 3, в списке Color выберите
143
цвет, какой хотите. Нажмите OK. Должно получиться как на рис. 4.3-б.
Фаза 1 построения графика завершена.
Фаза 2 построения графика. Представим графически прямые, которые (как мы предполагаем) должны касаться окружности в двух точках
по разные стороны диаметра. Для этого введем диапазон и шаг изменения аргумента x:
x  r  c 1 r  c 1  0.01 r  c 1
(4.13)
Напоминание: многоточие наберите с помощью клавиши <точка_с_запятой>.
Обратите внимание на то, что при определении диапазона возможных
изменений аргумента нужно учитывать координаты центра окружности!
Затем образуем два дополнительных слота по осям абсцисс и ординат (охватите синим контуром «старый» аргумент, затем нажмите клавишу <запятая>). В эти слоты введем уравнения касательных, приведенных в п. 15.7.1. Должно получиться так, как показано на рис. 4.4.
Рис. 4.4. Проверка правильности нахождения уравнений касательных к окружности.
Замечание: график имеет функцию автоматического масштабирования, в результате
окружность может принять форму эллипса. Растяните график так, чтобы устранить искажение.
Фаза 2 построения графика завершена.
Фаза 3 построения графика. Покажем на графике точки касания
(для проверки, правильно ли мы их рассчитали). Все необходимые вычисления уже сделаны, см. формулу (4.12). Осталось в качестве аргумента b указать b1(a, c1, c 2, r) и b2(a, c1,c 2, r), а в слотах абсциссы и ординаты указать соответствующие элементы матрицы Z(b). Как уже упоминалось, нумерация элементов – с нулевого.
Образуйте еще два слота на осях графика и впишите в них координа144
ты точек касания. Опции для этих координат: тип (Types) – точки
(points), толщина (Weight) – не менее 3. Должно получиться так, как показано на рис. 4.5. Номера элементов набирайте так: после набора идентификатора матрицы, например, Z(b1(a, c1, c2, r)) охватите его синим контуром, нажмите клавишу <открывающая квадратная скобка – [> и в появившийся слот впишите номер элемента матрицы – как на рис. 4.5.
Фаза 3 построения графика завершена.
Построенный график показывает, что в вычислениях нет грубых
ошибок, график соответствует нашим интуитивным представлениям о
результате: прямые линии действительно касаются окружности, координаты точек касания находятся по разные стороны диаметра. Но проверка
по графику, хотя и очень полезная, не обладает достаточной точностью и,
главное, общностью (не защищена от случайных совпадений). Для чистоты ответа сделаем еще одну, более точную проверку.
Рис. 4.5. Проверка правильности нахождения координат точек касания.
3) Проверка правильности расчета вычислениями. Идея проверки
состоит в ответах на два вопроса:
1. Действительно ли обе точки касания лежат на одной прямой?
2. Действительно ли эта прямая проходит через центр окружности?
Важное замечание: непосредственно для решения задачи ответ на
эти вопросы не нужен. Такие (казалось бы) лишние вычисления
служат ловушкой для логических ошибок. Ловушки в форме про145
верки выполнения некоторых тождеств, равенств и т. п. полезно
вставлять в программы. Академик А. П. Ершов, много сделавший
для развития науки программирования, назвал такие ловушки
УТВЕРЖДЕНИЯМИ и настаивал на их огромном значении для
обнаружения и исправления логических ошибок – наиболее трудно обнаруживаемых ошибок в алгоритмах, не проявляющих себя в
переполнениях, делении на нуль и прочих действиях, обнаруживаемых компьютером без участия программиста. К сожалению, иногда при наличии логической ошибки результат расчета получается
внешне правдоподобным, и программист может посчитать свою
задачу выполненной. Но при использовании других исходных
данных ответ будет абсолютно неверным! Если программа используется для принятия решения или для управления производством, результат логической ошибки может оказаться катастрофическим (ошибка такого рода привела к гибели космического корабля и к Чернобыльской трагедии).
Перейдем к реализации идеи проверки-ловушки по следующей схеме:
1. Составим уравнение прямой линии, проходящей через две точки:
через центр окружности и через одну из точек касания.
2. Подставим в это уравнение координаты второй точки касания.
3. Если окажется, что координаты второй точки удовлетворяют
уравнению – расчеты выполнены правильно, логическая ошибка, скорее
всего, отсутствует.
Уравнение прямой Y(X), проходящей через две точки с координатами [x1; y(x1)], [x2; y(x2)] имеет вид:
X  x1
x2  x1
 
y  x 2  y x 1
Y( X)  y x 1
(4.14)
Подставим в (4.14) в качестве первой точки [x1; y(x1)] координаты
центра окружности [c1; c2], а в качестве второй точки [x2; y(x2)] – координаты одной из точек касания, например: [Z(b1(a, c1, c2, r))0,0 ; Z(b1(a, c1,
c2, r))0,1]. В качестве точки с координатами [X;Y(X)], предположительно
лежащей на прямой (4.14), возьмем вторую точку касания с координатами [Z(b2(a, c1, c2, r))0,0 ; Z(b2(a, c1, c2, r))0,1 ].
Ели логической ошибки в наших расчетах нет, то после подстановки
разность между правой и левой частями (4.14) будет равна нулю.
Проверяем. После набора разности наберите знак равенства (обычный) и посмотрите, действительно ли в ответе получился нуль. Желаю
удачи!
Z b2 a  c 1 c 2 r 0  0  c 1 Z b2 a  c 1  c 2  r 0  1  c 2

0
Z b1 a  c 1 c 2 r 0  0  c 1 Z b1 a  c 1  c 2  r 0  1  c 2
(4.15)
 
 


 
 
146


Напоминание: чтобы перейти к набору индексов, нужно нажать клавишу <квадратная
открывающая скобка [>.
4. Иллюстрацию условий наличия (4.10) и отсутствия (4.11) пересечения окружности и прямой легче всего провести, копируя рис. 4.5 и
«подправляя» значение аргументов в уравнениях прямых линий.
а) Для того чтобы проиллюстрировать отсутствие пересечения, введите:
a x + b1(a, c1,c 2, r)+2 вместо a x + b1(a, c1,c 2, r);
a x + b2(a, c1,c 2, r) – 2 вместо a x + b2(a, c1,c 2, r).
Должно получиться так, как показано на рис. 4.6.
Рис. 4.6. Проверка правильности нахождения условий отсутствия пересечений.
б) Для того чтобы проиллюстрировать наличие пересечений, скопируйте рис. 4.6 и введите:
a x + b1(a, c1,c 2, r) – 2 вместо a x + b1(a, c1,c 2, r) + 2;
a x + b2(a, c1,c 2, r) + 2 вместо a x + b2(a, c1,c 2, r) – 2.
Должно получиться так, как показано на рис. 4.7.
147
Рис. 4.7. Проверка правильности нахождения условий наличия пересечений.
§16.
Создание анимационных клипов
16.1. Общие сведения
Дополним графическую часть анимацией. Создадим анимационный
клип, в котором покажем перемещение прямой линии из области, в которой отсутствует пересечение с окружностью, в область, где пересечение
снова отсутствует. Параметр b в уравнении прямой линии будет изменяться от значения b2(a, c1, c2, r) – 2 (пересечения еще нет) до значения
b1(a, c1, c2, r) + 2 (пересечения уже нет). Разобьем весь интервал изменения параметра b, b2(a, c1,c 2, r) – 2  b  b1(a, c1,c 2, r) + 2 на части (пусть
их будет 50). Введем системную переменную (в Mathcad она называется
FRAME, записывается прописными литерами). Эта переменная будет в
каждом кадре анимации придавать новое значение параметру b. Диапазон
ее изменения зададим от 0 до 50, тогда параметр b «пробежит» по всему
диапазону, b2(a, c1,c 2, r) – 2  b  b1(a, c1,c 2, r) + 2.
Запишем уравнение прямой линии с параметром FRAME:




g( x)  a x   b2 a  c 1 c 2 r  2 
b1a  c 1 c 2 r  4  b2a  c 1 c 2 r
50


 FRAME
(4.16)
Из (4.16) видно, что при FRAME = 0 параметр b = b2(a, c1,c 2, r) – 2;
148
при FRAME = 50 параметр b = b1(a, c1,c 2, r) + 2.
Перейдем к созданию клипа. Его сценарий – перемещение прямой линии на фоне окружности за счет изменения параметра FRAME от 0 до 50.
16.2. Фазы создания анимационного клипа
Фаза 1 создания анимационного клипа. Образуйте рисунок, на осях которого покажите аргументы окружности и прямой линии – как на рис. 4.8.
Обязательно отключите опцию автоматического масштабирования – иначе анимационный образ будет «прыгать» от масштаба к масштабу при
каждом новом кадре. Для этого щелкните левой кнопкой мыши по графику, сотрите верхние и нижние пределы в слотах осей и введите туда
«принудительные» значения – например, 25 (на рис. 4.8 обведены). Прямая линия разместится так, как будто FRAME = 0. Нанесите линии сетки,
введите «русский» вариант размещения осей.
Рис. 4.8. Подготовка к созданию анимационного клипа.
Фаза 1 завершена.
Фаза 2 создания анимационного клипа. Из меню View (вид) вызовите
позицию Animate. Появится окно анимации.
Рис. 4.9. Окно анимации с введенным диапазоном изменения параметра FRAME.
149
Разместите его так, чтобы оно не загораживало рисунок (протащите
мышью за верхнюю синюю полосу). В окне Вы увидите окошки для ввода диапазона изменения параметра FRAME: For FRAME From  To .
В первое окошко введите 0, во второе 50. Должно получиться так, как
показано на рис. 4.9.
Пользуясь левой кнопкой мыши, охватите область графика, который
будет показан в клипе, пунктиром, как показано на рис. 4.10.
Рис. 4.10. Указание области графика для анимации.
Фаза 2 завершена.
Фаза 3 создания анимационного клипа. Включите кнопку Animate
(справа в окне анимации). Вы увидите постепенную смену кадров и значение, которое при этом принимает переменная FRAME (рис. 4.11).
Рис. 4.11. Процесс создания клипа.
Фаза 3 завершена.
После того, как значение переменной FRAME станет равным 50,
процесс создания клипа завершится. Появится окно воспроизведения
150
(рис. 4.12), и можно будет увидеть, как прямая линия пройдет через область точек окружности.
Рис. 4.12. Воспроизведение анимационного клипа.
Замечание: можно записать клип для воспроизведения (независимо от среды
Mathcad). Файл автоматически получит расширение видео-файлов *.avi. Для записи используется кнопка Save As окна анимации (рис. 4.9).
Этап 5 завершен.
Решение задачи завершено.
Комментарии: обратите внимание на то, что символьная математика Mathcad помогла
нам найти не одно, а два решения. Одному и тому же набору параметров (a, c1, c 2, r) соответствуют два варианта параметра b в уравнениях прямых (прямые располагаются симметрично, по разную сторону диаметра). Вначале, при обдумывании задачи (этап 1), мы выпустили из виду тот факт, что найдутся две, а не одна касательная к окружности. Оказалось,
что мощный программный продукт Mathcad помог нам сделать маленькое открытие!
Mathcad умного человека всегда сделает умнее (а глупого, к сожалению, всегда сделает
глупее).
151
Список использованной литературы
1. Дьяконов В. П. Энциклопедия Mathcad 11i и Mathcad 11. – С. -Пб.: Солон-Р, 2004,
– 832 с.
2. Кирьянов Д. В. Самоучитель Mathcad 2001. – С.-Пб.: – Изд-во BHV, 2001.
3. Сдвижков О. А. Mathcad-2000: введение в компьютерную математику. – М.: Издательский дом Дашков и К, 2002. – 204 с.
4. http://geg.chem.usu.ru/lacomet/MathCad/TUTORIAL/Intro_Mcad.htm Mathcad –
Учебник. Разработан научно-учебной лабораторией компьютерных методов физической
химии Уральского государственного университета.
5. http://www.karelia.ru/psu/Chairs/IMO/Complex/aboutwri_a.htm Электронное учебное пособие «Численные методы с системой Mathcad», разработано кафедрой информатики
и математического обеспечения Петрозаводского государственного университета, авторы
Сиговцев Г. С., Чарута М. А. и др.
6. http://www.grsu.by/exponenta/soft/Mathcad/ Математический сайт Exponenta.ru,
раздел Mathcad.
152
153
Приложение 1
ПРИЕМЫ РАБОТЫ С MATHCAD (краткий справочник)
№
Наименование
153
1
Курсор
2
Объекты
MathCAD,
операции с ними
Пояснения
Так будет на экране
1. Общие приемы
Указывает позицию ввода с
клавиатуры.
Перемещается клавишами
ENTER и стрелочными клавишами
Формула или ее часть
Группа объектов для проведения общих действий (перемещение, копирование, удаление…).
Копировать: <Ctrl>+<C>
Вырезать: <Ctrl>+<X>
Вставлять из буфера:
<Ctrl>+<V>
Так нужно набирать
Щелчком левой кнопки
мыши
Охват синим контуром появляется автоматически.
При необходимости область
охвата расширяется клавишей ПРОБЕЛ
Обводка контура мышью
при нажатой левой кнопке
мыши. После этого можно
копировать, перетаскивать
мышью, удалять
169
Продолжение прилож. 1
№
3
Наименование
Идентификаторы
простых переменных
154
4
Греческие буквы
5
Операция присваивания
6
Операция присваивания глобального значения
Пояснения
Латинские, греческие или русские буквы, цифры. Можно показать часть идентификатора
на 0.5 строки ниже (для красоты). Строчные и прописные литеры различаются
Часто используются как идентификаторы
Так будет на экране
X
x
R1
R1 (набор единицы через
«косметическую» точку. Это
НЕ индекс!)
 
Идентификатор : = значение
Область действия – правее
и/или ниже оператора присваивания, до строки присваивания этому оператору нового
значения
Идентификатор  значение
Область действия – весь лист
MathCAD, независимо от места
на листе, где это присваивание
осуществлено
R1 : = 12
X 15
170
Так нужно набирать
R точка 1
Ввести похожую латинскую
букву, затем нажать
<Ctrl>+<g>
Или из меню ViewToolbars-Greek
Клавишей
ДВОЕТОЧИЕ
Из меню View-ToolbarsEvaluation, иконка со знаком 
Продолжение прилож. 1
Наименование
Вставка текста
(комментариев)
8
Вставка формул в
текстовый регион
1
Знаки алгебраических
действий
Пояснения
В среде MathCAD можно создавать описания, методические указания, электронные
книги. Текст нужно вводить в
специальные области (называются text regions– текстовые
регионы)
Можно вписывать «живые»
формулы прямо в поясняющий
текст
Так будет на экране
Так нужно набирать
Нажать клавишу
КАВЫЧКИ и набирать
текст как обычно в текстовом редакторе.
Или из меню Insert-Text
Regions
Находясь в области текста,
из меню Insert-Math Region
155
№
7
2. Арифметические, алгебраические и логические операторы
Умножение

Деление
*
1/2
Возведение числа или матрицы
в степень
2^n
Извлечение корня
\
Абсолютное значение числа
171
Продолжение прилож. 1
№
Наименование
2 Знаки отношения
Пояснения
Больше или равно
Меньше или равно
Не равно
Так будет на экране
Равно (знак для уравнений,
условий…), жирный знак равенства
156
3
Число 
4
Число e (основание
натуральных логарифмов)
Комплексные числа
5
1
Присваивание области определения переменных
В расчетах MathCAD автоматически воспринимает  как
3.1415926
В расчетах MathCAD автоматически воспринимает e как
2.718281828
В MathCAD реализована алгебра комплексных чисел
Так нужно набирать
<Ctrl>+<)>
<Ctrl>+<(>
<Ctrl>+<3>
<Ctrl>+<=>

e, можно exp
Набрать латинскую букву p
(строчную) и нажать
<Ctrl>+<g>
Обычный набор латинских
букв
y : a <Ctrl>+<g> + 1i*b
<Ctrl>+<g>
1i набирается без пробела
3. Переменные с индексами
(элементы массива, область значений аргументов функций)
Определяется диапазон изменения переменной с указанием
шага. Если шаг не указать, то
по умолчанию MathCAD считает его равным 1
172
Идентификатор ДВОЕТОЧИЕ
начальное значение ЗАПЯТАЯ шаг ТОЧКА_С_ЗАПЯТОЙ конечное значение
Если нужен шаг, равный 1,
то Идентификатор ДВОЕТОЧИЕ начальное значение
ТОЧКА_С_ЗАПЯТОЙ конечное значение
Продолжение прилож. 1
№
Наименование
2 Индексы массива
3
Вывод таблицы значений элементов массива
157
Пояснения
Если массив – вектор, указывается только номер элемента.
Если массив двумерный или
массив является строкой, нужно указать два индекса. Нумерация индексов – с нуля
Массив выводится в форме
таблицы. Если таблица имеет
больше строк, чем принято по
умолчанию (15), автоматически
появляется линейка прокрутки
173
Так будет на экране
Так нужно набирать
Идентификатор
КВАДРАТНАЯ
ОТКРЫВАЮЩАЯ
СКОБКА [ индексы через
ЗАПЯТЫЕ
x ДВОЕТОЧИЕ 0
ЗАПЯТАЯ 0.1
ТОЧКА_C_ЗАПЯТОЙ 1
y(x) ДВОЕТОЧИЕ sin(x)
Продолжение прилож. 1
№
Наименование
1
Знаки операций математического анализа
Пояснения
Так будет на экране
4. Шаблоны операторов математического анализа
Шаблон производной
Шаблон неопределенного интеграла
Так нужно набирать
<Shift>+<?>
Или Меню View-ToolbarsCalculus -иконка со значком
производной
<Ctrl>+<i>
Или Меню View-ToolbarsCalculus -иконка со значком
интеграла
158
Шаблон определенного интеграла
<Shift>+<&>
Или Меню View-ToolbarsCalculus -иконка со значком
интеграла
Шаблон предела
<Ctrl>+<L>
Меню View-Toolbars- Calculus -иконка со значком lim
Шаблон суммы
<Ctrl>+<Chift>+<4>
Меню View-Toolbars- Calculus -иконка со значками 
174
Продолжение прилож. 1
№
1
Наименование
Знаки матричной алгебры
Пояснения
Так будет на экране
5. Шаблоны для матричной алгебры
Шаблон матрицы
Транспонирование
Так нужно набирать
<Ctrl>+<m> или меню Insert- Matrix. В окошке указать число строк (rows) и
столбцов (columns)
Идентификатор матрицы
охватить синим контуром,
нажать <Ctrl>+<1>
159
Выделение одного из столбцов
матрицы в форме вектора. Нумерация столбцов матрицы – с
нуля.
Набрать идентификатор
матрицы, затем
<Ctrl>+<^>
Длина вектора
Набрать идентификатор
вектора, затем <Shift>+ <|>
Определитель квадратной матрицы
Набрать идентификатор
матрицы, затем <Shift>+
<|>
175
Продолжение прилож. 1
№
Наименование
Пояснения
Так будет на экране
Так нужно набирать
6. Часто употребляющиеся функции
1
Тригонометрические
функции
sin(x), cos(x), tan(x) (тангенс). По умолчанию область определения тангенса – от


2
до 

2
, область определения функций синус и косинус – от 0 до 2
Логарифмы с заданным основанием
По умолчанию основание полагается равным 10
3
Экспоненциальная
функция
4
Условная функция
Для ее ввода не требуется задавать числовое значение основанию натуральных логарифмов
Выдает различные значения
(ОТВЕТ_1 или ОТВЕТ_2) в зависимости от выполнения или
невыполнения условия
160
2
Для набора степени используйте клавиши
<Shift>+<^>
В записи условий используются знаки отношения (жирный
знак равенства <Ctrl>+<=> и др.)
УСЛОВИЕ:
if(УСЛОВИЕ, ОТВЕТ_1, ОТВЕТ_2)
Условная функция начисления стипендии:
176
Продолжение прилож. 1
№
Наименование
5 Округление снизу
floor( ),
Сверху ceil( ) и отсечение
дробной части trunc( )
161
1
Минимальный и максимальный элемент
массива, матрицы,
вектора. Число строк
и столбцов в массиве
2
Единичная матрица
Пояснения
Округление снизу floor( ) и
сверху ceil( ) до ближайшего
целого числа.
Функция trunc( ) – отсечение
дробной части
Так будет на экране
Так нужно набирать
Функции floor( ) и trunc( ) возвращают одинаковые результаты только для положительных чисел
7. Функции для работы с матрицами и векторами
max(A), min(A)
Вывод значений – с помоrows(A) – число строк
щью обычного (нежирного)
cols(A) – число столбцов
знака равенства
Автоматически формируется
диагональная матрица с единицами в диагонали
Вывод матрицы на экран –
с помощью обычного (нежирного) знака равенства
177
Продолжение прилож. 1
№
Наименование
3 Собственные числа и
собственные векторы
квадратной матрицы.
Пример: найдем для
матрицы
162
4
Пояснения
Автоматически решается уравнение
Ax = x для собственных чисел
i , I = 1, … ,n матрицы А размерности nn. Автоматически
определяются собственные
нормированные векторы (единичной длины)
Так будет на экране
Объединение матриц «сверху вниз»: Получение единой
матрицы из двух:
Первая – верхний блок, вторая – нижний
178
Продолжение прилож. 1
№
Наименование
Пояснения
5 Объединение матриц «слева направо»: Получение единой матрицы из двух:
Первая – левый блок, вторая – правый
163
6
Так будет на экране
Вырезывание блока из матрицы. Получение новой матрицы – части исходной
179
Продолжение прилож. 1
№
1
Наименование
График плоскостной.
Пример: построить на
одном рисунке графики функций
Пояснения
Так будет на экране
8. Графики
Нужно задать область изменения аргумента функции. На одном графике можно показывать
разные функции одного или
разных аргументов.
График можно форматировать
щелчком левой кнопки мыши
по его полю
164
180
Продолжение прилож. 1
№
Наименование
2 График двумерный
Пример: построить на
одном рисунке графики функций
165
Пояснения
Нужно задать целочисленные
индексы, с помощью которых
образовать массивы данных о
значениях функций в ряде точек внутри области определеf(x,y):=sin(x2 + y2)
ния их аргументов.
Z(X,Y):=0.1X + 0.2Y + 0.5 График можно форматировать
щелчком левой кнопки мыши
по его полю.
для областей опредеГотовый график можно расления аргументов:
-1.5  x  1.5 -1.5  y  1.5 сматривать под различными
-1.5  X  1.5 -1.5  Y  1.5 ракурсами (на рисунке показаны 2 ракурса)
Так будет на экране
181
Продолжение прилож. 1
№
Наименование
3 График линий равного уровня (contour
plot) в виде проекций
на плоскость аргументов
166
1
Пояснения
Нужно сформировать график,
щелчком левой кнопки мыши
вызвать окно форматирования
графика, выбрать вкладку General и включить кнопку Contour Plot.
Можно один из графиков показать как обычный, а другой – в
виде линий равного уровня
Так будет на экране
9. Решение уравнений, нахождение корней уравнения n-го порядка
Для нахождения всех корней
(включая комплексные) нужно
сформировать вектор из коэффициентов уравнения (в порядке возрастания степеней, начиная со свободного слагаемого).
2x7 + 8x5 + 4x4 – x + 1 = 0
Если какая-то степень отсутствует – нужно ввести нуль
(жирный знак равенства, <Ctrl>+ <=>)
Нахождение всех
корней уравнения nго порядка.
Пример: найти корни
уравнения
182
Продолжение прилож. 1
№
Наименование
2 Решение уравнений,
систем уравнений,
систем уравнений и
неравенств.
Пример: найти решение системы уравнений:
0.5x + 2y2 = 9
-3xy -2y2 = 15
Пояснения
Используется жирный знак равенства (<Ctrl>+<=>) и другие
операторы отношений, см. п. 2
раздела 2).
Если уравнение нелинейное, то
решений может быть несколько. При заданном начальном
приближении найдется только
одно из них.
Решение может отсутствовать,
тогда см. п. 3 раздела 9
167
183
Так будет на экране
Окончание прилож. 1
168
№
Наименование
3 Приближенное решение уравнений, систем уравнений, систем уравнений и неравенств, если точное
решение найти не
удается.
Пример: найти решение системы уравнений:
Пояснения
Так будет на экране
Если использовать скобку given-find (см. п. 2 раздела 9), то MathCAD не сможет найти решение. Выведется сообщение о невозможности нахождения точного решения. В этом случае
можно использовать операторную скобку Given-Minerr, с помощью которой находится решение с наилучшим приближением
и
184
Приложение 2
СПРАВОЧНИК КОМАНД И КОНСТРУКТОВ, ИСПОЛЬЗУЕМЫХ
ДЛЯ ПРОГРАММИРОВАНИЯ В MATHCAD
Общие замечания
1. Команды MathCAD НЕЛЬЗЯ набирать литерами. Их можно либо
вводить из окошка «Программирование» (меню View – Toolbars– Programming, Вид – Инструменты – Программирование), либо использовать
сочетания клавиш (это быстрее). Сочетания клавиш видны в окошке программирования в форме подсказок, см. рис. П 2.1. Если Вам не приходится
программировать часто, запоминать сочетания клавиш нецелесообразно.
Всплывающая подсказка
(«хинт»): оператор for
вводится клавишами
<Ctrl>+<кавычки>
а) Окошко с оператораб) Всплывающие
ми программирования подсказки о сочетании
клавиш
Рис. П2.1. Команды и операторы программирования.
2. Зоны охвата программных конструктов (for…, while…, if…) ограничиваются линиями, которые придают программе вид легко читаемой
структуры (рис. П 2.2). Линия вводится командой Add Line (добавить
линию) или клавишей «закрывающая квадратная скобка». Часто такие
линии формирует сам MathCAD. Пример структуры программы:
169
max_value( M ) 
max  M
0
number_max  0
n  rows ( M )  1
Зона охвата конструкта for
(ДЛЯ КАЖДОГО),
внутри – зона конструкта if
for k  1  n
if M  max
k
max  M
k
number_max  k
Зона охвата конструкта if (ЕСЛИ)
max




 number_max 
Рис. П2.2. Структура программы. Линии выделяют зоны действия конструктов.
3. Все MathCAD-программы строятся как программы-функции. Переменные внутри программы являются локальными (действуют только в
пределах программы). В конце программы приводится либо скалярная
переменная, либо вектор, либо матрица, которые возвращает функция.
Например, программа на рис. П 2.2 возвращает вектор из двух значений,
которым внутри программы присвоены значения max и number_max.
Команды, конструкты и операторы с примерами их использования.
Оператор присваивания (стрелка справа налево). Пример:
number_max  0
Согласно этому оператору ЭВМ проводит следующие действия:
 Формирует константу 0;
 Находит в основной памяти свободную ячейку;
 Присваивает этой ячейке имя (идентификатор) number_max;
 Заносит в эту ячейку константу 0.
Оператор читается так: ПРИСВОИТЬ значение НУЛЬ переменной
с ИДЕНТИФИКАТОРОМ number_max.
Простой оператор if (ЕСЛИ) и otherwise (В ОСТАЛЬНЫХ
СЛУЧАЯХ). Пример:
m( s )  V  "No" if s 0
ОБЯЗАТЕЛЬНО жирный
V  "Yes" otherwise
170
знак равенства <Ctrl>+<=>
Программа возвращает No, если s = 0. В других случаях (т. е. если s  0)
функция возвращает Yes.
Виды условий: равно (жирный знак равенства <Ctrl>+<=>), не равно (<Ctrl>+<3>), больше, меньше, больше или равно (<Ctrl>+ <закрывающая_круглая_скобка>), меньше или равно (<Ctrl>+<открывающая_
круглая_скобка>) или сочетания этих условий через логические функции
ИЛИ (обозначается знаком +), И (обозначается знаком умножения, *).
Пример:
m( s )  V  "No" if [ ( s 0)  ( s  5) ]  ( s  "April" )
V  "Yes" otherwise
Программа возвращает No, если [ s = 0 ИЛИ s не равно 5] И [s не
равно April]. Во всех других случаях программа возвращает Yes.
Сложный оператор (конструкт) if (ЕСЛИ). Содержит последовательность команд, охваченных действием оператора. Для ввода линии,
ограничивающей зону действия, нужно установить курсор в левый слот и
ввести команду Add Line (можно клавишей «открывающая квадратная
скобка»). Пример приведен
f ( g )  if g 4
слева.
month  "April"
Если g = 4, то функция
days  30
возвратит:
time  "Spring"
 "April" 
 1
f ( 4)  
30
if g  4
month  "I don't know"
days  "I don't know"
time  "I don't know"
 month 
 days 


 time 


 "Spring" 
Если g не равно 4, то
функция возвратит, например,
 "I don't know"
f ( 9)   "I don't know"

 "I don't know"

 1


Конструкт for (ДЛЯ КАЖДОГО…). Конструкт for предназначен
для повторяющихся (циклических) вычислений. Пример: найти сумму
всех элементов массива M. Пусть в этом массиве хранятся следующие
значения:
171
 2.2 
 1.9 
 
0.6 
M  
 2.3 
 2.5 
 
 2.1 
sum( M ) 
– заготовка переменной для суммы (как бы пустой
кошелек)
– расчет максимального номера элемента
n  rows ( M )  1 массива М (по числу строк в массиве), единица учитывает нумерацию с нуля
for j  0  n
– цикл для каждого значения переменной
j = 0, 1, .., n (т. е. до последнего элемента
sum  sum  M массива)
j
– добавление очередного элемента массива к уже накопленной сумме
sum
– значение, возвращаемое функцией
sum  0
sum( M )  11.6
Проследим, как работает программа с циклом for и массивом M.
1. До начала цикла sum = 0.
2. Номер последнего элемента n = 6 –1 = 5
3. Первый цикл: j = 0.
a. Формула внутри цикла читается «по-еврейски» – справа налево. Вначале в процессор поступает значение Mj с j = 0, т. е. нулевой элемент 2.2. Затем на другой регистр процессора вызывается ячейка с идентификатором sum (в ней нуль). Затем процессор складывает оба числа (2.2 + 0) = 2.2 и отсылает в ячейку
памяти с идентификатором sum. Теперь там число 2.2.
b. Оператор for увеличивает номер цикла на 1 (получается j = 1)
и сравнивает c n (равно 5). Поскольку номер цикла меньше 5,
нужен еще один цикл с j = 1.
4. Второй цикл: j = 1.
a. Вначале в процессор поступает значение Mj с j = 1, т. е. первый
элемент 1.9. Затем на другой регистр процессора вызывается
ячейка с идентификатором sum (в ней 2.2). Затем процессор
складывает оба числа (1.9 + 2.2 ) = 4.1 и отсылает в ячейку памяти с идентификатором sum. Теперь там число 4.1.
b. Оператор for увеличивает номер цикла на 1 (получается j = 2)
и сравнивает c n (равно 5). Поскольку номер цикла меньше 5,
нужен еще один цикл с j = 2.
172
5. Третий цикл: j = 2.
a. Вначале в процессор поступает значение Mj с j = 2, т. е. второй
элемент 0.6. Затем на другой регистр процессора вызывается
ячейка с идентификатором sum (в ней 4.1). Затем процессор
складывает оба числа (0.6 + 4.1 ) = 4.7 и отсылает в ячейку памяти с идентификатором sum. Теперь там число 4.7.
b. Оператор for увеличивает номер цикла на 1 (получается j = 3)
и сравнивает c n (равно 5). Поскольку номер цикла меньше 5,
нужен еще один цикл с j = 3.
6. Четвертый цикл: j = 3.
a. Вначале в процессор поступает значение Mj с j = 3, т. е. третий
элемент 2.3. Затем на другой регистр процессора вызывается
ячейка с идентификатором sum (в ней 4.7). Затем процессор
складывает оба числа (2.3 + 4.7 ) = 7.0 и отсылает в ячейку памяти с идентификатором sum. Теперь там число 7.0.
b. Оператор for увеличивает номер цикла на 1 (получается j = 4)
и сравнивает c n (равно 5). Поскольку номер цикла меньше 5,
нужен еще один цикл с j = 4.
7. Пятый цикл: j = 4.
a. Вначале в процессор поступает значение Mj с j = 4, т. е. четвертый элемент 2.5. Затем на другой регистр процессора вызывается ячейка с идентификатором sum (в ней 7.0). Затем процессор складывает оба числа (7.0 + 2.5 ) = 9.5 и отсылает в ячейку
памяти с идентификатором sum. Теперь там число 9.5.
b. Оператор for увеличивает номер цикла на 1 (получается j = 5)
и сравнивает c n (равно 5). Поскольку номер цикла равен 5,
нужен еще один (последний!) цикл с j = 5.
8. Шестой цикл: j = 5.
a. Вначале в процессор поступает значение Mj с j = 5, т. е. пятый
элемент 2.1. Затем на другой регистр процессора вызывается
ячейка с идентификатором sum (в ней 9.5). Затем процессор
складывает оба числа (9.5 + 2.1 ) = 11.6 и отсылает в ячейку
памяти с идентификатором sum. Теперь там число 11.6.
b. Оператор for увеличивает номер цикла на 1 (получается j = 6)
и сравнивает c n (равно 5). Поскольку номер цикла БОЛЬШЕ 5,
циклы прекращаются, и программа возвращает число из ячейки sum (там накопилась сумма всех элементов массива 11.6).
173
Приложение 3
СПРАВОЧНИК ФОРМУЛ, НЕОБХОДИМЫХ ДЛЯ ВЫПОЛНЕНИЯ
ИНДИВИДУАЛЬНЫХ ЗАДАНИЙ ИЗ ЧАСТИ 4
1. Плоскости
Плоскость, проходящая через три точки M0(x0, y0, z0), M1(x1, y1, z1)
и M2(x2, y2, z2), не лежащие на одной прямой. Уравнение плоскости,
определяющее ее координаты (x, y, z), получается, если приравнять нулю
определитель матрицы P (если определитель равен нулю, то это является
признаком того, что все три точки лежат на одной прямой. В этом случае
существует бесконечное число плоскостей ("пучок плоскостей"), проходящих через одну прямую):
( x  x0) ( y  y 0) ( z  z 0)
P  ( x1  x0) ( y1  y 0) ( z1  z 0)
( x 2  x0) ( y 2  y 0) ( z 2  z 0)
Обозначим det(P) определитель матрицы P. Уравнение плоскости:
det(P) = 0. Раскрывая определитель, выразим одну из координат (обычно z)
через две другие: z = f(x, y). Получим вектор Plane (x, y) координат для
построения плоскости:
x
Plane(x,y) =
y
z ( x, y )
Плоскость, проходящая через данную точку параллельно другой
плоскости. Пусть задано уравнение плоскости Ax + By + Cz + D = 0 и
имеется точка с координатами M1(x1, y1, z1), не лежащая на заданной
плоскости. Тогда уравнение плоскости, проходящей через эту точку параллельно заданной плоскости, имеет вид: A(x-x1) + B(y-y1) + C(z-z1) = 0.
Из этого уравнения нужно выразить одну из координат (обычно z) через
две другие: z = f(x, y) и сформировать вектор Plane (x, y) координат для
построения плоскости.
Плоскость, параллельная координатной плоскости и расположенная на заданной высоте h. Вектор Plane (x, y) координат для построения плоскости получается так: x и y могут быть любыми, а координата z
должна быть для всей плоскости одной и той же (равной заданной высоте
174
h).
x
Plane(x,y) = y
h
Плоскость, проходящая через две точки перпендикулярно к данной плоскости. Пусть задано уравнение плоскости Ax + By + Cz +D = 0 и
две точки (возможно, но не обязательно лежащие на ней). Заданы координаты этих точек M0(x0, y0, z0) и M1(x1, y1, z1). Уравнение, определяющее координаты точек (x, y, z) искомой плоскости, получим, приравнивая
нулю определитель матрицы Q:
( x  x0) ( y  y 0) ( z  z 0)
Q  ( x1  x0) ( y1  y 0) ( z1  z 0)
A
B
C
Координаты точек плоскости находятся из уравнения det(Q) = 0.
2. Прямая линия в пространстве
Уравнение отрезка, соединяющего 2 точки с координатами M0(x0,
y0, z0) и M1(x1, y1, z1). Координаты отрезка (X, Y) находятся из уравнений:
( X  x0) (Y  y 0) ( Z  z 0)


( x1  x0) ( y1  y 0) ( z1  z 0)
Вектор координат (X, Y) для построения прямой находится так:
а) назначаем одну из координат свободной (обычно X);
б) из уравнения ( X  x0)  (Y  y 0) выразим Y = f1(X);
( x1  x0) ( y1  y 0)
в) из уравнения ( X  x0)  ( Z  z 0) выразим Z = f2(X).
( x1  x0) ( z1  z 0)
Получим координаты для построения линии:
X
Line( X , Y )  f1 ( X )
f2 (X )
Если нужно показать только отрезок между двумя точками, то следует указать пределы изменения аргументов: x0  X  x1, y0  Y  y1.
Точка пересечения прямой и плоскости находится при решении
175
системы уравнений, описывающей прямую и плоскость. Например, если
прямая строится так, чтобы она проходила через две точки с координатами M0(x0, y0, z0) и M1(x1, y1, z1), не лежащие на заданной плоскости
Ax + By + Cz + D = 0, то координаты (x, y, z) точки пересечения находятся из системы уравнений:
( y  y 0)
 ( x  x0)
 ( x1  x0)  ( y1  y 0)

( z  z 0)
 ( x  x0)


 ( x1  x0) ( z1  z 0)
A  x  B  y  C  z  0


Эта система уравнений может иметь одно решение (точка пересечения
единственна), бесконечно много решений (прямая линия лежит на плоскости) и ни одного решения (прямая проходит параллельно плоскости).
3. Цилиндр
При заданном радиусе основания цилиндра R и высоте H положение
точки M(, h) на боковой поверхности цилиндра определяется углом  к
оси абсцисс и высотой h над координатной плоскостью XOY.
Вектор Cylinder(,h) координат для построения цилиндра:
R  cos( )
Cylinder ( , h)  R  sin(  )
h
Диапазон изменения аргументов для построения «целого» цилиндра:
176
0  h  H, 0    2. Для построения части цилиндра нужно задать часть
угла 2, например: 0.5    .
4. Конус
При заданном радиусе основания конуса R и высоте H положение
точки M(h, ) на боковой поверхности цилиндра определяется углом при
вершине  (зависящим от соотношения высоты и радиуса основания) и
высотой h над координатной плоскостью XOY.
Тангенс угла  при вершине конуса равен:
R
tg ( ) 
H
Вектор Cone(h, ) координат для построения чертежа конуса:
( H  h)
R
 cos( )
H
( H  h)  tg ( )  cos( )
( H  h)
Cone(h,  )  ( H  h)  tg ( )  sin(  )  R 
 sin(  )
H
h
h
Диапазон изменения аргументов для построения «целого» конуса:
0  h  H, 0    2. Для построения части конуса нужно задать часть
угла 2, например: 0.5    .
Примечание: функция «тангенс» в MathCAD называется не tg( ), а
tan( ).
СОДЕРЖАНИЕ
177
ПРЕДИСЛОВИЕ........................................................................................
ВВЕДЕНИЕ……………………………………………………………..
ЧАСТЬ 1. ПЕРВОЕ ЗНАКОМСТВО С MATHCAD ……………….
Введение. Общие правила работы в среде Mathcad ……………
§1. Ваши первые примеры ……………..………………………..
§2. Решение уравнений ……………….…………….…………...
§3. Учебная задача …………………………..…………………...
§4. Индивидуальные задания по части 1 ………………..……...
ЧАСТЬ 2. МАТРИЦЫ И ВЕКТОРЫ В MATHCAD ……………….
Введение. Общие сведения о матричной алгебре в Mathcad ….
§5. Осваиваем технику работы с матрицами и векторами …....
§6. Алгебра матриц ……………………………………………….
§7. Некоторые применения матриц и векторов …...……………
§8. Учебная задача ……………………….……………………...
§9. Индивидуальные задания по части 2 …………….………...
ЧАСТЬ 3. ПРОГРАММИРОВАНИЕ В MATHCAD ………………
Введение. О программировании в среде Mathcad ……………...
§10. Осваиваем технику программирования в Mathcad. Ваша
первая программа ……………………………………………....
§11. Задания для самостоятельной разработки программы.. …
§12. Учебная задача …………..………………………………….
§13. Индивидуальные задания по части 3 ………..…………….
ЧАСТЬ 4. СИМВОЛЬНЫЕ ПРЕОБРАЗОВАНИЯ В MATHCAD ..
Введение. Сведения о символьных преобразованиях в Mathcad
§14. Осваиваем операции символьной математики ……..….....
§15. Учебная задача ……….………………………………….....
§16. Создание анимационных клипов …………………………..
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ ……………………………
Приложение 1 ………………………………………………………...
Приложение 2 ………………………………………………………...
Приложение 3 ………………………………………………………...
178
3
7
9
9
9
15
16
22
26
26
27
39
54
69
88
89
89
91
111
115
122
126
126
126
133
148
152
153
169
174
Елена Георгиевна Крушель,
Александр Эдуардович Панфилов
ОСВАИВАЕМ MATHCAD
(первокурсникам, заочникам и не только…)
Учебное пособие
Редактор Попова Л. В.
Темплан 2006 г., поз. № 23.
Подписано в печать 20. 02. 2007 г. Формат 60×84 1/16.
Бумага листовая. Печать офсетная.
Усл. печ. л. 11,19. Усл. авт. л. 11,0.
Тираж 100 экз. Заказ № 108
Волгоградский государственный технический университет
400131 Волгоград, просп. им. В. И. Ленина, 28.
РПК «Политехник»
Волгоградского государственного технического университета
400131 Волгоград, ул. Советская, 35.
179
Download