3 ВС!

advertisement
 В.Г. Афонин, декабрь 2009 г
О вычислениях в компьютерных системах. Часть 1.
Вычислительные Документы.
Простейшие базовые понятия в вычислительных системах.
Программирование арифметических формул.
+ 3 Приложения + 2 Дополнения
Содержание
Понятие вычислительного документа .............................. 1
Простейшие базовые понятия в вычислительных
системах .................................................................................. 2
1. Имена ............................................................................ 2
2. Числа .............................................................................. 2
3. Переменные .................................................................. 3
4. Функции ......................................................................... 4
5. Арифметическое выражение (АВ) ............................ 4
6. Операторы присваивания .......................................... 4
7. Программирование строчных арифметических
выражений (АВ), типичные ошибки в их записи. ...... 5
8. Понятие пользовательской функции ....................... 6
Программирование арифметических формул. ................ 8
Приложение 1. Встроенные функции MathCAD ............... 9
Приложение 2. Встроенные функции Excel .................... 10
Приложение 3. Встроенные функции языка VBA .......... 12
Дополнение 1. Понятие невязки приближённого
решения. ................................................................................ 12
Дополнение 2. О числе обусловленности СЛАУ. ........... 14
Все вопросы мы будем рассматривать применительно к
трём самым популярным в мире вычислительным системам
(ВС). Такими ВС в настоящее время являются:
1. Система компьютерной математики (СКМ) MathCAD;
2.
Табличный процессор Excel;
3.
Система программирования Visual Basic for Applications (VBA), встроенная в Excel.
Однако, без каких – либо принципиальных изменений практически всё сказанное распространяется и на другие вычислительные системы.
Понятие вычислительного документа
В дальнейшем мы будем широко использовать термин
«Вычислительный Документ (ВД)». Под ВД мы будем понимать то, что предназначено для компьютерного решения
какой – либо конкретной вычислительной задачи на должном уровне. Эта задача может быть простой (например,
построение графика функции одной переменной на отрезке), но может быть и достаточно сложной.
Вычислительным Документом может быть:
 Рабочий лист (Worksheet) Excel;
 Стандартный программный модуль VBA, содержащий одну или несколько процедур, предназначенных
для решения какой-либо задачи;
 Обычный «однофайловый» документ (Worksheet) MathCAD. [Мы видим, что в английском языке здесь
используется то же слово (Worksheet), что и для одного рабочего листа Excel. Русскоязычный термин «документ»
вместо термина «рабочий лист» для СКМ MathCAD является обычным и широко распространён. У нас же понятие
Вычислительного Документа (ВД) является значительно
более широким.]
 Несколько взаимосвязанных «однофайловых»
документов (Worksheets) СКМ MathCAD.
 [ Такая связь легко устанавливается через систему
ссылок (Insert/Reference…). После вставки в документ
MathCAD ссылки на файл, содержимое этого файла считается находящимся на месте данной ссылки.]
 Один или несколько программных модулей
VBA [вместе с формами и элементами управления].
 Целая рабочая книга (Workbook) Excel, содержащая множество взаимосвязанных рабочих листов + VBА
– проект, содержащий множество программных модулей.
 Другие программные средства, хранящиеся в
одном или нескольких файлах и предназначенных для
решения конкретной задачи вычислительного характера или комплекса таких задач.
Качественный ВД должен удовлетворять определённым
требованиям. Сформулируем некоторые из них.
1.
ВД не должен содержать ошибок! То есть, при различных (допустимых) исходных данных ВД должен выдавать безошибочный ответ. Это - наиглавнейшее требование!!! И само по себе слово Документ здесь выбрано не
случайно: это слово имеет соответствующий оттенок. Автор Вычислительного Документа берёт на себя полную ответственность за его качество.
Можно разработать внешне привлекательный ВД, который
с высоким уровнем сервиса, в человеко – машинном диалоговом режиме позволяет проводить логически сложные
вычисления на базе самых современных высокоэффективных алгоритмов.
Но если при этом ВД содержит хотя бы одну арифметическую ошибку, приводящую к неверному результату
вычислений, то все достоинства этого ВД могут быть
сведены не то что в «ноль», но можно даже сказать,
что и в «минус».
Действительно, чем большее доверие пользователь будет
испытывать к ВД, тем более тяжкие последствия может повлечь неверный результат вычислений. Правда, на практике программированием «арифметики» часто занимается не
разработчик качественного ВД, а другой, «конечный» пользователь. В этом случае лично он, допустивший эту арифметическую ошибку (а не компьютер, не Excel, не MathCAD
и т.д.) несёт полную ответственность за полученные результаты вычислений. Оправдания типа «А это мне такое
компьютер выдал…» должны быть изъяты из лексикона квалифицированного пользователя! Он должен разрабатывать и использовать только хорошо отлаженные,
надёжные ВД, за правильность работы которых лично он
несёт ответственность.
2.
При вводе исходных данных пользователем вполне
могут быть допущены различные ошибки. В качественном
ВД должна быть предусмотрена соответствующая реакция
на такие ошибки ввода. Диагностика и обработка ошибок
при вводе данных с выдачей соответствующих сообщений
пользователю в общем случае является непростой задачей.
Но в простейших случаях контроль ввода может осуществляться без особых проблем.
3.
ВД должен быть достаточно наглядным и удобным в
использовании. Для этого в ВД необходимо использовать в
максимальной степени естественные обозначения. Эти
обозначения могут быть и очень простыми и достаточно
сложными. Рассмотрим примеры. Если в исходных обозначениях присутствует функция f(x), то и в ВД её нужно обозначать f(x). Компьютеру неважно, какие имена использованы в ВД. Но это принципиально важно для человека, использующего ВД, поэтому качество ВД от обозначений зависит очень сильно! [Например, вместо f(x) можно использовать обозначение z(y) или, ещё «интереснее» x(f) и т. д.
Совершенно очевидно, что подобного рода эксперименты и
«забавы» с обозначениями могут привести к весьма негативным последствиям!]. Наибольшими возможностями для
естественных обозначений обладает MathCAD. Здесь различаются «малые» и «большие» (строчные и прописные)
буквы. Здесь можно использовать буквы греческого алфавита. Здесь можно использовать в общематематических
обозначениях не только индексированные переменные
(элементы векторов и матриц), но и имена с индексной частью (как известно, перед индексной частью должна быть
проставлена точка).
4. Желательно, чтобы все исходные числовые данные,
задаваемые в ВД (с помощью операторов присваивания в
MathCAD или путём ввода чисел в Excel, или с помощью
1
 В.Г. Афонин, декабрь 2009 г
констант в модуле VBA) находились в одном месте.
Обычно эти исходные данные помещаются в начало ВД.
[Как известно, в начало рабочего листа или программного
модуля можно попасть простым нажатием Ctrl+Home]
5. Весьма желательно весь ВД снабдить достаточным
количеством текстовых комментариев. Эти комментарии должны сделать ВД понятным и легко читаемым
не только самим автором- разработчиком, но и другими
пользователями, которые захотят разобраться в ВД и
внести в него различные изменения и дополнения. В
ВД должна быть сформулирована постановка задачи, прокомментированы исходные данные, ход
решения задачи и полученные результаты. Эти
комментарии осуществляются в MathCAD в виде текстовых областей и аннотаций к математическим областям. В Excel обычно записывают пояснительный текст
в ячейки рабочего листа, добавляют примечания в
ячейки, вставляют надписи и выноски, вставляют формулы через MS Equation и т.д. Возможности Excel, как и
других офисных приложений в этом плане чрезвычайно
широки и разнообразны. Но и MathCAD позволяет
вставлять любые объекты и прекрасно взаимодействует с Word! Это обстоятельство следует широко использовать. В частности рекомендуется писать комментарии в Word с проверкой орфографии, а затем
вставлять проверенный текст в текстовые области
MathCAD.
6. Форматирование ВД (шрифты, заливки, цвета) играет
существенную роль в его оформлении. При этом желательно знать рекомендуемые сочетания цветов. Установлено, например, что для большинства людей благоприятным является синий цвет шрифта на жёлтом
фоне. Как известно, форматы легко копируются и в
MathCAD и в Excel и в элементах управления. Поэтому
рекомендуется отформатировать один объект, а затем
копировать эти форматы для других родственных объектов.
7. Запись сколько-нибудь длинных выражений желательно осуществлять в нескольких строках. Более того,
запись в несколько строк можно использовать просто
для структуризации, для повышения наглядности и
лучшего восприятия записи человеком. Напомним, что
в наших ВС перенос осуществляется следующим
образом:
MathCAD
Excel
Visual Basic
Ctrl + Enter
Alt + Enter
2 символа: _
(пробел и знак
подчёркивания)
Замечание 1. Как правило, ВД содержит графические
области и графические объекты, поэтому его можно называть также и Вычислительно – Графическим Документом
(ВГД).
Замечание 2. В идеале Библиотека качественных ВГД
(БВГД) для решения типовых задач должна быть в распоряжении каждого студента с тем, чтобы при необходимости
он мог решать с помощью этой Библиотеки многие задачи
на достаточно высоком уровне. Кроме того, фрагменты ВД и
навыки их разработки могут быть использованы и для решения других задач.
Простейшие базовые понятия в вычислительных системах
Основными, базовыми понятиями в ВС являются:
1. Имена
Имя – это либо буква, либо последовательность букв,
цифр и знаков подчёркивания, начинающаяся с буквы.
Это определение является общим для всех ВС, хотя в каждой ВС имена имеют свои несущественные особенности.
Отметим, что во многих ВС (в частности, в Excel и в Visual
Basic) «малые» и «большие» буквы в именах воспринимаются одинаково.
Каждая переменная, каждый массив, каждая функция
имеет определённое имя.
В Excel широко используются уже готовые имена ячеек (А1,
В17 и т. д.), которые называют также ссылками. Во всех
других ВС имена в основном назначаются пользователями
и разработчиками ВД. При таком назначении настоятельно
рекомендуется придерживаться важного правила:
имена в ВД должны быть содержательными и максимально соответствовать обозначениям исходной задачи.
Феноменальные возможности в этом плане имеются в
Excel. Там можно одной и той же ячейке давать несколько
разных дополнительных имён. Например, ячейке А3 можно дать следующие дополнительные имена: L, DlinaBalki,
длина_балки и т.д. Имя L удобно использовать в формулах; другие имена более содержательны. Какой – либо
ячейке можно дать имя L_1, но нельзя дать имя L1 (почему?). Ещё одна особенность Excel: никакой ячейке нельзя
дать имя с(C) или r(R). При попытке это сделать Excel просто выделяет либо текущий столбец (column), либо текущую строку (row). Отметим также, что дополнительное имя
ячейки рабочего листа распространяется на всю рабочую
книгу. Кроме отдельных ячеек имена могут иметь целые
диапазоны клеток.
О широчайших возможностях имён в MathCAD уже было
сказано выше.
В MathCAD разрешается одно и то же имя последовательно
использовать для обозначения разных объектов. Даже имя
π, изначально закреплённое за известным числом, можно
использовать для других целей. В некоторых случаях это
удобно и целесообразно. Но в больших документах это может привести к путанице и к неверным конечным результатам. Поэтому в большинстве других ВС это категорически запрещено. Исключение здесь составляют процедуры,
где используются внутренние (локальные) имена практически без всяких ограничений. Например, имя х можно использовать в различных процедурах для совершенно разных целей. Аналогами процедур являются программные
блоки MathCAD.
В MathCAD вполне допустимы (и широко используются в
инженерных расчётах!) имена с индексной частью. Перед
набором индексной части такого имени с клавиатуры следует ввести символ . (точка).
Типичная ошибка: вместо имени, содержащего индексную
часть, нередко вводят элемент массива.
Это совершенно разные вещи!
Контрольные вопросы и задания.
1. Может ли имя содержать пробел?
2. Может ли имя состоять из одной буквы?
3. Может ли имя начинаться с цифры?
4. Дайте общее определение имени.
5. Как присвоить дополнительное имя ячейке Excel?
6. Как присвоить дополнительное имя диапазону Excel?
7. Можно ли одно и то же дополнительное имя давать разным ячейкам данной рабочей книги?
8. Что представляет собой имя с индексной частью в СКМ
MathCAD?
2. Числа
Большое разнообразие чисел имеется в VBA. Но, «по
умолчанию», вычисления там ведутся с 16-ю значащими
цифрами.
При этом, из – за погрешностей округления получаемые
результаты содержат не более 15 верных значащих цифр.
С такой же точностью ведутся вычисления в Excel и
2
 В.Г. Афонин, декабрь 2009 г
