Wolfram mathematica 数学中的符号条件期望

Wolfram mathematica 数学中的符号条件期望,wolfram-mathematica,Wolfram Mathematica,我想实现条件期望操作符。我将使用大写字母epsilonE表示运算符。我希望至少有以下输入(下划线表示下标) 生成以下输出 a x_1 E_2[y_5] + x_1 -4 + 3 a + b + 2 E_2[x_5] E_6[x_7] x_5 x_t 3 E_t[x_{t + 2}] x_{t - 1} 上面的示例并不是我需要生成的唯一输入/输出对,而是我喜欢的语法的测试和说明 我已经走了这么远ce表示条件期望,其第三个组成部分是“期望传播”是否最终确定(否则乘积规则中会出现无限递归),mv表示

我想实现条件期望操作符。我将使用大写字母epsilon
E
表示运算符。我希望至少有以下输入(下划线表示下标)

生成以下输出

a
x_1
E_2[y_5] + x_1
-4 + 3 a + b + 2 E_2[x_5]
E_6[x_7] x_5
x_t
3 E_t[x_{t + 2}] x_{t - 1}
上面的示例并不是我需要生成的唯一输入/输出对,而是我喜欢的语法的测试和说明

我已经走了这么远
ce
表示条件期望,其第三个组成部分是“期望传播”是否最终确定(否则乘积规则中会出现无限递归),
mv
表示可测量变量

Notation[Subscript[E, t_][y_]  ==> ce[y_, t_, False]];
Notation[Subscript[E, t_][y_] <==  ce[y_, t_, _]];

Notation[Subscript[x_, t_] <==> mv[x_, t_]];

(* Atomic Elements and Measurable Variables *)
ce[x_, t_, _] := x /; (AtomQ[x] || Head[x] === mv && 0 <= t - x[[2]]);

(* Distribution over Addition *)
ce[x_ + y__, t_, s_] := ce[x, t, s] + Plus @@ (ce[#, t, s] & /@ {y});

(* Distribution over Product *)
ce[x__Times, t_, False] := Module[{v, m, n},

   (* All Variables in the Product *)
   v = List @@ x;

   (* Measurable Among Them *)
   m = Select[v, AtomQ[#] || Head[#] === mv && 0 <= t - #[[2]] &];

   (* The Rest is not Measurable *)
   n = Complement[v, m];

   Times[Times @@ m, ce[Times @@ n, t, True]]

];       
符号[Subscript[E,t_uu][y_u]==>ce[y_u,t_u,False];

注记法[Subscript[E,t_u][y_u]我想我可以让你接近你想要的;虽然我不会全部做,因为这可能很棘手,但我会给你指出正确的方向

首先,在Mathematica中,使用下标表示不同的变量是很棘手的,因为它将
E
0
解释为
下标[E,0]
,并且
E
下标
都是保留的要让Mathematica识别
,此处也不起作用,因为正在求值的外部符号是
Dt
,并且您不能将新规则与其关联。但是,有两种方法将此类表达式与内部符号关联:(或)或者。我更喜欢使用
标记集
,因为它更明确,但两者都可以

规则5和6:

E_0 /: Dt[ E_0[ x_ ], y_ ] := E_0[ Dt[x,y] ]
这也将使您接近规则7,但将其与规则3和4一起添加会导致递归限制错误,因为它来回反弹,试图找出如何计算它。相反,将规则3和4替换为

E_0[x_ + y__]:= E_0[x] + Plus@@( E_0 /@ {y} )
E_0[x_ y__ ] := E_0[x] Times@@( E_0 /@ {y} )
这给递归设置了明确的限制。就第7条规则而言,你可以得到这个

E_0[D[x_1[t_1,q_0], t_1]] E_0[Dt[t_1, y_0]] 
+ E_0[D[x_1[t_1,q_0], q_0]] E_0[Dt[q_0,y]]
这是
Dt
规则和规则4的结果。获得
E_0
不分布在
D
Dt
作为练习


编辑: 我想对您提供的解决方案代码发表几点意见。首先,巧妙地使用布尔值来停止递归,它与您的
表示法
配合得很好。不过,我建议对您的产品分布进行一些更改。首先,我将使用
x_u次
而不是条件(
/;Head[x]==次
)因为它更容易阅读,我相信(但还没有测试)它可能更快,也就是处理它的开销更小。第二,用<代码> >列表@ @ x/代码>代替<代码>表>代码>,其中代码< > @ @ /代码>,调用<代码> >代码> > <代码>清单>代码>,它更容易读写。对于<代码> n>代码>的定义,考虑使用;我不知道它是否更快,但我不知道。最后,除非你需要一个变量,否则不要使用(
:=
),使用
set
=
)。通过使用
:=
,m被计算两次,v被计算三次

优点和缺点
这样做的主要原因是易用性和可读性。通过定义自己的对象及其行为方式,您可以给自己很大的灵活性并简化代码。这本身就是值得的。然而,我在过去很难做到这一点,这样的设置可能会很棘手,我建议进行彻底的测试。其次,通过广告添加这些额外的层可能会降低代码的速度,因此如果要在任务关键型应用程序中使用,请务必小心。此外,每次使用时都必须包含
标记
,并且调色板在某些时候会变得烦人。尽管可以通过设置
autoloadnotationpalete=False。

我认为这一切都不是很有意义。如果您希望函数定义精确地给出上述文本输入的上述输出,您可以将第一个框设置为第二个框。
Subscript[E,0][a]=a
Subscript[E,0][Subscript x,0]=Subscript[x,0]
等。您的示例可以使用,但不能概括。PS E是一个保留字(自然日志的基础)。下划线用于模式匹配…不要在符号中使用它names@belisarius,是的,但他确实提到他用它作为
下标的缩写。
E_0 /: Dt[ E_0[ x_ ], y_ ] := E_0[ Dt[x,y] ]
E_0[x_ + y__]:= E_0[x] + Plus@@( E_0 /@ {y} )
E_0[x_ y__ ] := E_0[x] Times@@( E_0 /@ {y} )
E_0[D[x_1[t_1,q_0], t_1]] E_0[Dt[t_1, y_0]] 
+ E_0[D[x_1[t_1,q_0], q_0]] E_0[Dt[q_0,y]]