- •Пакет прикладных программ mathematica
- •2. Точные и приближенные вычисления. Численные и аналитические операции
- •3. Рабочий документ и ячейки. Основные команды
- •4. Сеанс работы в системе Математика. Глобальный характер данных
- •5. Правила написания. Основные встроенные функции
- •Примеры выражений
- •Формы обращений к функциям
- •Нескольких аргументов
- •6. Функции комплексного аргумента
- •Логические операторы
- •7. Циклические операции
- •7.1. Цикл For
- •7.2. Цикл While
- •7.3. Цикл Do
- •7.4. Функция If
- •7.5. Логические выражения
- •8. Функции пользователя. Составление программ
- •8.1. Функции пользователя. Описания типов аргументов
- •8.2. Немедленное и задержанное присваивание
- •8.3. Альтернативные определения функций
- •8.4. Составление программ. Глобальные и локальные переменные
- •8.5. Прерывание вычислений
- •9. Списки
- •9.1. Создание списков. Обращение к элементам списков
- •9.2. Преобразование списков
- •9.3. Матричные функции
- •10. Массивы
- •11. Основные типы графиков
- •11.1. Двумерные графики
- •Show[GraphicsRow[{g1, g2,…}], options]
- •11.3. Изображения трехмерных объектов
- •11.4. Анимация
- •12. Функция Manipulate
- •13. Аналитические операции. Интерполяция. Решение уравнений
- •13.1. Аналитические операции
- •13.2. Интерполяция
- •13.3. Решение алгебраических уравнений
- •13.4. Решение дифференциальных уравнений
- •14. Преобразование выражений
- •14.1. Стандартная форма выражений
- •Примеры выражений
- •14.2. Обращение к элементам выражений
- •14.3. Представление выражения в виде дерева
- •14.4. Операции преобразования выражений
- •14.5. Повторное выполнение операций
- •14.6. Анонимные функции
- •14.7. Функциональные операторы Outer и Inner
- •Вопросы для повторения
- •Упражнения
8.3. Альтернативные определения функций
Рассмотрим альтернативные определения функций.
Пример 8.5.
Определим двумя способами функцию, принимающую значение x2 при x>0 и значение –x2
при x<=0.
1). Определение из двух частей: In[]:= g[x_/;x>0] = x^2; g[x_/; x<=0] = -x^2;
2). Определение с использованием условной функции If: In[]:= g1[x_] = If[x>=0, x^2, -x^2];
Пример 8.6.
Определим функцию: f[x_]=Sin[x]/x; Если ограничиться этим описанием, то функция оказывается неопределенной в точке x=0, так как в пакете Математика пределы автоматически не вычисляются. Поэтому в точке x=0 функцию требуется доопределить:
In[]:= g[x_]=If[x==0, 1, Sin[x]/x];
Данная функция определена на всей оси x.
Если описание функции включает более одной альтернативы, то для ее определения удобнее пользоваться функцией Which. Синтаксис этой функции:
Which[test1, value1, test2, value2, …] – поочередно проверяется выполнение условий test; возвращается значение value, соответствующее первому истинному условию. Можно ввести значение по умолчанию, сделав последнее условие истинным.
Пример 8.7. Определим “кусочно линейную” функцию:
g3[x_] = Which[x < -1, -1, -1 <= x <= 1, x, x > 1, 1];
В этом определении может быть использован любой из операторов присваивания.
8.4. Составление программ. Глобальные и локальные переменные
Рассмотрим вопросы составления программ. Простейшая программа может представлять собой заключенную в скобки последовательность операторов, разделенных знаком “;”. Подобная программа дана в примере 8.3. Рассмотрим еще один пример.
Пример 8.8.
Составим программу для вычисления значения экспоненты с заданной точностью. Будем последовательно вычислять сумму членов Маклорена до тех пор, пока очередное слагаемое не станет меньше допустимой погрешности. Для этого напишем следующую программу:
In[ ] := ex[x_, eps_] := ( For[ u=1.; e=1.; k=1, Abs[u]>eps, u=u*x/k; e=e+u; k++ ]; e)
Если мы теперь напишем вопрос: In[ ] := ex[1., 10^-5], то получим ответ: Out[ ] = 0.367882. Можем убедиться, что погрешность действительно не превышает , вычислив разность:
In[ ] := ex[1, 10^-5] - E Out[ ] =
В программах подобного типа все переменные являются глобальными. Их значения доступны из любого места рабочего документа. Например, на вопрос In[ ] := k получим ответ “10” – количество членов ряда, обеспечивающее в данном случае требуемую точность.
Наличие глобальных переменных таит в себе возможность ошибки из-за конфликтов между значениями переменных. Поэтому более надежный путь – создание программ с локальными переменными. Синтаксис такой программы:
Module[{x, y, …}, expr].
В этом выражении {x, y, …} – список локальных переменных, expr – тело программы. Список может включать инициализацию переменных: {x=x0, y=y0,…}. Названия локальных переменных могут совпадать с именами глобальных, так как при каждом обращении к программе вместо объявленных локальных имен создаются новые имена. Тело программы может включать несколько команд. Каждая команда за исключением последней, включающей результат работы программы, отделяется от последующей точкой с запятой. (Вспомним, что точка с запятой является знаком запрета вывода результата.)
Использование локальных и глобальных переменных проиллюстрируем следующим примером рабочего сеанса. Введем вначале глобальную, а затем локальную переменную с тем же именем. In[1] := t=5;
In[2] := Module[ {t=10}, t ] Out[2] = 10
Глобальная переменная сохраняет свое значение:
In[3] := t Out[3] = 5
Введем локальную функцию с тем же именем t:
In[4] := f[x_] := Module[ {t}, t[x] = x^2 ]
In[5] := f[x] Out[5] = x2
Можно убедиться, что глобальная переменная t по-прежнему сохраняет свое значение
Пример 8.9.
Преобразуем программу вычисления экспоненты. Поскольку инициирование значений локальных переменных проведем при их объявлении, то вместо цикла For будем использовать цикл While.
In[] := ex1[x_, eps_] := Module[ {w=1., s=1., i=1}, While[ Abs[w]>eps, w=w*x/i; s=s+w; i++ ]; s ]
В этой программе все переменные являются локальными.
Пример 8.10.
Вычисление квадратного корня числа “x” с помощью процесса Герона. Алгоритм представляет собой итерационный процесс. Сначала задается некоторое начальное приближенное значение, например, y0 = x +1. Затем это значение уточняется в ходе последовательных итераций по формуле: yn+1 = (yn + x/yn)/2. Процесс вычислений заканчивается, если два последующих значения отличаются не более чем на величину допустимой погрешности. Поскольку при данном выборе начального значения процесс итераций описывает монотонно убывающую последовательность: y0 > y1 > y2 > … , – то нет необходимости в использовании функции Abs[ ]. Программа имеет вид:
In[ ] := root2[x_, eps_] := Module[ {u, v},
For[ u = x + 1.; v = (u + x / u) / 2, u –v > eps, u = v; v = (v + x / v) / 2 ]; v ]
Примеры более сложных программ приведены в приложении