MathCAD. Для инженерных вычислений эта точность вполне
достаточна.
Важной особенностью MathCAD является то, что результаты вычислений там получаются, вообще говоря, в виде
комплексных чисел. Поэтому MathCAD «спокойно» вычисляет значения логарифмов и корней любой степени из отрицательных чисел, выполняет многие другие вычисления,
которые, с точки зрения математики вещественных чисел,
не имеют смысла. Примеры:
13  3.606i
ln ( 2)  0.693  3.142i
asin ( 5)  1.571  2.292i
Каждый пользователь должен знать, что вещественные
числа (и дробные и целые) в ВС записываются в двух
формах: обычной и экспоненциальной.
Обычная форма записи, принятая в математике, является
естественной и не требует комментариев. Нужно только
помнить о том, что в MathCAD и VBA дробные числа записываются с десятичной точкой, а в Excel, «по умолчанию» с десятичной запятой. Это нужно учитывать, в частности,
при переносе чисел из Excel в MathCAD и обратно.
О числах в экспоненциальной форме (ЧЭФ)
Это достаточно простое и в то же время весьма важное
понятие.
Вначале рассмотрим примеры записи чисел, содержащих
множитель вида 10n, где n – целый показатель степени, и
соответствующих им ЧЭФ:
Обычная 123,510- 5 - 0,05107 - 106 10 - 7
запись
Запись
123,5Е-5
- 0,05Е7 - 1е6 1е-7
в виде ЧЭФ
Очевидно, что при выполнении инженерных и других расчётов потребность в записи ЧЭФ возникает довольно часто.
Прочные навыки безошибочной записи ЧЭФ необходимы каждому пользователю хотя бы потому, что позволяют избежать грубейших ошибок, когда используются
готовые к исполнению программы.
В этом случае пользователю остаётся только безошибочно
ввести исходные числовые данные.
При таком вводе чисел недопустимы, например, записи
вида
- 0,053*10^7 или – 10 ^ (-7)
и т.д.
Эти записи не являются числами, а представляют собой
целые арифметические выражения.
Те, кто не знаком с ЧЭФ, вынуждены записывать все вводимые числа в обычной форме (без буквы Е(е)).
Но при этом можно легко ошибиться на целый порядок (в
десять раз!).
В этом легко убедиться, если попробовать записать в
обычной форме числа из вышеприведённой таблицы.
Кроме того, ЧЭФ нередко встречаются в результатах вычислений, проводимых в Excel и других компьютерных системах.
В экспоненциальной форме может быть записано любое
число, допустимое для данной вычислительной среды, тогда как в обычной форме это можно сделать не всегда.
В Excel среди других форматов ячейки есть экспоненциальный формат (вкладка «Число» в окне «Формат ячеек»).
Общая форма записи числа в экспоненциальной форме:
<Обычное число> Е | e <Целое число>
Здесь сначала обязательно ставится какое – либо обычное
число (целое или дробное), затем – латинская буква Е (или
е), после чего – целый показатель степени.
Таким образом, в записи ЧЭФ могут присутствовать следующие символы:
Все цифры (от 0 до 9), десятичная запятая (или десятичная точка), латинская буква Е (или е), знаки + и –
Никакие другие символы, включая пробелы, в записи ЧЭФ
не допускаются!
В СКМ MathCAD пользователю нельзя записывать ЧЭФ в
арифметических выражениях вообще и при задании числовых значений переменных в частности.
Но при выводе результатов вычислений (особенно в символьной форме) ЧЭФ встречаются довольно часто. Например:
1
float  3  .813e-2
123
Попутно отметим, что цифра 0, стоящая перед десятичной
точкой, здесь опущена. Это часто встречается и в других
ВС. При вводе чисел пользователь также может опускать 0
перед десятичной точкой (или десятичной запятой), но
лучше этого не делать, помня общее правило: чем нагляднее и естественнее запись, тем лучше.
ЧЭФ – это простейшее, но важное базовое понятие при
проведении различных вычислений и чтении полученных
результатов. ЧЭФ рекомендуется использовать везде,
где это целесообразно, в том числе и при записи строчных арифметических выражений.
Контрольные вопросы и задания.
1. Что такое ЧЭФ? Где они используются?
2. Можно ли вводить ЧЭФ в арифметических выражениях
MathCAD?
3. Как получить приближенное значение числа π в Excel?
4. Как получить приближенное значение числа π в VBA?
3. Переменные
В ВС имеются числовые, текстовые и логические переменные. Мы рассмотрим сейчас только числовые переменные.
Числовая переменная – это величина, которая имеет
определённое имя и может принимать разные числовые значения.
Как мы видели, эти значения в MathCAD могут быть обычными числами (скалярами), числовыми векторами и матрицами (массивами).
Наиболее часто используются скалярные переменные.
Для каждой такой переменной отводится определённая
ячейка оперативной памяти, и число, находящееся в
этой ячейке, является значением переменной в данный
момент времени.
При записи в ячейку другого числа переменная получает
новое значение, а предыдущее содержимое ячейки автоматически уничтожается.
Простейшим и самым распространённым оператором,
изменяющим значение переменной, является оператор
присваивания.
Примеры скалярных операторов присваивания в MathCAD:
X:=7
- в ячейку для Х заносится число 7, то есть, переменной с
именем Х присваивается значение 7. Если до этого переменная Х имела какое-либо другое значение, то есть, в
ячейке для Х было другое число, то прежнее содержимое
этой ячейки будет уничтожено.
Если после этого выполнить оператор присваивания вида:
Х:=Х+6,
то при его выполнении сначала будет вычислено значение
Х+6 в правой части оператора. Именно, будет взято число 7
из ячейки для Х, затем к нему будет добавлено число 6 и
полученный результат (число 13) будет записан в ячейку
для Х. В результате в ячейке для Х окажется число 13, то
есть, в конечном итоге переменная Х будет иметь значение,
равное 13. Глубокое понимание работы оператора присваивания необходимо для чтения и разработки ВД.
Отметим, что MathCAD имеет несколько системных переменных с содержательными именами, среди которых есть
хорошо известные переменные π и е. Но при этом значение
каждой из этих переменных разрешается менять. В VBA и
Excel таких переменных нет. Правда, в Excel имеется
функция ПИ(), значением которой является число π. Что же
3
 В.Г. Афонин, декабрь 2009 г
