Добавить комплекс 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 4

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)

Errr

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

?

Edit

Если вы хотите рассмотреть случай 1 / Sqrt[x], попробуйте:

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

Симон правильно, что вы нуждаетесь в кавычки. Кроме того, ваша замена может быть упрощена:

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