将复杂的I前置为表达式的子表达式?

时间:2011-05-31 04:51:05

标签: wolfram-mathematica

考虑这个例子:

expr = a (1 + b + c d + Sqrt[-2 d e + fg + h^2] + a j );

现在我想在平方根中的术语之前插入一个复杂的I并保留表达式的其余部分。我知道expr只有一个Sqrt字词。所以我尝试了以下内容:

ToBoxes@# /. SqrtBox@x_ :> RowBox[{I, " ", SqrtBox@x}] &[
  expr] // ToExpression
Out[1] = $Failed

Q1:为什么会失败?

解决方法是使用另一个变量,然后将其替换为I,如下所示:

(ToBoxes@# /. SqrtBox@x_ :> RowBox[{k, " ", SqrtBox@x}] &[expr] // 
   ToExpression) /. k -> I 

enter image description here

Q2:为什么这样做?

问题3:有替代/更好的方法吗?

3 个答案:

答案 0 :(得分:4)

Errr

expr /. Sqrt[x_] -> I Sqrt[x]

修改

如果您想考虑1 / Sqrt [x]案例,请尝试:

expr/.Sqrt[x_]->I Sqrt[x]/.Power[x__,Rational[-1,2]]-> 1/( I Sqrt[x])

答案 1 :(得分:4)

非结构化的框表达式部分需要是字符串。所以你想要

In[1]:= expr = a (1 + b + c d + Sqrt[-2 d e + fg + h^2] + a j );

In[2]:= ToBoxes@# /. SqrtBox@x_ :> RowBox[{"I", " ", SqrtBox@x}]&[expr]//ToExpression
Out[2]= a (1 + b + c d + I Sqrt[-2 d e + fg + h^2] + a j)

答案 2 :(得分:1)

西蒙是正确的,你需要引号。此外,您的更换可以简化:

ToBoxes@expr /. x_SqrtBox :> RowBox@{"I", x} // ToExpression