касается числа е, то его можно получить в виде значения
функции exp(1).
Контрольные вопросы и задания.
1. Что такое переменная? Можно ли сказать, что скалярная
переменная – это именованная ячейка оперативной памяти?
2. Почему переменным рекомендуется давать содержательные имена?
3. Что происходит при выполнении оператора присваивания
вида х:=х+5?
4. Функции
Каждая ВС имеет определённый набор стандартных
или встроенных функций.
Эти функции в значительной степени определяют всю мощь
ВС. Из трёх наших ВС достаточно обширный набор встроенных функций имеется у MathCAD и Excel. В VBA это
набор значительно слабее, однако там есть возможность
использования встроенных функций Excel («функций рабочего листа»). Более того, в программном коде VBA можно
использовать даже «Поиск решения» («Solver») - главную
вычислительную надстройку Excel. Напомним, что эта
надстройка позволяет легко решать самые разнообразные
задачи и с большим успехом может заменить три вычислительных блока MathCAD: Given/Find, Given/Maximize, Given/Minimize. Напомним тут же, что блоки Given/… нельзя
вставлять в программный блок MathCAD.
Более подробно некоторые
встроенные функции
MathCAD, Excel и VBA рассмотрены в Приложениях.
Кроме встроенных функций в MathCAD, Excel и VBA можно
использовать пользовательские функции. При этом задавать такие функции непосредственно в Excel нельзя, для
этого с успехом используется VBA.
Понятие пользовательской функции является чрезвычайно
важным, поэтому мы рассмотрим его достаточно подробно.
Но сделаем это несколько позже, так как вначале нам необходимо рассмотреть не менее важное понятие – понятие
арифметического выражения.
5. Арифметическое выражение (АВ)
Арифметическое выражение (АВ) – это либо число1 либо переменная, либо функция, либо их комбинация, содержащая также круглые скобки (для задания нужного
порядка арифметических действий) и знаки арифметических операций. Значением корректно заданного АВ
всегда является число. Поэтому АВ называют также
числовым выражением.
Примечание1. В данном определении более правильно
вместо слова «функция» использовать термин «указатель
функции». Примеры записи указателей функций: sin(3);
cos(3+5).
Сразу после имени функции в круглых скобках записывается ее аргумент, который в общем случае представляет собой АВ.
Таким образом, указатель функции (или просто функция), находящаяся в АВ, представляет собой запись
вида
ИмяФункции(АВ1).
При вычислении значения функции сначала вычисляется
значение её аргумента.
Функция может иметь несколько аргументов. В MathCAD и
VBA эти аргументы разделяются символом , (запятая), а в
В СКМ MathCAD вместо числа во многих случаях можно использовать числовой массив.
1
Excel – обычно символом ; (точка с запятой) (Почему? Для
чего в Excel используется запятая?)
Отметим, что во многих случаях для ввода значений аргументов в Excel очень удобно использовать мастер функций.
В подавляющем большинстве ВС используется строчная запись АВ. Главным исключением из этого общего
правила является MathCAD.
При вычислении значения строчного АВ действия выполняются слева направо с учётом круглых скобок и следующего старшинства арифметических операций:
1. ^ (возведение в степень);
2. * (умножение) и / (деление) – равноправные операции;
3. + (сложение) и – (вычитание) – равноправные операции.
Примечание 2. В языке Pascal операция возведения степень вообще отсутствует, а в Fortran обозначается ** (две
звёздочки подряд). Это желательно иметь в виду, так как
при выводе результатов громоздких символьных вычислений MathCAD иногда предлагает записать их в текстовой
форме с использованием обозначений языка Fortran.
Кроме этих, самых распространённых операций 1., 2., 3.,
имеются и другие, но мы их пока рассматривать не будем.
Поскольку функция является первичным объектом АВ, вычисление значения функции всегда осуществляется в самую первую очередь, то есть, это операция высшего ранга!
Зная этот порядок действий, можно легко и правильно записывать АВ.
6. Операторы присваивания
Простейшие примеры операторов присваивания были рассмотрены нами ранее (см. раздел 3. Переменные). Рассмотрим этот оператор подробнее применительно к VBA и
MathCAD.
[В Excel оператор присваивания, как таковой, отсутствует.
Правда, можно считать, что при вводе числа 77 в ячейку А7
своего рода «переменная» А7 получает значение 77. Но
такая интерпретация сильно осложняется, когда в ячейку
заносится формула.]
Оператор присваивания в VBA имеет вид:
<переменная> = <выражение>
То есть, символом присваивания здесь (как и в языках
Fortran и С) является обычный знак =
Оператор присваивания в MathCAD имеет вид:
<переменная> := <выражение>
При этом знак присваивания (:=) можно брать с панельки
(Calculator, Evaluation), а можно с клавиатуры ввести символ
: (двоеточие).
При выполнении оператора присваивания вычисляется
значение выражения в правой части и полученный результат присваивается переменной, стоящей в левой
части оператора.
Результат действия оператора присваивания распространяется правее и ниже его месторасположения.
В VBA обычно используется только скалярные операторы
присваивания. Например, в результате выполнения операторов:
Pi=4*atn(1) : x=Pi/3 : s=Sin(x+1)
переменные с именами Pi, x, s получат соответствующие
значения, которые можно будет использовать в дальнейших
вычислениях.
Символ : (двоеточие) является разделителем между операторами VBA, находящимися в одной строке.
Напомним, что для вывода значений переменных в окно
Immediate можно в этом окне записать оператор
Print "Pi=";Pi, "x=";x, "s=";s
4
 В.Г. Афонин, декабрь 2009 г
Здесь символ , (запятая) переводит курсор в начало следующий зоны строки печати. При выполнении этого оператора будет выведена строка вида:
Pi= 3,1415…
x= 1,0471…
s= 0,8886…
Операторы присваивания MathCAD мы рассмотрим более
подробно.
Эти операторы могут быть скалярными, а могут быть векторными и матричными. Рассмотрим пример 1:
2
v1   
5
 20 
v2  

 50 
v2  10  v1
 12 
10  v1  

 15 
Здесь приведены 2 векторных оператора присваивания и 2
векторных оператора вывода. Напомним, что при сложении
вектора с числом это число добавляется ко всем элементам
данного вектора.
Операция сложения вектора с числом, предусмотренная в
MathCAD, запрещена в обычной математике!
Аналогичные операции могут выполняться и над матрицами. Проделайте это самостоятельно!
Над векторами и матрицами могут выполняться также операторы с использованием индексов. Рассмотрим пример 2 –
операции над матрицами с использованием ранжированных
переменных:
ORIGIN  1
i  1  2
2 3 4

3 4 5
j  1  3
Mi  j  i  j
 102 103 104 

 103 104 105 
M
M  100  
Здесь заданы 4 оператора присваивания и два оператора числового вывода.
Вначале системной переменной ORIGIN (начальный индекс
массивов) присваивается значение 1.
Этот момент очень существенен при работе с индексами. Попробуйте, например, установить ORIGIN в 0 и просмотреть измененный вариант.
Затем задаются две ранжированные переменные: i=1,2 и
j=1,2,3
Наконец, при выполнении матрично-индексного оператора
присваивания Mi , j := i + j происходит формирование 6 элементов матрицы M. Именно, вначале i принимает значение
1, а j - последовательно значения 1, 2, 3, и происходит
формирование 1 – й строки матрицы. Затем i принимает
значение 2, а j - последовательно значения 1, 2, 3, и происходит формирование 2 – й строки матрицы.
Очевидно, таким образом можно сформировать любую
матрицу произвольной размерности, элементы которой будут вычисляться по определённой формуле. Например,
для формирования матрицы М размерности mn с произвольными элементами на базе функции двух переменных
f(x, y) достаточно задать соответствующие ранжированные
переменные и написать оператор присваивания вида Mi , j :=
f(i, j) . Таким образом, можно легко создать матрицу, элементами которой будут значения функции двух переменных.
Замечание. В MathCAD иногда используется глобальное
присваивание, результат которого распространяется на
весь ВД.
Соответствующий знак

