如何简化/扩展/应用模式到函数的参数

au7*_*700 3 wolfram-mathematica

(我做了一些改变......)

我经常想简化函数的参数,或者对它应用模式,例如.我想改变:

Exp[a(b+c)]
Run Code Online (Sandbox Code Playgroud)

Exp[a b + a c]
Run Code Online (Sandbox Code Playgroud)

简单的模式没有帮助:

Sin[a(b+c)] /. Sin[aaa_] -> Sin[Expand[aaa]]
Run Code Online (Sandbox Code Playgroud)

又给了

Sin[a(b+c)]
Run Code Online (Sandbox Code Playgroud)

但是,除了Simplify/Expand之外的功能,它似乎做了我所期望的:

Sin[a (b + c)] /. Sin[aaa_] -> Sin[f[aaa]] 
Run Code Online (Sandbox Code Playgroud)

Sin[  f[a(b+c)]  ]
Run Code Online (Sandbox Code Playgroud)

我通常的解决方案是使用2种模式并保持:

(Exp[a(b+c)] /. Exp[aaa_] -> Exp[Hold[  Expand[aaa]  ]] ) /. Hold[xxx_] -> xxx
Run Code Online (Sandbox Code Playgroud)

结果

E^(a*b + a*c)
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是代码变得比它需要的更复杂.

我的真实生活例子是:

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;
Run Code Online (Sandbox Code Playgroud)

其中ppp1是包含u2,w2,u3,w3等的长项.我想在ExpIntegral和Log中更改u,w2 ...的值.

我的另一个解决方案是功能:

ExpandArgument[expr_, what_] := Module[{list},
  list = Extract[expr, Position[   expr, what[_]   ]];
  list = Map[Rule[#, what[Expand[   #[[1]]   ]]] &, list];
  Return[expr /. list]
]
Run Code Online (Sandbox Code Playgroud)

我写的函数很容易推广,不仅可以使用Expand,还可以使用Simplify等:

ApplyToArgument[expr_, ToWhat_, WhatFunction_] := Module[{list},
  list = Extract[expr, Position[   expr, ToWhat[_]   ]];
  list = Map[Rule[#, ToWhat[WhatFunction[   #[[1]]   ]]] &, list];
  Return[expr /. list]
]
Run Code Online (Sandbox Code Playgroud)

例如:

ApplyToArgument[Sin[a (b + c)], Sin, Expand]
Run Code Online (Sandbox Code Playgroud)

Sin[a b + a c]
Run Code Online (Sandbox Code Playgroud)

ApplyToArgument[Sin[a b + a c ], Sin, Simplify]
Run Code Online (Sandbox Code Playgroud)

Sin[a (b + c)]
Run Code Online (Sandbox Code Playgroud)

这个解决方案易于阅读,但在应用于多参数函数之前需要进行一些改进(我需要这些函数).

我想我错过了mathematica中关于模式的基本内容......我应该如何将模式应用于函数的参数?(或简化,扩展等)

非常感谢!

tom*_*omd 13

对于问题的第一部分,您可以考虑使用RuleDelayed:

Sin[a (b + c)] /. Sin[aaa_] :> Sin[Expand[aaa]]
Run Code Online (Sandbox Code Playgroud)

Sin[a b + a c]
Run Code Online (Sandbox Code Playgroud)


cel*_*chk 6

:>而不是->.使用时->,立即评估右侧,然后才应用.扩张aaa过程中只给出aaa,因此评价Sin[Expand[aaa]]给出Sin[aaa],因此按规则要求更换的每个应用程序Sin本身.那么你也不应该需要那些Hold结构.

在相关说明中:Hold[xxx_]->xxx您可以将表达式传递给ReleaseHold,而不是应用规则,例如ReleaseHold[Hold[1+1] /. 1->2]给出4.