Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инстр_Mathem_v8.doc
Скачиваний:
4
Добавлен:
16.11.2019
Размер:
1.91 Mб
Скачать

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 ]

Примеры более сложных программ приведены в приложении