(как у математического тождества) берётся с панельки
Evaluation.
Пример:
s  55
s  s  5
s  3
s  60
s3
s  55
s  2  s
s  55
s  120
Внимательно отследите за тем, как меняется значение переменной s !
Как уже было сказано ранее, различают встроенные (стандартные) и пользовательские (определяемые пользовате-
лем) функции. Все встроенные функции в MathCAD доступны через значок f(x), и только несколько самых распространённых можно «взять» с панельки Calculator.
Но любую функцию можно набрать и с клавиатуры!
7. Программирование строчных арифметических выражений (АВ), типичные ошибки в их записи.
Строчные АВ широко используются в Excel, в языках программирования семейства Basic, Pascal, C , Fortran, в системах компьютерной математики (СКМ) Derive, Mathematica, MatLab, Maple и в подавляющем большинстве других
вычислительных сред.
Наиболее известным исключением является СКМ MathCAD,
где используется «этажная» запись дробей и степеней, и
арифметические ошибки допускаются редко.
Строчные АВ играют центральную роль при проведении вычислений в Excel и в других вычислительных
средах.
Так, арифметическая формула в ячейке Excel обычно записывается в виде:
= АВ.
Вместо знака = можно использовать знаки – либо +, но
делать это не рекомендуется.
Более того, вообще не рекомендуется начинать запись АВ
со знака – (минус).
Например, если записать = - 2^2 , то мы получим значение 4, то есть неверный результат. А вот вычисление
по формуле =0-2^2 даст нам верный результат (-4).
Таким, образом, перед знаком – (минус) в начале АВ
рекомендуется ставить 0, хотя во многих вычислительных средах делать это не обязательно.
При строчной записи АВ нередко возникают различные
ошибки. Эти ошибки можно разделить на две категории:
синтаксические (формальные) и семантические (содержательные).
Формальные ошибки (число левых скобок не равно числу
правых, неверное имя функции или переменной и т.д.) легко
обнаруживаются программой-транслятором. Эта программа
проводит обязательный синтаксический контроль и выдаёт
сообщения об ошибках, если таковые найдены.
Но многие ошибки, вполне очевидные для человека, не
обнаруживаются транслятором и могут привести к печальным последствиям.
Например, при строчной записи корня кубического из х
пользователь может пропустить круглые скобки и сделать
запись вида x^1/3.
Здесь операция возведения в степень стоит раньше операции деления и к тому же имеет более высокий ранг.
Транслятор, естественно «поймёт» эту запись так:
х нужно возвести в степень 1 и поделить результат на 3.
Другими словами, запись x^1/3 будет воспринята как х/3.
Только одна ошибка такого рода может свести «в минус»
все усилия по проведению сколь угодно сложных вычислений.
Арифметические ошибки содержательного характера не
обнаруживаются при синтаксическом контроле, приводят к
неверным результатам вычислений и являются непростительными для будущих инженеров и экономистов!
5
 В.Г. Афонин, декабрь 2009 г
Поэтому каждый студент должен приобрести прочные навыки безошибочной записи АВ!
Примеры самых грубых и «трудноуловимых»
ошибок в записи простейших строчных АВ:
Математическая
запись
a
a / ( b * c)
b c
ab
(a + b)/( c d)
cd
3
x
Правильная
«строчная»
запись
x
1
3
x^(1/3)
Типичные ошибки и
комментарии
a / b*c
- это
грубейшая ошибка!
a + b/( c – d ) или
(a + b)/ c – d
Это грубейшие ошибки!
x ^ 1 / 3 - это
грубейшая ошибка!
Задание. Записать в общематематической форме выражения, содержащие типичные ошибки.
Основным источником всех этих ошибок является отсутствие необходимых круглых скобок.
Отсюда – простая, но важная рекомендация:
В сомнительных случаях лучше проставить лишние
скобки, чем допустить вероятность появления ошибки!
Более того, для минимизации числа ошибок можно
расставлять заведомо избыточные скобки, руководствуясь очень простым принципом:
одно арифметическое действие – одна пара скобок.
Например, можно поставить лишние скобки при записи выражения 2*a-3/b+5*x^2, записав его в виде: (2*a)(3/b)+(5*(x^2)).
На самом деле, с учётом известного старшинства арифметических операций, эти записи будут эквивалентны.
Но вторая запись (с избыточными скобками) не оставляет
никаких сомнений в её правильности!
Отметим, что в (1) мы могли вместо имени х написать любое другое имя: хх, z5, формальный_аргумент и т.д., и
при этом была бы задана одна и та же функция.
Формальный аргумент – это просто произвольное имя.
Но, как было сказано ранее, имена в качественном ВД
должны в максимальной степени соответствовать обозначениям в исходной задаче.
Итак, (1) задаёт новую функцию, которая будет храниться в
памяти и может быть использована в любой момент времени наряду со всеми другими функциями ВС.
Для проверки работы функции f(x) напишем оператор числового вывода:
f(7) = 24
(2)
При выполнении этого оператора вычисляется значение АВ в левой части и правее знака вывода (=) появляется результат вычислений. В нашем случае АВ – это
просто указатель функции: f(7).
При вычислении значения f(7) запускается сформированная ранее подпрограмма для вычисления f(x), где
вместо х подставляется число 7. В результате работы
этой подпрограммы вычисляется значение выражения
27 +10 и полученный результат (число 24) появляется в
области (2).
При этом в записи f(7) число 7 называется фактическим
аргументом.
В общем случае в качестве фактического аргумента
можно использовать произвольное арифметическое
выражение.
То есть, можно написать в каком-либо АВ указатель функции вида f(АВ_аргум), где АВ_аргум - произвольное допустимое арифметическое выражение, не содержащее самой
функции f. При вычислении f(АВ_аргум), сначала вычисляется Значение_АВ_аргум, затем это значение подставляется вместо формального аргумента х в (1) и на месте
f(АВ_аргум) появляется вычисленное значение функции
f(Значение_АВ_аргум).
Пример 2. Пусть, наряду с заданием f(x), имеется оператор присваивания
х := 7
"х полагается равным 7" - это обычный оператор присваивания, при выполнении которого скалярная переменная с
именем х (икс) получает значение, равное семи (в ячейку
для переменной х заносится число 7).
Этот оператор может быть расположен либо перед,
либо после задания нашей функции f(x).
В итоге на данный момент у нас фигурирует два одинаковых имени х: имя обычной переменной и имя формального
аргумента функции f(x). Такая ситуация является очень
распространённой, и в ней нужно хорошо ориентироваться.
8. Понятие пользовательской функции
Задание пользовательской функции.
Пользовательские
функции (ПФ) занимают одно из центральных мест в вычислительной подготовке. Без них невозможно решение многих задач. Понятие это непростое, поэтому начнём с простейших примеров, взяв за основу MathCAD.
Пример 1. Пусть имеется математическая область вида:
f(x) := 2x + 10
(1)
В этой области задана пользовательская функция с именем
f.
В записи (1) фигурирует знак присваивания, однако никаких
вычислений здесь не происходит. Просто в оперативной
памяти формируется подпрограмма, задающая функцию
f(x), а х воспринимается здесь как формальный аргумент
(или формальный параметр).
После задания функции f(x) и значения переменной х=7 можно написать оператор вывода:
f(x) = 24
Вычисление значения f(x) здесь происходит
по аналогии с вычислением f(7).
В записи f(x) под х понимается фактический аргумент обычная переменная, значение которой (число 7) задано
ранее.
В выражении для функции, наряду с формальным аргументом, могут присутствовать и другие переменные,
значения которых заданы и даже произвольные арифметические выражения, значения которых можно вычислить.
Пример 3. Пусть имеется следующий фрагмент ВД:
a:=2
b:=10
f1(x) := ax + b
f1(7) = 24
6

