gpt4 book ai didi

wolfram-mathematica - Mathematica 中的符号条件期望

转载 作者:行者123 更新时间:2023-12-04 06:31:05 26 4
gpt4 key购买 nike

我想实现条件期望运算符。我将使用资本epsilon E来表示运营商。我希望至少有以下输入(下划线表示下标)

E_2[a]
E_2[x_1]
E_2[x_1 + y_5]
E_1[3 a + b - 4 + 2 x_]
E_6[x_5 x_7]
E_t[x_t]
E_t[3 x_{t - 1} x_{t + 2}]

产生以下输出
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]]

];

最佳答案

我想我可以让你接近你想要的;不过,我不会全部完成,因为这可能很棘手,但我会为您指明正确的方向。

首先,在 Mathematica 中使用下标来表示不同的变量是很棘手的,因为它解释了 E 0Subscript[E,0]和两者 ESubscript被保留。 (正如 Sjoerd 所说, E = 2.718... 。)让 Mathematica 识别 <anything> <something>作为一个独特的符号,您需要通过 <<Notations` 加载 Notations 包.然后使用符号调色板,Symbolize Subscript[E,0] . (请注意,不要在不使用调色板正确设置代码的情况下尝试这样做,否则可能无法正常工作。)

根据需要对所有变量进行符号化后,您需要设置适当的转换规则。前两个最简单,输入

E_0[a] = a
E_0[x_0] = x_0

第 3 条和第 4 条:
E_0[x_Plus]:=Distribute[E_0[x]]
E_0[x_Times]:=Distribute[E_0[x], Times]

那些是简单的,接下来的三个需要不同类型的关联,都不是 Set 也不是 SetDelayed 将在这里工作,因为正在评估的外部符号是 Dt ,并且您无法将新规则与其关联,因为它是 Protected .但是,有两种方法可以将此类表达式与内部符号相关联: UpSet (^=) (或 UpSetDelayed (^:=) )或 TagSet (/:) .我更喜欢使用 TagSet因为它更明确,但两者都应该有效。

规则 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不分发 DDt留作练习。

编辑 :
我想对您提供的解决方案代码发表一些评论。首先,巧妙地使用 bool 值来停止递归,它适用于您的 Notation .不过,我建议您对产品分发进行一些更改。首先,我会使用 x__Times而不是条件( /; Head[x] == Times ),因为它更容易阅读,我相信(但尚未测试)它可能更快,即处理它的开销更少。二、代替你使用 TableList @@ x ,其中 @@ ,称为 Apply , 替换 TimesList ,它再次更容易阅读和写作。为您定义 n ,考虑使用 Complement ;我不知道它是否更快,但我倾向于为这种类型的事物设置理论结构。最后,除非你需要一个变量为 reevaluated whenever it is used ,请勿使用 SetDelayed ( := ), 使用 Set ( = )。通过使用 := , m 被评估了两次,v 被评估了 3 次!

优缺点 :
这样做的主要原因是易用性和可读性。通过定义您自己的对象及其行为方式,您可以为自己提供很大的灵活性并简化您的代码。仅此一点就值得。但是,我过去在这样做时遇到了困难,而且这样的设置可能很挑剔,我建议进行彻底的测试。其次,通过添加这些额外的层,您可能会减慢代码速度,因此如果将其用于关键任务应用程序,请务必小心。此外,您必须包括 Notation每次使用它时,调色板都会在某些时候变得烦人。虽然,调色板可以通过设置 AutoLoadNotationPalette = False 来处理。在加载 Notation 包之前。

关于wolfram-mathematica - Mathematica 中的符号条件期望,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5408149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com