# 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.

edit retag close merge delete

an advice: If you want clear answer post one simple question. Not 50 lines of a mix of try and errors, comments and questions.

( 2017-07-19 09:52:18 -0500 )edit

Sort by » oldest newest most voted

abs is a Python builtin function (so as sum, len, iter or next). The symbolic absolute value function is named abs_symbolic in Sage. Note the difference

sage: type(abs)
<type 'builtin_function_or_method'>
sage: abs_symbolic
abs


Using abs_symbolic works as expected

sage: h(x) = abs(x)^2
sage: h.substitute_function(abs_symbolic, sin)
sin(x)^2

more

Thank you very much: this is exactly what I needed! I suspected something of this sort due to the way the keyword abs is highlighted in the notebook, but didn't find the straight solution. I will be more cautious in the future, as well as post shorter questions ;)

( 2017-07-19 10:35:23 -0500 )edit

Great! If you are happy with the answer please set it as accepted (tick box on the left of the answer). If you do so, the question will not be marked anymore as "unanswered" (and I will get some more karma ;-)

( 2017-07-19 11:12:07 -0500 )edit