Ask Your Question

how to import a math command "df(x,y)/dx + int_a^b f(x,z) f(y,z) dz" in sage when f is an unknown function of two variables in 3d space?

asked 2012-07-20 21:07:41 -0500

owari gravatar image

updated 2012-07-23 04:54:57 -0500


As a newbie to sage and python I asked a question here around two days ago, and had a chat about it in sage's IRC channel, however, after I learned more from the guys therein and checking different situations by myself I understood my previous question somewhat nonsense, so I am now editing it!

I am working on a multipoint theory of turbulence in fluid mechanics, so I have functions that are simultaneously defined on multi point of space, like f(x,y,z; x1,y1,z1; …), however these functions --which are my main unknowns to be found from a set of many (I mean from some ten to maybe some millions!) coupled nonlinear integro-partial differential equations-- sometimes live as integrand to some integrals and sometimes are differentiated and the important thing is that their arguments vary from place to place in an equation and/or in different equations. Maybe I should classify my difficulties into two cases:

  1. how to define many functions automatically and symbolically without specifying their arguments?

  2. how to not specify the arguments to a function and at the same time be able to differentiate it or take its integral?

the answer to the first equation according to what I have read in this website and has been told from the guys in IRC channel is either of the followings:

var('x,y,z,t, x1,y1,z1,t1, x2,y2,z2,t2, x3,y3,z3,t3')
for k in range(10):
        function('f%s' %k, nargs=2)
        # one can even refuse to determine the number of arguments and let it open by omitting nargs!


var('x,y,z,t, x1,y1,z1,t1, x2,y2,z2,t2, x3,y3,z3,t3')
for k in range(10):
        s = 'def f%d(*args):\n  print args\n' % k

at the end of each of these codes one would have 10 functions f0,f1,…,f9 which can be given their arguments and be worked with. For example one can write f2(x,y)+f2(y,z1) which introduce once x and y and another time y and z1 to the same function f2 in one logical line in sage! This is why the second problems seems not to be solvable using the above methods as e.g. f2.diff(x) is nonsense as long as a specific law is not defined for f2, like f(x,y)=2xy^3 ! And it is nonsense to sage as it gives error when one tries to write f2.diff() before defining such a prescribed law for f2, it says function object and NewSymbolicFunction object have no attribute 'diff' …

The only way that I can think about is to give my functions a set of dummy variables and replace them with the variables of interest in each equation or differentiation and integration, however, I am not sure it would work as the function is unknown and I don't know if the procedure of ... (more)

edit retag flag offensive close merge delete

3 answers

Sort by » oldest newest most voted

answered 2012-07-28 10:12:06 -0500

owari gravatar image

updated 2012-07-28 11:11:17 -0500

Well, my tries to work with dummy variables failed, but the code below solved the problem carefully: using the Lambda operator! Actually, it is also commented in the book "Dive into Python" that "You can use a lambda function without even assigning it to a variable" and this was what I exactly needed, not in defining my functions but in defining the operators acting on them, at least I guess so!

f=function('f1', x,y)
h= lambda function1,function2: integral(function1(x,y)*function2(x,z),x,-oo,oo)
eq1= f1(y,z)==h(f1,f1)

However, in the same book it was commented that "lambda functions are a matter of style. Using them is never required; anywhere you could use them, you could define a separate normal function and use that instead." So that, it shouldn't be the only way, but I couldn't define another function that does the same anyhow!?

edit flag offensive delete link more


This is the equivalent of the above code without the lambdas: [here](

Jason Grout gravatar imageJason Grout ( 2012-07-30 04:44:57 -0500 )edit

answered 2012-07-23 05:10:42 -0500

owari gravatar image

updated 2012-07-23 05:19:17 -0500

Ok, According to the codes I gave in my last edit above I checked the following code and it worked:

for i in range(4):
    U[i]=function('U%s' %i, x,y,z,t)

now trying the command "show( diff(U[0],x,1,y,3) + integral(U[0],x,-oo,oo) )" works nicely! However, it is not beautiful to use the command "U=[U0,U1,U2,U3]" when the number of unknowns gets large, so that I rewrote the above code like the following and it worked again:

for i in range(4):
    U.append(function('U%s' %i, x,y,z,t))

Also I checked and see if nargs=2, as an example, was used instead of specifying the arguments, it was then not going to give anything as result other than an error. So still I think one should use dummy variables to define the functions, then try substituting them by real variables whenever needed, it is only important to know the number of each function argument (I am not sure if one can also define more than required, if not sure exactly how many may be required, and after differentiation and integration assume the extra ones as parameter and equate them with unity, I mean at the end!)

edit flag offensive delete link more

answered 2012-07-26 01:36:34 -0500

owari gravatar image

Also about using spatio-temporal vectors instead of single scalar coordinate variables, if one use in his function definition a code like:


or use instead


both will yield into error, but the correct syntax is to use the following code as much as I tried:


hope that it would help

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



Asked: 2012-07-20 21:07:41 -0500

Seen: 497 times

Last updated: Jul 28 '12