Записи с меткой «примеры»

Понятие о контекстах

Понятие о контекстах
Для разрешения подобных противоречий в системе Mathematica введен особый механизм контекстов. Напомним, что под контекстом подразумевается некоторое разъяснение характера связанных с контекстом объектов. Другими словами, это означает, что с каждым объектом системы Mathematica (например, с переменными или функциями) связан некоторый контекст. Чисто внешне контекст задается в виде Имя_контекста (обратный апостроф в конце имени и есть признак контекста).
Итак, контекст фактически является некоторым признаком объекта. Каждый объект системы Mathematica имеет свой контекст, который записывается перед именем объекта (знак «’» при этом является разделителем). Обычно он не виден, но существует. Объекты с одинаковыми именами могут иметь разные контексты и действовать по-разному — то есть по контексту. Пользователям полезно усвоить такую аналогию: контексты — это как бы разные папки со своими именами, куда могут помещаться одноименные файлы-объекты. далее…

Условные выражения и безусловные переходы

Условные выражения и безусловные переходы
Для подготовки полноценных программ помимо средств организации циклов необходимы и средства для создания разветвляющихся программ произвольной структуры. Обычно они реализуются с помощью условных выражений, позволяющих в зависимости от выполнения или невыполнения некоторого условия (condition) выполнять те или иные фрагменты программ.
Функция IF
Как у большинства языков программирования, условные выражения задаются с помощью оператора или функции IF. Система Mathematica имеет функцию If, формы которой представлены ниже:

  • If [condition, t, f] — возвращает t, если результатом вычисления condition является True, и f, если результат равен False;
  • If [condition, t, f, u ]—то же, но дает и, если в результате вычисления condition не было получено ни True, ни False.

Следующий пример показывает создание программной процедуры с циклом Do, выход из которой реализуется с помощью функции I f и директивы прерывания Aborted! ]:
х := 1; Print["i x"];
Do[{If [i == 5, Abort[], None],
i += 1; x += 2*i; Print[i, " ", N[x]]},
{i, 1, 100}]
i x
2 5
3 11.
4 19.
5 29.
$Aborted
Return[x]
Return[1]
Тот же пример, но с применением директивы выхода из цикла Break [] в функции If показан ниже:
х := 1; Print["i x"];
Do[{If [i == 5, Break[], None],
i += 1; x += 2*i; Print[i, " ", N[x]]},
{i, 1, 100}]
i x
2 5.
3 11.
4 19.
5 29.
Return[x]
Return[29]
В данном случае никаких специальных сообщений о выходе из цикла не выдается. Функция If обеспечивает ветвление максимум по двум ветвям программы. далее…

Циклы типа For

Циклы типа For
Другой вид цикла — цикл For — реализуется одноименной функцией:
For[start, test, incr, body]
В ней сначала один раз вычисляется выражение start, а затем поочередно вычисляются выражения body и incr до тех пор, пока условие test не перестанет давать логическое значение True. Когда это случится, то есть когда test даст False, цикл заканчивается.
Следующий пример показывает создание простой программы с циклом For и результат ее выполнения:
Print["i x"]
For [x=0; i=0, i < 4, i++
[x += 5*i, Print[i, " ", x]]]
i x
15 ,
2 15
3 30
4 50
Return[x]
Return[50]
Программа, приведенная выше, позволяет наблюдать за изменением значений управляющей переменной цикла i и переменной х, получающей за каждый цикл приращение, равное 5*i. В конце документа показан пример на использование функции возврата значений Return [x]. В цикле For не предусмотрено задание локальных переменных, так что надо следить за назначением переменных — при использовании глобальных переменных неизбежны побочные эффекты.
Циклы типа While
Итак, функция For позволяет создавать циклы, которые завершаются при выполнении (эволюции) какого-либо условия. Такие циклы можно организовать и с помощью функции While [test, expr], которая выполняет expr до тех пор, пока test не перестанет давать логическое значение True.
Ниже дан практический пример организации и использования цикла While:
i := 1; х := 1; Print["i x"] ;
While[i < 5, i += 1; x += 2*i; Print[i, " ", N[x]]]
i x
2 5.
3 11.
4 19.
5 29.
Return[x]
Return[29]
Циклы типа While, в принципе, могут заменить другие, рассмотренные выше, типы циклов. Однако это усложняет запись и понимание программ. Аппарат локальных переменных в этом типе циклов не используется. далее…

