JMarcos87
JMarcos87

Reputation: 323

sympy .subs() built-in function doesn't work

I'm trying to implement the multivariate chain rule using python, when I try to substitute one of the elements using the built-in sympy function expr.subs() I won't get an answer.

The exercise goes as follows:

Compute df/dx of the following function using the chain rule:

a = x^2

b = exp(a)

c = a + b

d = log(c)

e = sin(c)

f = d + e ⁡ And this is the code:

a, b, c, d, e, f = sym.symbols('a b c d e f')

f = d + e

dfd = sym.diff(f, d)
dfe = sym.diff(f, e)
df = sym.Matrix([[dfd, dfe]])

d = sym.log(c)
e = sym.sin(c)
ddc = sym.diff(d)
dde = sym.diff(e)
dd = sym.Matrix([[ddc],[dde]])

dfdd = df@dd

c = a + b
dca = sym.diff(c, a)
dcb = sym.diff(c, b)
dc = sym. Matrix([[dca, dcb]])

dfdc = dfdd@dc

a = x**2
b = sym.exp(a)

result = dfdc.subs(c, (a + b))
result

The result the function .subs() doesn't substitute anything and I don't know why, I tried substituting it using other ways to write the function, like:

dfdc.subs({c : (a + b)})
dfdc.subs(c, a + b)

And even tried to just substitute it for an integer to see it that would work and neither does it.

What am I doing wrong?

Upvotes: 0

Views: 1273

Answers (1)

Kasper Peeters
Kasper Peeters

Reputation: 1620

The c in your dfdc expression was created before you set c=a+b. So it still appears as c in dfdc. However, by the time you want to do your subs, the c symbol is declared as c=a+b, and so your substitute really reads

dfdc.subs(a+b, a+b)

And that does nothing.

In order to really use c there, do

dfdc.subs(sym.Symbol('c'), a+b)

Upvotes: 1

Related Questions