как переопределить системную функцию

Форум пользователей пакета Mathematica

Модератор: Admin

tutm
Сообщения: 5
Зарегистрирован: Чт дек 27, 2012 6:24 pm

как переопределить системную функцию

Сообщение tutm » Вт май 28, 2013 1:38 pm

Пытаюсь переопределить в пакете расширения функцию :
типа 1/{t_,x_,y_,z_} должнна выдать {t,-x,-y,-z}/( {t,x,y,z}.{t,x,y,z} )
или 1/q_ ^:= q/(q.q)
или Power[q_?test, -1] ^:= {1, -1, -1, -1} q/(q.q) ;

Но ничего не меняется

Уточню задау - переопределить именно системную функцию ,а не опрределить в пакете свою вроде inv[q_]=expr

Возможно ли такое

PhD
Сообщения: 14
Зарегистрирован: Чт июн 13, 2013 7:09 pm
Откуда: Киев

Сообщение PhD » Пт июн 21, 2013 10:07 pm

Данная проблема разрешима за определенными исключениями. Лучше всего я позаимствую абзац из мастер-класса Аладьева, исключая места, которые могут быть предметом авторского права.
=======
Mathematica
не позволяет переопределять или доопределять те функции, которые используются в определениях других системных средств. В частности, при попытке сделать это относительно системной функции Rule из текущего сеанса удаляются определения всех средств из пакетов пользователя, загруженных в систему, однако переопределения или доопределения функции Rule не производится. Поэтому в случае необходимости расширить функциональность стандартного средства данного типа следует наделять его другим именем, тогда как его заголовок в качестве одного из вариантов должен допускать кортежи фактических аргументов, которые присущи оригиналу. В этом случае вместо стандартного можно везде использовать его замену. Ниже был приведен исходный код с примерами применения процедуры Rule1, доопределяющей функцию Rule……

Однако, например, системные функции с атрибутом NumericFunction пользователь имеет возможность доопределять, как иллюстрирует пример доопределения встроенной функции Sin.

In[1237]:= ClearAttributes[Sin, Protected]
In[1238]:= Sin[x___] := If[Length[{x}] == 1 && ! ListQ[x], Sqrt[1 – Cos[x]^2], If[Length[Flatten[{x}]] > 1, Plus[Sequences[Map[Sqrt[1 – Cos[#]^2] &, Flatten[{x}]]]], $Failed]]
In[1239]:= SetAttributes[Sin, Protected]
In[1240]:= Definition[Sin]
Out[1240]= Attributes[Sin] = {Listable, NumericFunction, Protected}
Sin[x___] := If[Length[{x}] == 1 && ! ListQ[x], Sqrt[1 – Cos[x]^2], If[Length[Flatten[{x}]] > 1, +Sequences[(Sqrt[1 – Cos[#1]^2] &) /@ Flatten[{x}]], $Failed]
In[1241]:= Sin[56.14]
Out[1241]= 0.397387
In[1242]:= Sin[a, b, c]
Out[1242]= Sqrt[1 – Cos[a]^2] + Sqrt[1 – Cos^2] + Sqrt[1 – Cos[c]^2]
In[1243]:= Sin[{a, b, c}]
Out[1243]= {Sqrt[1 – Cos[a]^2], Sqrt[1 – Cos[b]^2], Sqrt[1 – Cos[c]^2]}
In[1244]:= Sin[]
Out[2044]= $Failed

Вызов [b]Sin[x]
эквивалентен вызову Sin[x] встроенной функции, тогда как вызов Sin[x, y, z, …] возвращает Sin[x] + Sin[y] + Sin[z] +…, а вызов Sin[{x, y, z, …}] возвращает {Sin[x], Sin[y], Sin[z], …}; вызов Sin[] возвращает $Failed. При этом, отсутствует негативная реакция системы на загруженные средства пакетов пользователя и вывод сообщений об ошибках.
======
Рекомендую просмотреть книги Аладьева по этой теме, возможно, там есть детализация. К сожалению, я располагаю лишь одной, в ней этого нет.