Реализация рекурсивных и рекуррентных алгоритмов

Реализация рекурсивных и рекуррентных алгоритмов
Рассмотрим несколько простых примеров, выявляющих суть функционального программирования. Вначале это будет пример, в котором задана функция sen [х, n], вычисляющая сумму синуса в степени n и косинуса в степени n:
scn[x_, n_] := Sin[x]^n + Cos[х]^n
scn[l, 2]
1
scn[x, 2]
1
scn[x, n]
Cos[x]n+ Sin[x]n
В этом простейшем примере результат вычислений есть возвращаемое функцией sen значение — численное или символьное. В свою очередь, функция sen в своем теле имеет встроенные функции синуса и косинуса.
Важное место в решении многих математических задач занимают реализации рекурсивных и рекуррентных алгоритмов. далее…

Анонимные функции

Анонимные функции
Предельно компактную форму задания имеют так называемые анонимные функции. Они не имеют ни названия, ни обычного определения и задаются только выражениями специального вида. В этом выражении вместо переменных используют обозначения # (для одной переменной) или #1, #2, … (для ряда переменных). Завершается тело функции символом «&». Если надо вычислить функцию, то после ее записи в квадратных скобках указывается список фактических параметров.
Для нашего примера анонимная функция выглядит так:
#1^#2 &[2, 3]
8
#1^#2 &[у, z]
y^z
С помощью анонимных функций нетрудно создавать обычные функции пользователя:
f[x_, y_] = #1^#2 &[х, у]
хy
f[2, 3]
8
Несмотря на то что применение анонимных функций открывает возможности компактного задания многих функций, эта форма едва ли интересна для большинства читателей — они наверняка предпочтут пусть немного более длинное, но значительно более очевидное задание функций другими способами. далее…

Функция приведения Collect

Функция приведения Collect
К операциям, расширяющим выражения, относится также функция Collect:

  • Collect[expr, x]— выполняет приведение общих членов выражения по степеням переменной х;
  • Collect [expr, {x1, x2, …}]— выполняет приведение общих членов выражения по степеням переменных xl, х2, …

Эта операция особенно полезна, если результат можно представить в виде степенных многочленов. Проиллюстрируем это следующими примерами.

Ввод (In)

Вывод (Out)

Collect [%, x]

-5x+5x 2 -x 3 + x 4

expr = (5 + x ^ 2) * (x- 1) *x

(-1 + x) x(5 + x 2 )

Collect [a *x ^ 2 +b*x*y+c*y+d*y ^ 2, y]

ax + (c+ bx) y+ dy 2

Collect [a *x ^ 2+b*x*y + c*y+d*y ^ 2, x]

ax + cy+ bxy+ dy 2

Collect[ (x — 1) * (x — 2) * (х^2 — 9) , x]

-18-27х-7х 2 -Зх 3 + х 4

