Wolfram mathematica 增加功能

Wolfram mathematica 增加功能,wolfram-mathematica,Wolfram Mathematica,一般来说,如果有两个函数f,g:X-->Y,并且在Y上定义了一些二进制运算+,那么f+g有一个规范定义,即函数X-->f(X)+g(X) 在Mathematica中实现这一点的最佳方法是什么 f[x_] := x^2 g[x_] := 2*x h = f + g; h[1] 屈服 (f + g)[1] 作为输出 当然, H = Function[z, f[z] + g[z]]; H[1] 产量为“3”。考虑: In[1]:= Through[(f + g)[1]] Out[1]= f[1

一般来说,如果有两个函数f,g:X-->Y,并且在Y上定义了一些二进制运算+,那么f+g有一个规范定义,即函数X-->f(X)+g(X)

在Mathematica中实现这一点的最佳方法是什么

f[x_] := x^2
g[x_] := 2*x
h = f + g;
h[1]
屈服

(f + g)[1]
作为输出

当然,

H = Function[z, f[z] + g[z]];
H[1]
产量为“3”。

考虑:

In[1]:= Through[(f + g)[1]]

Out[1]= f[1] + g[1]
要详细说明,您可以这样定义
h

h = Through[ (f + g)[#] ] &;
如果函数和操作数的数量有限,那么尤达推荐的
uper
在语法上肯定更干净。但是,
更为普遍。如果没有任何涉及
时间
h
的新定义,您可以轻松做到:

i = Through[ (h * f * g)[#] ] &
i[7]

43218另一种方法是使用
UpSetDelayed

f[x_] := x^2;
g[x_] := 2*x;

f + g ^:= f[#] + g[#] &; (*define upvalues for the operation f+g*)

h[x_] = f + g;

h[z]

Out[1]= 2 z + z^2

另外,请参见rcollyer(以及Leonid&Verbeia)的文章,了解更多关于
UpValues
以及何时使用它们的信息,我将为Gram-Schmidt提供一个完整的代码和一个函数添加示例等,因为我碰巧在大约4年前编写了该代码。但没有进行广泛的测试。我现在一行也没改,所以我是免责声明(当时我在mma的表现差多了)。也就是说,这是一个Gram-Schmidt过程实现,它是我所讨论的代码的一个稍微概括的版本:

上述函数由3个函数参数化,在给定的向量空间中实现加法、乘法和点积。要说明的示例是通过正交规范化单项式来查找
Hermite
多项式。以下是我们需要的3个功能的可能实现:

hermiteDot[f_Function, g_Function] := 
   Module[{x}, Integrate[f[x]*g[x]*Exp[-x^2], {x, -Infinity, Infinity}]];

SetAttributes[functionPlus, {Flat, Orderless, OneIdentity}];
functionPlus[f__Function] :=   With[{expr = Plus @@ Through[{f}[#]]}, expr &];

SetAttributes[functionTimes, {Flat, Orderless, OneIdentity}];
functionTimes[a___, f_Function] /; FreeQ[{a}, # | Function] := 
      With[{expr = Times[a, f[#]]}, expr &];
这些函数可能有点幼稚,但它们将说明这一点(是的,我还使用了
)。以下是一些示例来说明它们的用法:

In[114]:= hermiteDot[#^2 &, #^4 &]
Out[114]= (15 Sqrt[\[Pi]])/8

In[107]:= functionPlus[# &, #^2 &, Sin[#] &]
Out[107]= Sin[#1] + #1 + #1^2 &

In[111]:= functionTimes[z, #^2 &, x, 5]
Out[111]= 5 x z #1^2 &
现在,主要测试:

In[115]:= 
results = 
  GSOrthoNormalizeGen[{1 &, # &, #^2 &, #^3 &, #^4 &}, hermiteDot, 
      functionPlus, functionTimes]

Out[115]= {1/\[Pi]^(1/4) &, (Sqrt[2] #1)/\[Pi]^(1/4) &, (
  Sqrt[2] (-(1/2) + #1^2))/\[Pi]^(1/4) &, (2 (-((3 #1)/2) + #1^3))/(
  Sqrt[3] \[Pi]^(1/4)) &, (Sqrt[2/3] (-(3/4) + #1^4 - 
  3 (-(1/2) + #1^2)))/\[Pi]^(1/4) &}
这些确实是正确规范化的埃尔米特多项式,很容易验证。内置
HermiteH
的规范化是不同的。我们的结果是标准化的,就像标准化谐振子的波函数一样。根据变量(例如x)获取多项式列表作为表达式是很简单的:

In[116]:= Through[results[x]]
Out[116]= {1/\[Pi]^(1/4),(Sqrt[2] x)/\[Pi]^(1/4),(Sqrt[2] (-(1/2)+x^2))/\[Pi]^(1/4),
(2 (-((3 x)/2)+x^3))/(Sqrt[3] \[Pi]^(1/4)),(Sqrt[2/3] (-(3/4)+x^4-3 (-(1/2)+x^2)))/\[Pi]^(1/4)}

为此,我建议定义除内置的
Plus
之外的运算符。Mathematica提供了许多运算符,在这种情况下,这些运算符是为用户定义保留的。一个这样的操作符是
CirclePlus
,它没有预定义的含义,但具有很好的紧凑表示(至少,它在笔记本中是紧凑的——在StackOverflow网页上不是那么紧凑)。您可以定义
CirclePlus
来执行函数添加,因此:

(x_ \[CirclePlus] y_)[args___] := x[args] + y[args]
有了此定义,您现在可以执行函数添加:

h = f \[CirclePlus] g;
h[x]
(* Out[3]= f[x]+g[x] *)
如果一个人喜欢生活在边缘,同样的技术可以用于内置的
Plus
操作符,前提是它首先不受保护:

Unprotect[Plus];
(x_ + y_)[args___] := x[args] + y[args]
Protect[Plus];

h = f + g;
h[x]
(* Out[7]= f[x]+g[x] *)

我通常建议不要改变内置函数的行为——尤其是像
Plus
这样的基本函数。原因是不能保证用户向
Plus
添加的定义会受到其他内置函数或内核函数的尊重。在某些情况下,对
Plus
的调用是优化的,并且这些优化可能不会考虑用户定义。但是,这种考虑可能不会影响任何特定应用,因此该选项仍然是有效的(如果有风险的话)设计选择。

感谢
功能;我不知道!太好了,谢谢。我在写一个gram-schmidt函数;如果它适用于伪装成向量的一般对象,如函数、列表等,那就太好了。我认为最好的办法可能是将“添加”和“缩放”作为可选参数,这样您就可以定义什么是向量添加和缩放,这样gramm schmidt函数就适用于一般对象。@yoda,请参阅前面的注释:我将有一长串函数,它们将是下一个向量到上一个正交规范化向量跨度的投影。@nmaxwell,根据您对Mathematica的熟悉程度,您可能会发现以下信息:
combine[{uuuuuuufuncs},operator]:=通过[operator[funcs][#]]&
--你可以像
h=combine[{f,g},Plus]
一样使用它。David Park的软件包PushThrough使用Through来回答类似的问题:+1--我没有建议打乱,因为我认为这个问题对于各种函数都是通用的,而不是具体的
f
g
。是的,你可能是对的。。。这是他最后一次声明,暗示他正在考虑重载操作员,并让我发布了一个指向它的答案。除此之外,我想不出任何其他的,实际上在你回答后等待了大约5-10分钟,只是想看看你是否会做一个快速的忍者编辑,包括
心烦意乱的
:d谢谢你,还有+1(顺便说一句,最好不要在你的消息上签名,因为这是多余的,因为你的身份会在每个问题或答案下面屏蔽它。)正如OP所说,函数加法是规范定义的,因此任何其他定义都偏离了所有数学家的预期。
h = f \[CirclePlus] g;
h[x]
(* Out[3]= f[x]+g[x] *)
Unprotect[Plus];
(x_ + y_)[args___] := x[args] + y[args]
Protect[Plus];

h = f + g;
h[x]
(* Out[7]= f[x]+g[x] *)