How can I substitute "target" functions inside expressions?
Hi all, I'm a Sage newbie striving to manipulate complex-valued expressions. In particular, I need to convert expressions like abs(x)^2 into x*conj(x) and back, within expressions including multiple instances of these patterns. In other words, x is here just a placeholder for what may be a list of different variables or expressions, but I do not want to substitute each of these separately or manually.
Here is some experimenting that I have been doing on the matter with generic functions, as well as standard functions (sin):
# Some initialization
reset()
forget()
f = function('foo')(x)
g = function('goo')(x)
h = function('hoo')(x)
h(x) = f(x)^2
# Types and basic substitutions
print(type(foo))
print(type(goo))
print(type(hoo))
print(type(f))
print(type(g))
print(type(h))
print(h(x))
print(h.substitute_function(f,g))
print(h.substitute_function(foo,goo))
# Substitution of a function
h(x) = sin(x)^2
print(type(h))
print(type(sin))
print(h.substitute_function(sin,goo))
If I try, however, to substitute abs with some other function, I do not get what I want:
# Substitution of a built-in function (not working)
h(x) = abs(x)^2
print(type(h))
print(type(abs))
print(h.substitute_function(abs,goo))
Here is a workaround that I came up with, but I hope someone can let me know a more elegant/standard technique:
# Substitute abs(x) with sqrt(x*conj(x)): a workaround
moo = sage.functions.other.Function_abs()
m(x) = abs(x)
c(x) = (x*x.conjugate()).sqrt()
print(type(moo))
print(type(m))
print(type(c))
s(x) = h.substitute_function(moo,c)
print(s(x))
Also, I found a lot of headaches with the opposite conversion, and following is my attempt at solving the problem:
# Substitute sqrt(x*conj(x)) with abs(x): a workaround
doo(x) = goo(x)/x
qoo(x) = abs(x)^2
b_temp(x) = s.substitute_function(conjugate,goo)
print(b_temp(x))
b_temp(x) = b_temp.substitute_function(goo,doo)
print(b_temp(x))
b(x) = b_temp.substitute_function(goo,qoo)
print(b(x))
Honestly, it seems strange to me that one cannot easily recast an expression in order to make certain target functions to appear.
Thank you in advance for your support!
an advice: If you want clear answer post one simple question. Not 50 lines of a mix of try and errors, comments and questions.