# Lazy evaluation of derivatives of an unknown function

Hi,

I am using Sage to check some solutions to partial differential equations. I am wondering if a have an unknown function f, can I somehow form the PDE in terms of its derivatives and then substitute in the assumed solution and evaluate the derivatives after the fact?

Here is what I tried so far:

var('x y')
f = function('f', x, y)
g = derivative(f, x, y)

print(g)

D[0, 1](f)(x, y)
h = D[0, 1](f)(x, y)
print(h)

Traceback (click to the left of this block for traceback)
...
TypeError: 'sage.symbolic.expression.Expression' object has no
attribute '__getitem__'


I figured out that D[0, 1] represents the derivatives with respect to the ith indepent variable of the function (is this a Maxima expression?), but I'm not sure then how to use these types of expressions when I finally want to substitute in the known form of f. I.e., since the output of the expression for g is in terms of D[], and when I try to reuse that expression as h, I get an error (since D is actually some other type of object). Any help would be appreciated. Let me know if my question is not clear.

Many thanks!

edit retag close merge delete

Could you provide a specific example? Why not just plug in the putative solutions to original DE to check them?

That is what I'm doing for now, but I was thinking it would be convenient to be able to construct the system of pdes with an arbitrary unknown function and then substitute in the trial solutions to check them. I will play with it a bit more and see if I can come up with a better example use case. Thanks!

Sort by » oldest newest most voted

The method substitute_function allows to substitute a function with another.

This allows to check if a particular function solves a particular partial differential equation.

For example:

sage: x, y = SR.var('x y')
sage: f = function('f')
sage: eq = diff(f(x, y), x, x) + diff(f(x, y), y, y) == 0
sage: eq
diff(f(x, y), x, x) + diff(f(x, y), y, y) == 0
sage: g(x, y) = x*y - 3*x - 2*y + 7
sage: g
(x, y) |--> x*y - 3*x - 2*y + 7
sage: eq.substitute_function(f, g)
0 == 0
sage: bool(eq.substitute_function(f, g))
True

more

The original question tried to replicate the syntax in which sage prints derivatives. This comes up more often. Isn't it time to include (perhaps not in the global namespace, but at least somewhere from which it is easily imported) an object that allows users to do so? It's valid python syntax so it's fairly easy to do. It does require boilerplate that's a bit beyond a one-liner, though:

from sage.symbolic.operators import FDerivativeOperator
class Dclass(object):
def __init__(self,L=None):
if L is None:
self.L=[]
else:
self.L=L
def __getitem__(self,index):
if isinstance(index,tuple):
index=list(index)
elif not(isinstance(index,list)):
index=[index]
return Dclass(self.L+index)
def __call__(self,arg):
return FDerivativeOperator(arg,self.L)
def __repr__(self):
return "D"+str(self.L)
D=Dclass()


With this definition you can just write:

sage: function('f'); var('x','y','z')
sage: D[0,1,2](f)(x,y,z)
diff(f(x, y, z), x, y, z)


This is now https://trac.sagemath.org/ticket/25054

more