Задание математических отношений
Символьные преобразования – при всей их кажущейся таинственности осуществляются по определенным, хотя и весьма многочисленным, а потому для нас запутанным, правилам. Основные из них давно известны из математики и описаны в многочисленных справочниках и монографиях. Они записаны в ядре системы и вызываются из него при создании условий, необходимых для выполнения того или иного преобразования. Если этих условий нет, исходное выражение просто повторяется. А если обнаружена явная ошибка в преобразованиях, то о ее сути выводится соответствующее сообщение. При ситуациях, лишь близких к ошибочным, выводится предупреждающее сообщение, и вычисления продолжаются.
Однако математика и использующие ее науки непрерывно развиваются. Появляются все новые и новые правила преобразований. Пользователь-математик может пожелать изменить встроенные правила преобразований – например, для создания новых разделов математики, базирующихся на каких-либо новых представлениях. Блестящий пример этого – теория относительности Эйнштейна.
Таким образом, возникает необходимость расширения математических символьных систем и обучения их новым правилам математических преобразований. Система Mathematica имеет и такие возможности. Поясним на простых примерах, как это делается.
В математике можно найти множество примеров математических отношений. Например, хорошо известно такое отношение для логарифма и экспоненциальной функции:
log(exp(x))
=
x
Не обременяя себя поиском действительно новых закономерностей (порой на это может не хватить жизни, да и везет не каждому ученому), зададим приведенную закономерность для введенных по-новому функций log и ехр. Центральным моментом тут является введение новых имен функций, которые начинаются с малых букв, а не с больших, как у встроенных функций Log и Ехр. Поэтому система воспринимает log и ехр как новые функции.
Итак, вводим "новую" закономерность следующим образом:
log[exp[x_]] :
=
x
General::spelll: Possible spelling error:
new
symbol name
"log"
is similar to existing symbol
"Log"
.
General::spelll: Possible spelling error:
new
symbol name
"exp"
is similar to existing symbol
"Exp"
.
Система на всякий случай сообщает о рискованности эксперимента – символы log и ехр похожи на зарезервированные имена функций Log и Ехр. Проигнорировав это предупреждение, проверим введенную закономерность в работе.
Ввод (In) | Вывод (Out) |
---|---|
log [exp [15]] | 15 |
1оg[ехр[у^2+1]] | 1+y2 |
Итак, наша "новая" закономерность работает. Можно ввести, скажем, и такое известное отношение:
log[x_
^
n_] :
=
n
*
log[x]
Проверим, какие отношения заданы нами для функции log:
?log
Global log
log[exp[x_]] :
=
x
log[x_n
-
] :
=
n log[x]
Проверим введенные правила, например, так:
5log
[[
1
+
x]
^
5
]
5log
[
1
+
x]
Рассмотрим еще пару примеров задания "новых" математических правил. В первом примере задано правило – логарифм произведения равен сумме логарифмов сомножителей:
log[x_
*
y_] :
=
log[x]
+
log[y]
Любопытно, что эта закономерность действует при любом числе сомножителей:
log[a
*
b
*
c
*
d
*
e]
log[a]
+
log[b]
+
log[c]
+
log[d]
+
log[e]
Второй пример иллюстрирует задание объекта, ассоциированного со списком:
a
/
: a[x_]
+
a[y_] :
=
a[x
+
y]
a[x]
+
a[y]
+
a[z]
a[x
+
y
+
z]
Введенные здесь обозначения х_, у_ и n_ представляют собой образцы, на место которых могут подставляться произвольные выражения. Позже мы обсудим применение образцов более детально.
Примечание:
Описанные выше примеры наглядно демонстрируют возможности выполнения так называемого математического программирования, в основе которого лежит задание определенных математических соотношений между математическими понятиями, прежде всего такими, как функции.