Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

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!