В.Г. Афонин, декабрь 2009 г
Здесь в выражении для f1(x), кроме формального аргумента
х, присутствуют две переменные (a и b), значения которых
заданы ранее. Если бы эти переменные не имели никаких
значений, они были бы выделены красным цветом, и функция не была бы определена.
Пример 4. (гораздо более сложный и важный, чем 3 предыдущие) Пусть задана функция 3-х аргументов c именем f3:
f3(x, a, b):= ax + b
(3)
Здесь мы имеем дело с функцией нескольких аргументов.
При вычислении значения этой функции вместо формальных аргументов x, a, b нужно подставить соответствующие
фактические аргументы, каждый из которых может быть
произвольным АВ.
Например,
f3(7, 2, 10) = 24
f3(2, 7, 10) = 24
f3(10, 2, 7)=27
Если заданы значения переменных x, a, b, например,
a=2
b=10
x=7, то в качестве фактических аргументов можно брать любые АВ, содержащие эти и другие переменные, имеющие определённые числовые значения.
При этом сначала вычисляются числовые значения 1-го, 2го и 3-го аргумента, после чего эти значения подставляются
на место формальных аргументов (соответственно, на место x, a, b), затем вычисляется значение функции по формуле (3).
Как известно, АВ могут быть достаточно сложными. Соответственно, и указатель нашей функции может иметь непростой вид. Например, этот указатель можно задать в виде:
f3(sin(ax + b), tan(sin(x-b)), ax + b)
(4)
При вычислении значения этой функции сначала будут вычислены значения всех трёх фактических аргументов при
a=2 b=10 x=7, а затем эти значения будут подставлены
на место соответствующих формальных аргументов и вычислено значение функции. Проверим это, проведя вычисления в двух вариантах:
f3 ( x  a  b)  a  x  b
a  2
b  10
x  7
Два варианта вычисления значения функции
f3 ( sin ( a  x  b)  tan ( sin ( x  b) )  a  x  b)
1-й вариант - с предварительным вычислением значений аргументов:
axb  a  x  b
axb  24
sinaxb  sin ( axb)
sinaxb  0.906
val1  f3 ( sinaxb  tan1  axb)
tan1  tan ( sin ( x  b) )
tan1  0.142
a=2
b=10
x=7 мы можем задать следующие функции:
1) f3_x(x):= f3(x, a, b) – здесь х – формальный аргумент; a, b
– обычные переменные со значениями 2 и 10 соответственно. Функция одной переменной f3_x(x) зависит, кроме
основного аргумента х ещё и от 2-х параметров, значения
которых фиксированы.
2) f3_x_а(x,а):= f3(x, a, b). Это уже функция двух аргументов: x,а. И ещё эта функция зависит от параметра b.
С учётом того, что параметры можно также считать переменными, ничто не мешает нам иметь весьма гибкий и
мощный инструмент для исследования функций многих
переменных.
Таким образом, мы задали несколько простейших функций
и убедились в правильности их работы. Наиболее универсальной из них является полностью автономная функция
f3(x, a, b)
Эта функция, как и другие определённые пользователем
функции, может быть использована (в данном ВД) наравне
со встроенными функциями СКМ MathCAD.
Таким образом, главный вычислительный инструмент
MathCAD- набор функций - может быть неограниченно пополнен пользователем. И это пополнение позволяет существенно увеличить возможности MathCAD.
Кроме того,
некоторые встроенные функции MathCAD
(например, maximize, minimize) в обязательном порядке
требуют задания пользовательских функций. Для построения графика функции двух переменных также необходимо
задать соответствующую пользовательскую функцию.
Уровень сложности пользовательских функций может
быть произвольным!
Пример 6.
Рассмотрим ситуацию, когда в выражении для функции
встречаются встроенные функции и даже повторяющееся
подвыражение:
3
f ( X)
sin ( X)  Log 2 X
4
  sin ( X)  Log 2 X
Здесь, для более рациональной записи f(x) целесообразно
задать вспомогательную функцию:
3
3
st ( X)  sin ( X)  log ( X  2)
val1  24.129
2-й вариант - непосредственное вычисление значения
функции:
f ( X) 
st ( X)
  st ( X)
4
val2  f3 ( sin ( a  x  b)  tan ( sin ( x  b) )  a  x  b)
f ( 7)  0.058
val2  24.129
Точное сравнение полученных значений функции:
val1  val2  0
Задание для самостоятельной работы. Вычислить без
компьютера, а затем проверить в MathCAD, чему равны
значения
f3(b, x, a)
f3(b-3, x+4, 2x)
при
a=2
b=10
x=7
Тот, кто разобрался как следует с этой функцией, будет
уверенно работать со многими другими пользовательскими
(определяемыми) функциями.
На основе функции 3-х переменных, фиксируя 1 или 2 аргумента, можно задавать соответственно функции 2-х или 1го аргумента.
Например, задав функцию (3) и значения переменных
Проведём краткий анализ выражения для функции st(X).
Здесь для записи логарифма по основанию 2 использована
функция 2 –х аргументов log (X, 2) (аналогичная функция
имеется в Excel).
Запись sin(X)3 не содержит ошибок, так как функция является первичным объектом АВ и её значение вычисляется в
самую первую очередь (это операция высшего ранга!).
Однако, вполне приемлемой является и запись вида
(sin(X))3 , смысл которой уже не вызывает никаких сомнений.
Отметим также, что задавать функции, которые содержат
"внутри себя" другие пользовательские функции иногда
7
 В.Г. Афонин, декабрь 2009 г
приходится при самой постановке задачи. Такие задачи
встречаются, например, в строительной механике.
Оно будет уникальным не только для данного рабочего
листа, но и для всей рабочей книги.
Программирование арифметических формул.
Приведём теперь пример вычисления по формуле:
3
y
sin ( x ) 
3
c
 x 

 12 
2  arcsin 

log3 ( 5x )  r
 ctg ( 2x )
7.54
 x5
a7
( 1)
или
y
писать это имя в соответствии с общими правилами
записи имён.
y1 y3

 y5
y2 y4
Другими словами, данное пользовательское имя может
иметь только одна ячейка во всей рабочей книге.
Остальные операции над именами можно осуществлять
через
Вставка/Имя
/
(назначения вспомогательных величин y1, y2, y3, y4, y5
здесь вполне очевидны).
Исходные величины: х, а, с, r здесь считаются заданными;
их значения могут быть произвольными.
Запрограммируем эту формулу в 3-х вычислительных средах: Excel, VBA и MathCAD
1. Программирование формулы в Excel
Как обычно, для исходных данных х, а, с, r отведём ячейки,
расположенные в верхнем левом углу рабочего листа.
Сделаем теперь дополнительные пояснения относительно
имён ячеек. Без всяких проблем мы дали естественные
имена х и а ячейкам В1 и В2 соответственно. Однако,
остальные имена несколько отличаются от естественных.
Именно, вместо имён с и r мы дали имена сс и rr, так как
ввод имени с просто выделяет текущий столбец, а ввод
имени r выделяет текущую строку: (column - столбец, row –
строка). Далее, имена y1, y2, y3, y4, y5 закреплены за соответствующими ячейками столбца у, поэтому ячейкам D1,
D2, D3, D4, D5 мы присвоили имена y_1, y_2, y_3, y_4, y_5
соответственно.
Правее исходных данных будут находиться формулы для
вычисления y1, y2, y3, y4, y5, у
Замечание. Разумеется, можно было обойтись (частично
или полностью) без именования ячеек.
Отметим, что в Excel исходные данные, промежуточные и
окончательные результаты могут находиться в произвольных ячейках.
Например, можно ячейкам D1, D2, D3, D4, D5 не присваивать имена y_1, y_2, y_3, y_4, y_5 , а просто использовать
адреса ячеек D1, D2, D3, D4, D5 в заключительном выражении для y.
Например, исходные данные могут находиться после (ниже
и правее) формул, и при этом все вычисления будут выполняться нормально.
Но лучше всё же придерживаться определённой системы
расположения всех величин, помещая исходные данные в
левый верхний угол (в «начало») рабочего листа.
Фрагмент рабочего листа для наших вычислений приведён
ниже, на Рис. 1:
Рис.1. Фрагмент, который может служить образцом
оформления ЭТ для распечатки.
Здесь правее столбца D (в надписи, взятой из панели Рисование) приведены формулы, которые находятся в ячейках D1:D6.
Эти формулы, если начинать их с символа "
можно записывать и в ячейки ЭТ. Например, можно записать в двух соседних ячейках и вычисленный результат и
саму формулу: 222,3333333 "=222+1/3
Напомним, что для перехода в режим формул и обратно
достаточно нажимать клавиши
Ctrl+ `
(символ ` - «обратный апостроф» - находится под клавишей
Esc).
Для того, чтобы дать активной ячейке имя, достаточно
щёлкнуть по полю имени (левее строки формул) и про-
Можно было бы вообще не присваивать никаких имён ячейкам. Но это заметно снизило бы наглядность ВД.
Запрограммируем теперь для вычисления по формуле (1)
соответствующую пользовательскую функцию в VBA с использованием только операторов присваивания:
Public Function f_4(x, a, c, r)
y1 = (Sin(x)) ^ 3 - (c ^ (1 / 3))
y2 = 2 * Application.Asin(x / 12)
y3 = Log(5 * x) / Log(3) + r ^ (1 / 2)
y4 = (7.54 / (a + 7)) + Abs(x - 5)
y5 = Cos(2 * x) / Sin(2 * x)
f_4 = (y1 / y2) - ((y3 / y4) * y5)
End Function
‘*
Этот вариант имеет определённый недостаток.
Именно, в операторе с комментарием ‘ * при c<0 вычисления происходить не будут (почему?). Поэтому можно воспользоваться соответствующей функцией Excel с именем
Power, записав этот оператор в виде:
y1 = (Sin(x)) ^ 3 - Application.Power (c , (1 / 3))
‘*
(Как отмечалось ранее, в Excel корни нечётной степени из
отрицательных чисел извлекаются нормально.)
Программирование формулы (1) в MathCAD.
3
y
sin ( x ) 
3
c

log3 ( 5x )  r
 ctg ( 2x )
7.54
 x5
