考虑这个例子:
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
Q2:为什么这样做?
问题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