Ask Your Question
1

Lazy evaluation of derivatives of an unknown function

asked 2013-06-10 05:27:40 -0500

nosneros gravatar image

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 flag offensive close merge delete

Comments

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

rickhg12hs gravatar imagerickhg12hs ( 2013-06-13 20:21:31 -0500 )edit

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!

nosneros gravatar imagenosneros ( 2013-06-14 10:45:42 -0500 )edit

2 answers

Sort by ยป oldest newest most voted
1

answered 2018-03-27 11:06:28 -0500

nbruin gravatar image

updated 2018-03-28 20:14:31 -0500

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

edit flag offensive delete link more
1

answered 2018-03-27 04:30:44 -0500

slelievre gravatar image

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

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: 2013-06-10 05:27:40 -0500

Seen: 575 times

Last updated: Mar 28