Добавить комплекс I К под-выражению выражения?
Рассмотрим следующий пример:
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: Почему это работает?
Q3: Есть ли альтернативные / лучшие способы сделать это?
3 ответа:
Части выражения box, которые не являются структурными, должны быть строками. Итак, вы хотите
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)