Язык Wolfram Language

Расширенный доступ к базе знаний Wolfram Knowledgebase

Входные функции сети

Язык программирования содержит более 300 встроенных математических функций. Рассмотрим операцию дифференцирования, применяемую к каждой из этих функций. В большинстве случаев, одна или несколько новых функций появляются в качестве производных. Количественный анализ связей между функциями поможет нам получить представление о взаимосвязи между символами и операциями в Wolfram Language. В частности, следующий пример иллюстрирует процесс получения сети функций, которая возникает на базe дифференцирования низкого порядка.

Согласно элементарному курсу математического анализа, путем дифференциации натурального логарифма, получим производную функцию.

In[1]:=
Click for copyable input
D[Log[x], x]
Out[1]=

С другой стороны, для выполнения определенных функций, производная может быть выражена непосредственно через исходную функцию.

In[2]:=
Click for copyable input
D[ProductLog[x], x]
Out[2]=

Свойство "LowOrderDerivatives" функции MathematicalFunctionData обеспечивает быстрый и удобный доступ ко всем инструментам для работы с производными.

In[3]:=
Click for copyable input
Entity["MathematicalFunction", "EllipticF"][ EntityProperty["MathematicalFunction", "LowOrderDerivatives"]] // TraditionalForm
Out[3]//TraditionalForm=

Соберем все необходимые функции и их аргументы для того, чтобы определить функцию после дифференциации. Например, на основе уравнения, sec^'(x)=tan(x) sec(x), функция Sec включает в себя функции Tan, а также саму себя, в результате чего мы получаем два соединения функций.

код на языке Wolfram Language целиком
In[4]:=
Click for copyable input
allFunctions = DeleteCases[MathematicalFunctionData[], Entity["MathematicalFunction", "Sqrt"] | Entity["MathematicalFunction", "Power"]];
In[5]:=
Click for copyable input
patts = EntityValue[allFunctions, EntityProperty["MathematicalFunction", "ArgumentPattern"]];
In[6]:=
Click for copyable input
toPattern[p_] := Activate[Hold @@ { p /. Verbatim[PatternTest][a_, b_] :> a /. Verbatim[Alternatives][a_, __] :> a /. Verbatim[Blank][_] :> _}]
In[7]:=
Click for copyable input
pairs = {#1, toPattern[#2]} & @@@ Transpose[{allFunctions, patts}];
In[8]:=
Click for copyable input
(identify[#2] = #1) & @@@ pairs;
In[9]:=
Click for copyable input
makeConnection[f1_, id_] := Module[{indices, heldSubexpressions, f2List, \[ScriptCapitalF]\[GothicCapitalF]}, indices = Quiet[Cases[ MapIndexed[\[ScriptCapitalF]\[GothicCapitalF], id, {0, \[Infinity]}], _\[ScriptCapitalF]\[GothicCapitalF], \ \[Infinity]][[All, -1]]]; heldSubexpressions = Union[Extract[id, indices, Hold]]; f2List = Union[Last /@ DeleteCases[({#1, identify[#1]} & /@ heldSubexpressions), {_, _identify}]]; {f1 \[DirectedEdge] #, id /. HoldPattern[Function[_, Inactivate[x_]]] :> HoldForm[x]} & /@ f2List]
In[10]:=
Click for copyable input
makeConnection[Entity["MathematicalFunction", "Sec"] , Function[{x}, Inactivate[D[Sec[x], x] == Sec[x] Tan[x]]]]
Out[10]=

Проанализируем производные и визуализируем полученную структуру на графике.

код на языке Wolfram Language целиком
In[11]:=
Click for copyable input
\[Lambda]F = Length[allFunctions]; Monitor[ allConnections = Table[ fD = allFunctions[[\[ScriptJ]]]; derivatives = Activate[ allFunctions[[\[ScriptJ]]][ EntityProperty["MathematicalFunction", "LowOrderDerivatives"]] /. HoldPattern[Power[E, z_]] :> Exp[z]]; connections = If[derivatives === Missing["NotAvailable"], {}, {#[[1, 1]], SortBy[#[[All, -1]], LeafCount]} & /@ GatherBy[ Flatten[makeConnection[fD, #] & /@ derivatives, 1] // Union, First]], {\[ScriptJ], \[Lambda]F}];, Row[{"function ", \[ScriptJ], " of ", \[Lambda]F, ": ", fD}]];
In[12]:=
Click for copyable input
gr = Graph[Flatten[allConnections, 1][[All, 1]]]
Out[12]=

Посчитаем количество связей.

In[13]:=
Click for copyable input
Flatten[allConnections, 1] // Length
Out[13]=

Найдем петли на графике.

In[14]:=
Click for copyable input
selfLoops = Select[ConnectedComponents[ Graph[Flatten[allConnections /. DirectedEdge -> UndirectedEdge, 1][[All, 1]]]], Length[#] == 1 &]
Out[14]=

Найдем группы функций, закрытых в процессе дифференцирования и визуализируем их на графике.

код на языке Wolfram Language целиком
In[15]:=
Click for copyable input
smallLoops = Select[ConnectedComponents[ Graph[Flatten[allConnections /. DirectedEdge -> UndirectedEdge, 1][[All, 1]]]], 1 < Length[#] < 20 &];
In[16]:=
Click for copyable input
Graph[Select[Flatten[allConnections, 1], MemberQ[#, Alternatives @@ Flatten[smallLoops], \[Infinity]] &][[ All, 1]], VertexLabels -> ((# -> MapAt[Nothing &, CommonName[#], {{1, 1}}]) & /@ Union[Flatten[smallLoops]])]
Out[16]=

Большинство функций являются компонентами большого графика, показанного ниже. Вы можете навести курсор на вершины индивидуальных компонентов графика, чтобы увидеть функции, и на стороны, чтобы увидеть производные, которые объединяют эти функции.

In[17]:=
Click for copyable input
allConnectionsRest = Select[Flatten[allConnections, 1], FreeQ[#, Alternatives @@ Flatten[{selfLoops, smallLoops}], \[Infinity]] &];
In[18]:=
Click for copyable input
grf = Graph[allConnectionsRest[[All, 1]], VertexLabels -> Placed["Name", Tooltip], EdgeLabels -> ((#1 -> Tooltip[" ", Column[#2]]) & @@@ allConnectionsRest), PerformanceGoal -> "Quality", ImageSize -> Full]
Out[18]=

Разделение графа на сообщества или кластеры показывает несколько видов функций, включающие эллиптические функции, гипергеометрические функции, функции-окна, дзета-функции.

In[19]:=
Click for copyable input
CommunityGraphPlot[grf, FindGraphCommunities[grf, Method -> "Modularity"]]
Out[19]=

Родственные примеры

de en es fr ja ko pt-br zh