Следующий пример показывает применение функции Collect к выражению с двумя переменными:
Collect[(х-1)*(у-3)*(х-2)*(у-2)*(х-1),у,х]
-12.+ 30х-24х2+ 6х3 + (10-25х + 20Х2- Sx3) y+
(-2+ 5х-4х2 + х3) у2
Разумеется, как и в случае упрощения выражений, их расширение не является однозначной операцией и предполагает наличие определенных условностей. Опытный пользователь, используя опции функций, обычно без труда может получить результат в нужной форме.
Функции преобразования тригонометрических выражений
Хотя представленные выше функции иногда применимы для тригонометрических выражений, для последних есть ряд специальных функций, дающих более надежные результаты в ходе преобразований тригонометрических функций. В названии этой группы функций имеется слово Trig. Начнем с функции Trig-Expand [expr ], которая обеспечивает расширение выражения ехрг, содержащего тригонометрические и гиперболические функции. Представленные ниже примеры иллюстрируют работу этой функции:
TrigExpandfSin[а+b]]
Cos[b] Sin[a] +Cos[a] Sin[b]
TrigExpand[Cos[3*x]] TrigExpand[Cos[3*x]]
Cos[x]3-3Cos[x] Sin[x]2
TrigExpand[Sinh[2^x]]
2Cosh[x] Sinh[x]
TrigExpand[Sin[Cos[Tan[x]^2]]]
Cos[1/2Cos[Tan[x]2] + 1/2ISin[Tan[x]2]
Sin[1/2Cos[Tan[x]2] — 1/2ISin[Tan[x]2]
Cos[1/2Cos[Tan[x]2] — 1/2ISin[Tan[x]2]
Sin[1/2Cos[Tan[x]2] + 1/2ISin[Tan[x]2]
TrigExpand[Sin[2*x]-Cos[3*x]^2]
1/2 Cos[x]6/2+2Cos[x] Sin[x] + 15/2Cos[x]4Sin[x]2
15/2Cos[x]2/Sin[x]4+Sin[x]6 /2
TrigExpand[Sin[2 ArcCoth[t]]]
2 Cos [ArcCoth[ t] ] Sin[ArcCoth[ t] ]
Следующие две функции обеспечивают взаимные преобразования экспоненциальных и тригонометрических выражений:

  • TrigToExp [expr] — преобразует тригонометрические выражения к экспоненциальному виду;
  • ExpToTrig [expr] — преобразует экспоненциальные выражения в тригонометрические.

Примеры применения этих функций:
TrigToExp[Cos[z]]
1/2( EIz+EIz)
ExpToTrig [ % ]
Cos [ z]
f := Sinh[z] + Cosh[z] TrigToExp[f]
Ez
ExpToTrig[%]
Cosh[z] + Sinh[z]
TrigToExp[Sin[x]/Cos[y]]
I (E-IX- EIX)/(E-IX+ EIX)
ExpToTrig[%]
Sec[y] Sin[x]
Приведем еще две функции:

  • TrigFactor [expr] — раскладывает на простые множители тригонометрическое выражение ехрr;
  • TrigFactorList [expr] — раскладывает тригонометрическое выражение ехрг на списки с термами выражения.

Следующие примеры показывают применение этих функций:
expr = TrigExpand[Sin[a + b]^3]
3/4Cos[b] Sinfa] — 3/4 Cos [a]2 Cos [b]3 Sin [a] +
1/4 Cos[b]3Sin[a]3 + 3/4 Cos[a] Sin[b]-
3/4Cos[a]3Cos[b]2Sin[b] +9/4 Cos[a] Cos[b]2Sin[a]2 Sin[b] +
9/4 Cos[apCos[b] Sin [a] Sin[a]2-3/4 Cos[b] Sin[a]-3 Sin[b]2 +
1/4Cos[a]3Sin[b]3-3/4 Cos[a] Sin[a]2Sin[b]3
TrigFactor[expr]
Sin[a+b]3
TrigFactorList[expr]
{{1, 1}, {Sin[a+b] , 3}}
TrigExpand[Cosh[Sin[x*y]]]
Cos[1/2 Cos[xy] — 1/2 ISin[xy]] Cos[1/2 Cos[xy] + 1/2 ISin[xy]]
Sin[1/2Cos[xy] -1/2 ISin[xy]] Sin[1/2 Cos[xy] + 1/2 ISin[xy]]
TrigFactorList[%]
{{1, 1}, {Cosh[Sin[xy]], 1}}
Наконец, функция TrigReduce [expr] упрощает выражения с произведениями тригонометрических функций. далее…