(我做了一些改变......)
我经常想简化函数的参数,或者对它应用模式,例如。我想改变:
Exp[a(b+c)]
进入
Exp[a b + a c]
简单模式无济于事:
Sin[a(b+c)] /. Sin[aaa_] -> Sin[Expand[aaa]]
再次给出
Sin[a(b+c)]
但是,使用Simplify / Expand以外的功能似乎可以达到我的期望:
Sin[a (b + c)] /. Sin[aaa_] -> Sin[f[aaa]]
给出
Sin[ f[a(b+c)] ]
我通常的解决方案是使用2种模式并保持:
(Exp[a(b+c)] /. Exp[aaa_] -> Exp[Hold[ Expand[aaa] ]] ) /. Hold[xxx_] -> xxx
导致
E^(a*b + a*c)
这种方法的缺点是代码变得比它需要的更复杂。
我的真实生活例子是:
ppp2 =
( ppp1
/. { ExpIntegralEi[aaa_] ->
ExpIntegralEi[Hold[aaa /. { u2 -> 0, w2 -> 0, u3 -> x, w3 -> x}]],
Log[aaa_] ->
Log[Hold[aaa /. {u2 -> 0, w2 -> 0, u3 -> x, w3 -> x}]]
}
) /. Hold[xxx_] -> xxx;
其中ppp1是包含u2,w2,u3,w3等的长项。我想更改u,w2的值...仅在ExpIntegral和Log。
中我的另一个解决方案是功能:
ExpandArgument[expr_, what_] := Module[{list},
list = Extract[expr, Position[ expr, what[_] ]];
list = Map[Rule[#, what[Expand[ #[[1]] ]]] &, list];
Return[expr /. list]
]
我写的函数很容易推广,不仅可以使用Expand,还可以使用Simplify等等:
ApplyToArgument[expr_, ToWhat_, WhatFunction_] := Module[{list},
list = Extract[expr, Position[ expr, ToWhat[_] ]];
list = Map[Rule[#, ToWhat[WhatFunction[ #[[1]] ]]] &, list];
Return[expr /. list]
]
例如:
ApplyToArgument[Sin[a (b + c)], Sin, Expand]
给出
Sin[a b + a c]
和
ApplyToArgument[Sin[a b + a c ], Sin, Simplify]
给出
Sin[a (b + c)]
此解决方案易于阅读,但在应用于多参数函数之前需要进行一些改进(我需要这些函数)。
我想我错过了mathematica中关于模式的基本内容......我应该如何将模式应用于函数的参数? (或简化,扩展等等)
非常感谢!
答案 0 :(得分:13)
对于问题的第一部分,您可以考虑使用RuleDelayed
:
Sin[a (b + c)] /. Sin[aaa_] :> Sin[Expand[aaa]]
给出
Sin[a b + a c]
答案 1 :(得分:6)
使用:>
代替->
。使用->
,立即评估右侧,然后才应用。当然,aaa
的扩展仅提供aaa
,因此对Sin[Expand[aaa]]
的评估会给Sin[aaa]
,因此规则要求自行替换Sin
的每个应用。那么你也不应该需要那些Hold结构。
在相关说明中:您可以将表达式传递给Hold[xxx_]->xxx
,而不是应用规则ReleaseHold
,例如ReleaseHold[Hold[1+1] /. 1->2]
给出4。
答案 2 :(得分:2)
还可以考虑使用ExpandAll:
ExpandAll[Exp[a (b + c)]] // FullForm
会给:
Power[E, Plus[Times[a, b], Times[a, c]]]
(这会将Exp [...]变成E ^ ...虽然)
答案 3 :(得分:2)
这不是一个直接的答案(其他人提供),但对于这些类型的操作,代数操作调色板(Palettes - > Other)通常非常方便:
缺点是,与键入命令不同,此操作不会被“记录”并保存在笔记本中。