a7
( 1)
 x 

 12 
С помощью операторов присваивания задаём начальные
значения переменных с именами x, a, c, r:
x  2.789
a  123.57
c  3.57
r  41.85
С помощью операторов вывода проводим проверку:
2  arcsin 
x  2.789
a  123.57
c  3.57
r  41.85
Проведём вычисления по формуле (1) пятью разными способами:
1-й способ - с помощью оператора вывода:
8

В.Г. Афонин, декабрь 2009 г
3
3
sin ( x )  c log ( 5  x  3)  r

 cot ( 2  x )  7.938
7.54
 x 
2  asin 
 x5

a7
 12 
2-й способ - с помощью одного оператора присваивания:
3
z 
z1  2
5-й способ - на базе пользовательской функции с помощью
ПБ:
3 3
y  7.938
3
y1  sin ( x ) 
3
y1  1.57
 x 

 12 
y2  2  asin 
y2  0.469
y3  log ( 5  x  3) 
y4 
y3  8.868
r
7.54
 x5
a7
y4  2.269
y5  cot ( 2  x )
c
 x 

 12 
y3  log ( 5  x  3) 
y4 
7.54
a7
r
 x5
y5  cot ( 2  x )
y1
y2

y3
y4
 y5
f_y ( x  a  c  r)  7.938
y1 y3

 y5
y2 y4
c
y1  sin ( x ) 
y2  2  asin 
При этом вычисленное значение переменной у можно использовать в дальнейших вычислениях.
Поэтому 2-й способ существенно лучше 1-го.
Очевидными достоинствами 1-го и 2 -го способов является
их высокая наглядность. Однако, если выражение слишком
сложное, то его лучше всё же разделить на несколько более
простых.
3-й способ - с помощью нескольких операторов присваивания, когда одно сложное выражение разбивается на несколько простых:
y
z1 
z1  1
f_y ( x  a  c  r) 
3
sin ( x )  c log ( 5  x  3)  r

 cot ( 2  x )
7.54
 x 
2  asin 
 x5

a7
 12 
y 
Иллюстративный пример:
В этом операторе вывода функция f_y ( x  a  c  r)
содержит фактические аргументы x  a  c  r
Во многих случаях, особенно когда приходится исследовать
зависимости выходных величин от одного или нескольких
параметров,
5-й способ является наиболее эффективным.
Зафиксируем все аргументы, кроме а и с и построим график
функции 2-х переменных:
F_a_c ( a  c)  f_y ( x  a  c  r)
y5  1.175
 y1 y3


 y5 
y2
y4


y  
y  7.938
Здесь отслеживаются все промежуточные результаты вычислений. Кроме того, исходное выражение может содержать повторяющиеся подвыражения. В этом случае такое
разбиение даёт существенный дополнительный эффект.
Когда используется несколько операторов, можно использовать программный блок (ПБ).
4-й способ - с помощью ПБ:
ypb 
3
y1  sin ( x ) 
3
ypb  7.938
c
 x 

 12 
y2  2  asin 
y3  log ( 5  x  3) 
y4 
r
ypb  y  0
7.54
 x5
a7
y5  cot ( 2  x )
y1 y3

 y5
y2 y4
Можно сказать, что ПБ расположен в "своём" левом верхнем углу.
Значением ПБ является последнее (самое нижнее) выражение блока.
Достоинством ПБ является то, что в одно целое можно
объединить большую цепочку вычислений. Кроме того, все
промежуточные обозначения являются локальными, то
есть, они распространяются только на данный ПБ. А это
имеет определённые достоинства. Можно, например, спокойно использовать в ПБ произвольные обозначения, не
опасаясь того, что они пересекутся с уже имеющимися.
В то же время, значения промежуточных переменных в ПБ
нельзя увидеть и, следовательно, использовать.
F_a_c
Приложение 1. Встроенные функции MathCAD
Ниже рассмотрены наиболее употребительные элементарные и некоторые другие встроенные функции СКМ
MathCAD
(Звёздочкой помечены функции, для вставки которых имеются значки на панельке Calculator)
Математическая запись и
название функции
ex или exp (x) - экспонента
ln x - логарифм натуральный
lg x - логарифм десятичный
loga b - логарифм b
по основанию а
n! – n факториал (n! = 12 …n)
Запись в
MathCAD
ex * или exp (x)
ln(x)
*
log(x)
*
log(b, a) *
n!
*
9

