Ask Your Question
0

How can I substitute "target" functions inside expressions?

asked 2017-07-19 16:12:58 +0100

Asker gravatar image

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!

edit retag flag offensive close merge delete

Comments

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

vdelecroix gravatar imagevdelecroix ( 2017-07-19 16:52:18 +0100 )edit

1 Answer

Sort by ยป oldest newest most voted
1

answered 2017-07-19 16:50:05 +0100

vdelecroix gravatar image

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
edit flag offensive delete link more

Comments

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 ;)

Asker gravatar imageAsker ( 2017-07-19 17:35:23 +0100 )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 ;-)

vdelecroix gravatar imagevdelecroix ( 2017-07-19 18:12:07 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2017-07-19 16:12:58 +0100

Seen: 800 times

Last updated: Jul 19 '17