n
В.Г. Афонин, декабрь 2009 г
x
x
- корень квадратный
x
- корень n – ой степени
sin x - синус
cos x - косинус
tg x
- тангенс
сtg x - котангенс
аrcsin x
- арксинус
arccos x - арккосинус
arctg x
- арктангенс
arcctg x - арккотангенс
n
*
x
sin(x)
cos(x)
tan(x)
cot(x)
asin(x)
acos(x)
atan(x)
acot(x)
*
*
*
*
Необходимо помнить, что при вычислении всех тригонометрических функций используется радианная мера угла!
Например:
sin ( 30)  0.988
(i
)  0.5быть задана
sin ( degи 180
f_y (sin
x  a( deg
 c  r)30
может
без)  0
всякого
ПБ. Каким радиан
образом?
При переводе
в градусы можно записать:
asin ( 0.5)
atan ( 1)
 30
 45
deg
deg
Напомним, что arcsin (0,5) – это угол, синус которого равен
0,5 , а arctg (1) – это угол, тангенс которого равен 1.
Замечание. MathCAD легко вычисляет все функции при
произвольных значениях аргументов: логарифмы и квадратные корни из отрицательных чисел, арксинус от чисел,
больших по модулю 1 и т.д. При этом результатами являются комплексные числа. Например:
ln ( 7)  1.946  3.142i
5  2.236i
asin ( 3)  1.571  1.763i
acos ( 7)  1.903  0.692i
Функция rnd (x) определена для любого значения х и выдаёт случайное число из интервала от 0 до х, причём каждое
такое число выдаётся с одинаковой вероятностью.
Функция round (x, n) выдаёт значение х, округлённое до n
цифр после десятичной точки. Пример:
ORIGIN  1
m  3
i  1  m
Ai  j  round ( 3  rnd ( 7)  2)
 6.44 7.9 4.03 3.99 


A   7.85 5.99 9.77 4.07 


 8.75 4.34 8.72 4.09 
Так можно формировать матрицы произвольной размерности со случайными элементами и проверять на них различные свойства матриц, их определителей, норм, чисел обусловленности и т.д.
Приложение 2. Встроенные функции Excel
Некоторые встроенные (стандартные) функции табличного процессора Excel и типичные ошибки в их записи.
(Символами ** в приведённой ниже таблице помечены ошибочные записи, при синтаксическом контроле которых Excel
выдаст сообщение об ошибке в виде #ИМЯ? )
Далее, имеется принципиальная разница между выражениями вида
1
3
3
lхl –
модуль х
x
если
õ0
Например,
3
27  3
но
( 27)
1
3
 1.5  2.598i
К этому вопросу мы ещё вернёмся позже.
Здесь же отметим, что в записи вида
n
x
значение n должно быть целым.
Особую роль в MathCAD играет функция |x|, значок которой
берётся с панельки Calculus.
Эта функция выполняется по – разному, в зависимости от
того, что собой представляет значение х. Если значение х –
обычное (вещественное) число, то просто вычисляется его
абсолютная величина. Если значение х – комплексное число вида a+bi, где i – мнимая единица,
n  4
j  1  n
Математическая
запись
и
2
И в заключение опишем две достаточно употребительные
функции MathCAD:
rnd (x) и round (x, n).
Исключение составляет операции типа деления на 0:
cot(0) = - выдаётся сообщение об ошибке.
x
2
a b
x
Если же х – вектор (в общем случае - с комплексными элементами), то вычисляется его модуль (или длина, или норма), равная сумме квадратов из модулей его элементов.
sin ( 180)  0.801
Для перевода градусов в радианы и обратно можно использовать встроенную константу с именем deg:

deg
0.01745
180
Например, при переводе градусов в радианы можно записать:
Замечание. Разумеется, функция вида
1) , то
ex или exp
(x)
(экспоненциал)
ln x логарифм
натуральный
lg x логарифм
десятичный
logab - логарифм b по
основанию а
n! – n факториал
(n! = 12 …n)
π
Правиль- Типичные ошибки и
комментарии.
ная заобласти существовапись
ния функций
в Excel
ABS(x)
Abc(x) **
- < x <
+
EXP (x)
exp ^ (x) , e ^ (x) , e ^ x **
- < x <
+
LN (x)
Ln x **
( x> 0)
LOG10 (x)
Lg (x) ,
Lg x **
( x> 0)
LOG (b; a)
ФАКТР(n)
ПИ ()
Log (a; b)
b>0, a>0, a
≠1
n!
n>0
Если n – дробь, то дробная
часть просто отбрасывается.
ФАКТР(0)=1
Значение π с 15 верными
значащими цифрами:
3,14159265358979
10

В.Г. Афонин, декабрь 2009 г
x
корень квадратный
sin x синус
cos x косинус
tg x тангенс
сtg x котангенс
аrcsin(x) арксинус
arccos x арккосинус
arctg x арктангенс
arcctg x арккотангенс
КОРЕНЬ
(x) или
x ^(1/2)
sqrt (x) **
x ^ 1/2 (грубейшая ошибка!)
sin x ** (нет скобок для
аргумента)
cos x ** (нет скобок для
COS (x)
аргумента)
tg (x) **
TAN (x)
- < x < +
TAN(ПИ()/2 )=
16324552277619100
cos(x)/sin(x соt (x) **
)
- < x < + x ≠ 0
или 1/tan(x)
ASIN (x)
Asin x , аrcsin(x) ** -1 
x 1
Acos x arccos (x) **
-1
ACOS (x)
x 1
ATAN (x)
Atan x
arctg (x) **
- <
x < +
ПИ () / 2 – Acot x arcctg (x) **
-
ATAN (x)
< x < +
SIN (x)
В заключение отметим две распространенные функции
Excel, не являющиеся общематематическими:
1. Функция СЛЧИС() – аналог rnd(1) в MathCAD – выдаёт
случайное число из интервала (0; 1).
Для получения случайного числа из
интервала (a ; b) можно записать выражение:
а+ СЛЧИС()*(b-a).
2. Функция ОКРУГЛ (x; n) – аналог round(x, n) в MathCAD.
Выдаёт значение х, округлённое до n цифр после запятой.
Примеры:
ОКРУГЛ(123,56;1) → 123,6
ОКРУГЛ(123,56; -2) →100
Примечание. Excel имеет множество других функций, в том
числе для работы с массивами и диапазонами. Некоторые
из них мы рассмотрим позже.
Имена наиболее распространённых математических
функций одинаковы в Excel, MathCAD, Derive, Maple,
Pascal, C и в других
вычислительных системах и средах программирования.
Основным исключением из этого правила является
язык Basic и, соответственно, Visual Basic.
Приведем теперь несколько практически важных Примечаний.
Примечание 1. Общие правила записи функций.
 Общая форма записи функции:
Имя_Функции (аргумент(ы));
Наличие круглых скобок для аргумента (ов) – обязательно!
 В качестве фактического аргумента можно использовать любое арифметическое выражение;
 Если аргументов несколько, они разделяются символом
; (точка с запятой);
 При наборе на клавиатуре после имени функции обычно сразу вставляют пару скобок, после чего между этими
скобками вставляют аргумент (ы);
Примечание 2. При извлечении корня любой степени (в том
числе и корня квадратного!) можно использовать известную
формулу:
1
n
x x
n
Поэтому, например, корень кубический из х можно записать
в виде: x^(1/3)
И это можно сделать не только в Excel, но и в любой компьютерной системе, за исключением Pascal!
Следует, однако, иметь в виду, что при возведении в
дробную степень транслятор автоматически использует формулу
a^b=exp(b*ln (a)),
которая не работает при a<0 (Почему?).
Поэтому при работе с вещественными числами возведение отрицательных чисел в дробную степень вообще
недопустимо. И это имеет место почти во всех компьютерных системах, включая обычный микрокалькулятор!
Однако, в Excel возведение отрицательных чисел в
степень (1/3), (1/5), … - вообще в степень (1/n) при нечетном значении n - выполняется нормально!
Примечание 3. Имеются формулы, связывающие обратные тригонометрические функции:
arctg (x) + arcctg(x)  /2
arcsin(x) + arccos (x)
/2
Отметим здесь же, что функции
arcsin(x) и arccos (x)
определены только для значений х из диапазона -1  х  1,
в то время,
как arctg (x) и arcctg(x) определены для всех значений х (- 
 х  ).
Примечание 4.
Необходимо постоянно помнить о том, что «по
умолчанию» во всех тригонометрических функциях
используется только радианная мера угла.
Для работы с углами в градусной мере в Excel имеются
специальные функции:
РАДИАНЫ (угол_ в_градусах) и
ГРАДУСЫ (угол_в_ радианах).
Например, выражение вида
SIN(РАДИАНЫ(30))
можно использовать для вычисления
SIN (300) (получим значение 0,5) ,
а выражение вида ГРАДУСЫ(ASIN(0,5)) – для представления в градусах значения arcsin(0,5). Здесь мы получим
значение 30 (градусов).
Рекомендация. Имена встроенных функций (как и другие
служебные слова) следует набирать в режиме строчных
("малых" букв). Если имя набрано верно, то Excel сам заменит строчные буквы на заглавные (прописные).
11
 В.Г. Афонин, декабрь 2009 г
Приложение 3. Встроенные функции языка VBA
Математическая
запись
lхl – модуль х
ex или exp (x)
ln x - логарифм
натуральный
Правильная
запись в
VBА
Abs(x)
Exp (x)
Log (x)
- корень
квадратный
sin x - синус
Sqr (x)
или
x ^(1/2)
Sin (x)
cos x - косинус
Cos (x)
x
Типичные ошибки и
комментарии
Abc(x) *
exp ^ (x) , e ^ (x) ,
e^x
Ln (x) * , Log x
Sqrt (x) *
x ^ 1/2 (грубая ошибка!)
sin x (нет скобок для
аргумента)
cos x (нет скобок для
аргумента)
tg (x) *
Atan (x) *
tg x - тангенс
Tan (x)
arctg x - аркAtn (x)
тангенс
* Будет выдано сообщение Sub or Function not defined
(Sub или Function не определена) и ошибочное имя
будет выделено подсветкой.
Отметим, что в VBA можно использовать встроенные
функции рабочего листа Excel, добавляя приставку Application. (Приложение.) или WorkSheetFunction. (ФункцияРабочегоЛиста.)
Например, arccos(0.7) можно записать в виде Application.acos(0.7) или в виде WorkSheetFunction.acos(0.7)
При использовании приставки WorkSheetFunction.
после ввода точки появляется меню, в котором указаны
имена функций рабочего листа. Application. таких подсказок не даёт, но работает со встроенными функциями рабочего листа Excel нормально.
Имена наиболее распространённых математических функций одинаковы в Excel, MathCAD, Derive, Pascal, C и других
вычислительных системах и средах программирования.
Основным исключением из этого правила является VBА, а
также VB6, QBasic и другие версии языка Basic.
Приведем теперь несколько практически важных Примечаний относительно записи функций, которых нет среди
встроенных в VBА.
Примечание 1. При работе в Basic существенную роль играют формулы, связывающие обратные тригонометрические функции:
arctg (x) + arcctg(x)  /2
arcsin(x) + arccos (x) /2
arcsin  x 

arctg 


2
1x 
x
На основе этих формул все обратные тригонометрические
функции можно выразить через функцию arctg (x), которая
имеется в VBА под именем atn(x).
Для вычисления значения  есть известная формула
 ≡ 4arctg (1)
на основе которой в VBА можно записать оператор присваивания вида
Pi = 4*Atn (1) )
Примечание 2. Для отыскания значения логарифма по любому основанию можно воспользоваться известной математической формулой:
Loga ( b)
Ln ( b)
Ln ( a)
В VBА последняя дробь записывается в виде:
Log (b)/ Log (a)
Рекомендация. Имена встроенных функций (как и другие
служебные слова) рекомендуется набирать в режиме
строчных ("малых" букв). Если имя набрано верно, то VBА
сам заменит первую "малую" (строчную) букву имени функции на заглавную (прописную).
Дополнение 1. Понятие невязки приближённого решения.
Понятие невязки (residual) приближённого решения и её
связь с погрешностью этого решения.
Погрешность приближённого решения –
это разность между этим решением и точным решением задачи.
Это определение является понятным и естественным, оно
применимо к любой задаче. Однако, вычисление погрешности приближённого решения в реальных задачах практически невозможно.
Вся трудность здесь в том, что точное решение, как правило, неизвестно (оно может быть известно только при отладке или тестировании, когда решается задача с заранее
известным ответом). Следовательно, неизвестной будет и
погрешность приближённого решения.
Погрешность приближённого решения
в реальных задачах неизвестна!
Понятие невязки тоже очень простое, и оно может быть
сформулировано следующим образом.
Пусть имеется какое-либо уравнение (или система уравнений).
Пусть найдено тем или иным способом приближённое решение этого уравнения (или системы уравнений).
Невязкой приближённого решения называется разность между левой и правой частями уравнения (или
системы уравнений), если вместо неизвестной величины подставить приближённое решение.
Очевидно, такая разность может быть вычислена всегда.
Поэтому, можно считать, что невязка приближённого решения в реальных задачах может быть (и должна
быть!) вычислена практически всегда. Как, правило, это
единственный способ получить представление о погрешности приближённого решения.
При решении одного уравнения невязка является числом, при решении системы уравнений невязка является
вектором. Как мы увидим далее, (и это интуитивно понятно!), чем меньше модуль невязки, тем меньше модуль погрешности приближённого решения.
Отметим, что если решается одно уравнение с одним неизвестным, то модуль невязки – это просто абсолютная величина разности между левой и правой частями уравнения
после подстановки в уравнение приближённого решения
вместо неизвестного.
Если же решается система уравнений, то модуль невязки –
это модуль разности между левой и правой частями системы уравнений после подстановки в эту систему приближённого решения вместо неизвестного.
Отметим, что модуль вектора с вещественными элементами – это корень квадратный из суммы квадратов его элементов. Если же элементы вектора – комплексные числа, то
модуль вектора - это корень квадратный из суммы квадратов его элементов.
(Модуль вектора называют также его длиной или нормой.)
Далее рассматриваются скалярные уравнения вида f(x)=C с
известными точными решениями. Для отыскания невязки
~ такого уравнения достаточно
приближённого решения x
~) - С. Если же С=0, то есть, решавычислить значение f (x
ется уравнение вида f(x)=0, то невязка – это просто значение f (x~) . Отметим здесь же, что любое уравнение вида
12
 В.Г. Афонин, декабрь 2009 г
r(x)=s(x) эквивалентно уравнению f(x)=0, если принять, что
f(x)=r(x)-s(x).
На следующих двух иллюстративных примерах рассматривается взаимосвязь между невязками и погрешностями
приближённых решений одного уравнения с одним неизвестным.
Пример 1. Уравнение х3 = 8 с известным решением х=2
Возьмём приближённое решение, равное 2.1, найдём для
него невязку и сравним её с погрешностью, равной 2.1 - 2 =
0.1
Невязка приближённого решения здесь равна 2.13- 8= 1.261
Отношение невязки к погрешности здесь будет равно
1.261/0.1=12.61
То есть, невязка больше погрешности почти в 13 раз.
Здесь vPribl – это вектор приближённых решений,
vPogr – это вектор погрешностей приближённых решений,
vNevjazok - это вектор невязок приближённых решений.
Вычислим теперь, во сколько раз невязки приближённых
решений больше погрешностей приближённых решений.
Для этого запишем отношение двух векторов с использование знака векторизации, что позволит выполнить поэлементное деление:
Чтобы проследить за тем, как меняется это соотношение при уменьшении погрешности приближённого решения, проведём следующие вычисления с использованием векторов.
0.1


 2.1 


3
vPribl   2.01 
vPogr  vPribl  2
vPogr   10  10 
 2.001 



4 
 10  10 
f ( x )  x
3
p1f ( x ) 
d
f (x)
dx
 13.23 

 
p1f ( vPribl)   12.12 
 12.012 


Очевидно, данный приём даёт положительный эффект!
Итак, для приближённого отыскания погрешности приближённого решения достаточно поделить невязку этого
решения на значение производной в точке приближённого
решения.
Это заключение можно получить из достаточно известной
формулы:
если х1  х0, то f(x1)-f(x0)  f '(x1)(х1-х0) (*)
Если принять за х0 точное, а за х1 – приближённое решение, то, учитывая, что f(x0)=0, мы получим из (*) приближённое равенство:
x0  x1 – f(x1) / f '(x1) (**)
Задание. Самостоятельно вычислить х0 по формуле (**)
для разных значений х1:
х1=2.1 х1=2.01 х1=2.001
и сделать соответствующие выводы.
Итак, в нашем примере невязка существенно превосходит
погрешность приближённого решения.
vNevjazok   0.120601 
 0.012006 


Пример 2. Другое уравнение с известным решением
х=2:
3
x
3
Точное решение: х=2
2
vNevjazok1 

  12.61 

 vNevjazok  

   12.0601 
 vPogr  

 12.006001 
Мы видим, что с уменьшением погрешности приближённого
решения отношение невязки этого решения к его погрешности стремится к числу 12. Это число равно значению производной функции f(x)=x3 в точке х=2. Можно доказать, что
такой факт имеет место для произвольной функции f(x)! Мы
видим, далее, что с уменьшением погрешности уменьшается и невязка приближённого решения. Но для нас здесь
важно другое – то, что с уменьшением невязки уменьшается погрешность приближённого решения. (Напомним, что нам всегда известна невязка, но неизвестна
погрешность приближённого решения.)
Более того, мы можем сделать следующее заключение.
После вычисления невязки можно получить приближённое значение погрешности приближённого решения, поделив эту невязку на производную функции в
точке приближённого решения.
Проверим это на нашем примере, сразу используя векторную запись:
 1.261 
3
vNevjazok  vPribl  8
3
vPribl 
3
0.021




3
vNevjazok1   2.096  10


4 
 2.1  10

2
  0.20658 

 vNevjazok1  

   0.20964 
vPogr

 

 0.20995 
3
3
Вывод: для уравнения x
2 невязки приближённых
решений примерно в 5 раз меньше погрешностей этих
приближённых решений
Общие выводы.
1. В зависимости от конкретной задачи, невязка приближённого решения может быть либо значительно меньше, либо
значительно больше погрешности этого приближённого решения.
2. Во всех случаях, чем меньше невязка приближённого
решения, тем меньше его погрешность. Но из малости невязки (которую всегда можно вычислить), вообще говоря,
ещё не следует малость погрешности приближённого решения.
А эта погрешность в реальных задачах практически всегда
остаётся неизвестной. Почему?
Аналогичные выводы можно сделать и в отношении систем
уравнений! Однако, как правило, если невязка приближённого решения достаточно мала, например, имеет порядок
10-13, то, если даже погрешность этого решения будет в
1000 раз больше невязки, эта погрешность будет иметь
порядок 10-10, то есть, погрешность приближённого решения также будет достаточно мала!
Итак, на практике можно (с определёнными оговорками)
всё же считать, что если мала невязка, то, как правило,
мала и погрешность приближённого решения.
После отыскания приближённого решения любых уравнений и систем необходимо вычислить соответствующую невязку и проанализировать её.
В заключение рассмотрим очень интересный пример неправильного решения простого уравнения х7=0 в MathCAD.
Точным решением этого уравнения является значение х=0
– это знает и школьник. Однако, MathCAD этого знать не
может: он просто решает поставленную задачу по определённым алгоритмам. Приняв в качестве начального приближения х=0.1, получим решение с помощью функции root:
7
7
x
0
x  0.1


root x  x  0.1
Мы видим, что искомое решение просто осталось равным
начальному приближению, а использование функции root
не дало никакого эффекта.
13
 В.Г. Афонин, декабрь 2009 г
Если вместо функции root использовать Given/Find или
надстройку «Поиск решения» в Excel, мы получим тот
же результат, что и с функцией root! Связано это с тем,
что достижение точности при вычислениях во всех этих
случаях определяется по величине невязки приближённого решения. В нашем случае для начального приближения х=0.1 эта невязка равна 0.17=10-7, то есть достаточно мала!
Невязка приближённого решения здесь заметно больше
обычной. Очевидно, такая потеря точности также вызвана
плохой обусловленностью СЛАУ!
Задание. Решить уравнение х7=0 с начальным приближением х=0.1 через вычислительный блок Given/Find в
MathCAD и через надстройку «Поиск решения» в Excel.
Дополнение 2. О числе обусловленности СЛАУ.
Число обусловленности СЛАУ – это число обусловленности
матрицы коэффициентов при неизвестных системы линейных алгебраических уравнений (СЛАУ). Если это число велико, то есть, имеет порядок более высокий, чем 10 2 – 103 ,
то СЛАУ считается плохо обусловленной. А это означает,
что малые изменения в правой части СЛАУ приводят к
большим изменениям в решении СЛАУ. Такая неустойчивость может, например, указывать на неустойчивость самой
механической системы, при расчёте которой встретилась
данная СЛАУ. А это заключение уже может иметь серьёзное практическое применение.
Ниже приводится фрагмент ВД, содержащий простой, но
весьма показательный пример.
Этот пример убедительно доказывает, что весьма желательно при решении СЛАУ находить её число обусловленности! Пример этот широко известен; его можно найти в
Интернет – ресурсах.
Пример плохо обусловленной системы
Рассмотрим и решим следующую СЛАУ:
100  x  99y
199
99  x  98y
197
 100 99 

 99 98 
A  
 199 

 197 
b1  
x_y1  A
1
1

1
x_y1  
 b1
 1   3.638  10  12 


1 
0

x_y1  
A  x_y1  b1  5.119  10
 10
Мы получили достаточно точное решение, хотя норма невязки
заметно больше обычной
Вычислим определитель и число обусловленности СЛАУ:
A  1
conde ( A)  3.921  10
4
Определитель обычный, но число обусловленности велико.
Значит, решение СЛАУ может сильно измениться при малых
изменениях правых частей. Решим теперь следующую СЛАУ:
100  x  99y
198.99
99  x  98y
197.01
 100 99 

 99 98 
 198.99 

 197.01 
A
x_y2  A
1
 b2
A  x_y2  b2  4.476  10
b2  
 2.97 

 0.99 
x_y2  
 10
Решение чуть-чуть изменённой СЛАУ кардинально
отличается от решения исходной СЛАУ!
14
Download