Skip to content

Commit 36c1b8a

Browse files
Release Managervbraun
Release Manager
authored andcommitted
Trac #17447: Clarify and complete documentation of function()
The documentation of function() is incomplete and confusing. For example, none of the methods described in http://www.sagemath.org/do c/reference/calculus/sage/symbolic/function_factory.html show up when I type: {{{ function? }}} The distinction between {{{ f = function('f') }}} and {{{ f = function('f', x) }}} is also not documented. See also #17445 for sources of confusion. Need to explain what happens in the second case above (`f = function('f',x)`). A symbolic function `f` is first created and then overwritten by the expression `f`? See the following example, where f is first an expression, then becomes redefined to a function in the background, but does not contain any information about its variables. {{{ sage: f = function('f', x); print type(f) <type 'sage.symbolic.expression.Expression'> sage: fx = function('f',x); print type(f) <class 'sage.symbolic.function_factory.NewSymbolicFunction'> sage: f.variables() () sage: fx.variables() (x,) }}} See http://ask.sagemath.org/question/9932/how-to-substitute-a-function- within-derivatives/?answer=14752#post-id-14752 for a possible start at how to explain this, at least for those writing this. URL: http://trac.sagemath.org/17447 Reported by: schymans Ticket author(s): Nils Bruin, Ralf Stephan Reviewer(s): Ralf Stephan, Nils Bruin
2 parents d5ab06e + 7c029f3 commit 36c1b8a

File tree

23 files changed

+107
-95
lines changed

23 files changed

+107
-95
lines changed

src/doc/de/tutorial/tour_algebra.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ berechnen. Die Gleichung :math:`x'+x-1=0` berechnen Sie wie folgt:
153153
::
154154

155155
sage: t = var('t') # definiere die Variable t
156-
sage: x = function('x',t) # definiere x als Funktion dieser Variablen
156+
sage: x = function('x')(t) # definiere x als Funktion dieser Variablen
157157
sage: DE = diff(x, t) + x - 1
158158
sage: desolve(DE, [x,t])
159159
(_C + e^t)*e^(-t)

src/doc/en/constructions/calculus.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ An example, how to solve ODE's symbolically in Sage using the Maxima interface
292292

293293
::
294294

295-
sage: y=function('y',x); desolve(diff(y,x,2) + 3*x == y, dvar = y, ics = [1,1,1])
295+
sage: y=function('y')(x); desolve(diff(y,x,2) + 3*x == y, dvar = y, ics = [1,1,1])
296296
3*x - 2*e^(x - 1)
297297
sage: desolve(diff(y,x,2) + 3*x == y, dvar = y)
298298
_K2*e^(-x) + _K1*e^x + 3*x
@@ -301,7 +301,7 @@ An example, how to solve ODE's symbolically in Sage using the Maxima interface
301301
sage: desolve(diff(y,x) + 3*x == y, dvar = y, ics = [1,1]).expand()
302302
3*x - 5*e^(x - 1) + 3
303303

304-
sage: f=function('f',x); desolve_laplace(diff(f,x,2) == 2*diff(f,x)-f, dvar = f, ics = [0,1,2])
304+
sage: f=function('f')(x); desolve_laplace(diff(f,x,2) == 2*diff(f,x)-f, dvar = f, ics = [0,1,2])
305305
x*e^x + e^x
306306

307307
sage: desolve_laplace(diff(f,x,2) == 2*diff(f,x)-f, dvar = f)

src/doc/en/prep/Quickstarts/Differential-Equations.rst

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Basic Symbolic Techniques
2121

2222
::
2323

24-
sage: y = function('y',x)
24+
sage: y = function('y')(x)
2525
sage: de = diff(y,x) + y -2
2626
sage: h = desolve(de, y)
2727

@@ -102,7 +102,7 @@ gives the last list in the example.
102102

103103
::
104104

105-
sage: f=function('f',x)
105+
sage: f=function('f')(x)
106106
sage: desolve_laplace(diff(f,x,2) == 2*diff(f,x)-f, dvar = f, ics = [0,1,2])
107107
x*e^x + e^x
108108

@@ -124,7 +124,7 @@ conditions.
124124

125125
::
126126

127-
sage: y = function('y',x)
127+
sage: y = function('y')(x)
128128
sage: de = diff(y,x) + y -2
129129
sage: h = desolve_rk4(de, y, step=.05, ics=[0,3])
130130

src/doc/en/tutorial/tour_algebra.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ solve the equation :math:`x'+x-1=0`:
164164
::
165165

166166
sage: t = var('t') # define a variable t
167-
sage: x = function('x',t) # define x to be a function of that variable
167+
sage: x = function('x')(t) # define x to be a function of that variable
168168
sage: DE = diff(x, t) + x - 1
169169
sage: desolve(DE, [x,t])
170170
(_C + e^t)*e^(-t)

src/doc/fr/tutorial/tour_algebra.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ ordinaires. Pour résoudre l'équation :math:`x'+x-1=0` :
129129
::
130130

131131
sage: t = var('t') # on définit une variable t
132-
sage: function('x',t) # on déclare x fonction de cette variable
132+
sage: function('x')(t) # on déclare x fonction de cette variable
133133
x(t)
134134
sage: DE = lambda y: diff(y,t) + y - 1
135135
sage: desolve(DE(x(t)), [x(t),t])

src/doc/ja/tutorial/tour_algebra.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ Sageを使って常微分方程式を研究することもできる. :math:`x'
164164
::
165165

166166
sage: t = var('t') # 変数 t を定義
167-
sage: x = function('x',t) # x を t の関数とする
167+
sage: x = function('x')(t) # x を t の関数とする
168168
sage: DE = diff(x, t) + x - 1
169169
sage: desolve(DE, [x,t])
170170
(_C + e^t)*e^(-t)

src/doc/pt/tutorial/tour_algebra.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ ordinárias. Para resolver a equação :math:`x'+x-1=0`:
151151
::
152152

153153
sage: t = var('t') # define a variable t
154-
sage: x = function('x',t) # define x to be a function of that variable
154+
sage: x = function('x')(t) # define x to be a function of that variable
155155
sage: DE = diff(x, t) + x - 1
156156
sage: desolve(DE, [x,t])
157157
(_C + e^t)*e^(-t)

src/doc/ru/tutorial/tour_algebra.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ Sage может использоваться для решения диффер
147147
::
148148

149149
sage: t = var('t') # определение переменной t для символьных вычислений
150-
sage: x = function('x',t) # определение функции x зависящей от t
150+
sage: x = function('x')(t) # определение функции x зависящей от t
151151
sage: DE = diff(x, t) + x - 1
152152
sage: desolve(DE, [x,t])
153153
(_C + e^t)*e^(-t)

src/sage/calculus/calculus.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@
357357
Check to see that the problem with the variables method mentioned
358358
in :trac:`3779` is actually fixed::
359359
360-
sage: f = function('F',x)
360+
sage: f = function('F')(x)
361361
sage: diff(f*SR(1),x)
362362
D[0](F)(x)
363363
@@ -1271,7 +1271,7 @@ def laplace(ex, t, s):
12711271
12721272
We do a formal calculation::
12731273
1274-
sage: f = function('f', x)
1274+
sage: f = function('f')(x)
12751275
sage: g = f.diff(x); g
12761276
D[0](f)(x)
12771277
sage: g.laplace(x, s)
@@ -1297,8 +1297,8 @@ def laplace(ex, t, s):
12971297
sage: var('t')
12981298
t
12991299
sage: t = var('t')
1300-
sage: x = function('x', t)
1301-
sage: y = function('y', t)
1300+
sage: x = function('x')(t)
1301+
sage: y = function('y')(t)
13021302
sage: de1 = x.diff(t) + 16*y
13031303
sage: de2 = y.diff(t) + x - 1
13041304
sage: de1.laplace(t, s)
@@ -1424,7 +1424,7 @@ def at(ex, *args, **kwds):
14241424
14251425
sage: var('s,t')
14261426
(s, t)
1427-
sage: f=function('f', t)
1427+
sage: f=function('f')(t)
14281428
sage: f.diff(t,2)
14291429
D[0, 0](f)(t)
14301430
sage: f.diff(t,2).laplace(t,s)
@@ -1521,7 +1521,7 @@ def dummy_diff(*args):
15211521
Here the function is used implicitly::
15221522
15231523
sage: a = var('a')
1524-
sage: f = function('cr', a)
1524+
sage: f = function('cr')(a)
15251525
sage: g = f.diff(a); g
15261526
D[0](cr)(a)
15271527
"""
@@ -1539,7 +1539,7 @@ def dummy_integrate(*args):
15391539
EXAMPLES::
15401540
15411541
sage: from sage.calculus.calculus import dummy_integrate
1542-
sage: f(x) = function('f',x)
1542+
sage: f = function('f')
15431543
sage: dummy_integrate(f(x), x)
15441544
integrate(f(x), x)
15451545
sage: a,b = var('a,b')
@@ -1560,7 +1560,7 @@ def dummy_laplace(*args):
15601560
15611561
sage: from sage.calculus.calculus import dummy_laplace
15621562
sage: s,t = var('s,t')
1563-
sage: f(t) = function('f',t)
1563+
sage: f = function('f')
15641564
sage: dummy_laplace(f(t),t,s)
15651565
laplace(f(t), t, s)
15661566
"""
@@ -1575,7 +1575,7 @@ def dummy_inverse_laplace(*args):
15751575
15761576
sage: from sage.calculus.calculus import dummy_inverse_laplace
15771577
sage: s,t = var('s,t')
1578-
sage: F(s) = function('F',s)
1578+
sage: F = function('F')
15791579
sage: dummy_inverse_laplace(F(s),s,t)
15801580
ilt(F(s), s, t)
15811581
"""
@@ -1649,7 +1649,7 @@ def _laplace_latex_(self, *args):
16491649
sage: from sage.calculus.calculus import _laplace_latex_
16501650
sage: var('s,t')
16511651
(s, t)
1652-
sage: f = function('f',t)
1652+
sage: f = function('f')(t)
16531653
sage: _laplace_latex_(0,f,t,s)
16541654
'\\mathcal{L}\\left(f\\left(t\\right), t, s\\right)'
16551655
sage: latex(laplace(f, t, s))
@@ -1668,7 +1668,7 @@ def _inverse_laplace_latex_(self, *args):
16681668
sage: from sage.calculus.calculus import _inverse_laplace_latex_
16691669
sage: var('s,t')
16701670
(s, t)
1671-
sage: F = function('F',s)
1671+
sage: F = function('F')(s)
16721672
sage: _inverse_laplace_latex_(0,F,s,t)
16731673
'\\mathcal{L}^{-1}\\left(F\\left(s\\right), s, t\\right)'
16741674
sage: latex(inverse_laplace(F,s,t))
@@ -1731,7 +1731,7 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
17311731
sage: from sage.calculus.calculus import symbolic_expression_from_maxima_string as sefms
17321732
sage: sefms('x^%e + %e^%pi + %i + sin(0)')
17331733
x^e + e^pi + I
1734-
sage: f = function('f',x)
1734+
sage: f = function('f')(x)
17351735
sage: sefms('?%at(f(x),x=2)#1')
17361736
f(2) != 1
17371737
sage: a = sage.calculus.calculus.maxima("x#0"); a

src/sage/calculus/desolvers.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False)
135135
EXAMPLES::
136136
137137
sage: x = var('x')
138-
sage: y = function('y', x)
138+
sage: y = function('y')(x)
139139
sage: desolve(diff(y,x) + y - 1, y)
140140
(_C + e^x)*e^(-x)
141141
@@ -152,7 +152,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False)
152152
We can also solve second-order differential equations.::
153153
154154
sage: x = var('x')
155-
sage: y = function('y', x)
155+
sage: y = function('y')(x)
156156
sage: de = diff(y,x,2) - y == x
157157
sage: desolve(de, y)
158158
_K2*e^(-x) + _K1*e^x - x
@@ -368,7 +368,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False)
368368
369369
:trac:`9961` fixed (allow assumptions on the dependent variable in desolve)::
370370
371-
sage: y=function('y',x); assume(x>0); assume(y>0)
371+
sage: y=function('y')(x); assume(x>0); assume(y>0)
372372
sage: sage.calculus.calculus.maxima('domain:real') # needed since Maxima 5.26.0 to get the answer as below
373373
real
374374
sage: desolve(x*diff(y,x)-x*sqrt(y^2+x^2)-y == 0, y, contrib_ode=True)
@@ -388,7 +388,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False)
388388
:trac:`6479` fixed::
389389
390390
sage: x = var('x')
391-
sage: y = function('y', x)
391+
sage: y = function('y')(x)
392392
sage: desolve( diff(y,x,x) == 0, y, [0,0,1])
393393
x
394394
@@ -400,15 +400,15 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False)
400400
:trac:`9835` fixed::
401401
402402
sage: x = var('x')
403-
sage: y = function('y', x)
403+
sage: y = function('y')(x)
404404
sage: desolve(diff(y,x,2)+y*(1-y^2)==0,y,[0,-1,1,1])
405405
Traceback (most recent call last):
406406
...
407407
NotImplementedError: Unable to use initial condition for this equation (freeofx).
408408
409409
:trac:`8931` fixed::
410410
411-
sage: x=var('x'); f=function('f',x); k=var('k'); assume(k>0)
411+
sage: x=var('x'); f=function('f')(x); k=var('k'); assume(k>0)
412412
sage: desolve(diff(f,x,2)/f==k,f,ivar=x)
413413
_K1*e^(sqrt(k)*x) + _K2*e^(-sqrt(k)*x)
414414
@@ -432,7 +432,7 @@ def desolve(de, dvar, ics=None, ivar=None, show_method=False, contrib_ode=False)
432432
if is_SymbolicEquation(de):
433433
de = de.lhs() - de.rhs()
434434
if is_SymbolicVariable(dvar):
435-
raise ValueError("You have to declare dependent variable as a function, eg. y=function('y',x)")
435+
raise ValueError("You have to declare dependent variable as a function evaluated at the independent variable, eg. y=function('y')(x)")
436436
# for backwards compatibility
437437
if isinstance(dvar, list):
438438
dvar, ivar = dvar
@@ -550,7 +550,7 @@ def sanitize_var(exprs):
550550
## EXAMPLES:
551551
## sage: from sage.calculus.desolvers import desolve_laplace
552552
## sage: x = var('x')
553-
## sage: f = function('f', x)
553+
## sage: f = function('f')(x)
554554
## sage: de = lambda y: diff(y,x,x) - 2*diff(y,x) + y
555555
## sage: desolve_laplace(de(f(x)),[f,x])
556556
## #x*%e^x*(?%at('diff('f(x),x,1),x=0))-'f(0)*x*%e^x+'f(0)*%e^x
@@ -598,7 +598,7 @@ def desolve_laplace(de, dvar, ics=None, ivar=None):
598598
599599
EXAMPLES::
600600
601-
sage: u=function('u',x)
601+
sage: u=function('u')(x)
602602
sage: eq = diff(u,x) - exp(-x) - u == 0
603603
sage: desolve_laplace(eq,u)
604604
1/2*(2*u(0) + 1)*e^x - 1/2*e^(-x)
@@ -616,15 +616,15 @@ def desolve_laplace(de, dvar, ics=None, ivar=None):
616616
617617
::
618618
619-
sage: f=function('f', x)
619+
sage: f=function('f')(x)
620620
sage: eq = diff(f,x) + f == 0
621621
sage: desolve_laplace(eq,f,[0,1])
622622
e^(-x)
623623
624624
::
625625
626626
sage: x = var('x')
627-
sage: f = function('f', x)
627+
sage: f = function('f')(x)
628628
sage: de = diff(f,x,x) - 2*diff(f,x) + f
629629
sage: desolve_laplace(de,f)
630630
-x*e^x*f(0) + x*e^x*D[0](f)(0) + e^x*f(0)
@@ -639,7 +639,7 @@ def desolve_laplace(de, dvar, ics=None, ivar=None):
639639
Trac #4839 fixed::
640640
641641
sage: t=var('t')
642-
sage: x=function('x', t)
642+
sage: x=function('x')(t)
643643
sage: soln=desolve_laplace(diff(x,t)+x==1, x, ics=[0,2])
644644
sage: soln
645645
e^(-t) + 1
@@ -670,7 +670,7 @@ def desolve_laplace(de, dvar, ics=None, ivar=None):
670670
if is_SymbolicEquation(de):
671671
de = de.lhs() - de.rhs()
672672
if is_SymbolicVariable(dvar):
673-
raise ValueError("You have to declare dependent variable as a function, eg. y=function('y',x)")
673+
raise ValueError("You have to declare dependent variable as a function evaluated at the independent variable, eg. y=function('y')(x)")
674674
# for backwards compatibility
675675
if isinstance(dvar, list):
676676
dvar, ivar = dvar
@@ -724,8 +724,8 @@ def desolve_system(des, vars, ics=None, ivar=None):
724724
EXAMPLES::
725725
726726
sage: t = var('t')
727-
sage: x = function('x', t)
728-
sage: y = function('y', t)
727+
sage: x = function('x')(t)
728+
sage: y = function('y')(t)
729729
sage: de1 = diff(x,t) + y - 1 == 0
730730
sage: de2 = diff(y,t) - x + 1 == 0
731731
sage: desolve_system([de1, de2], [x,y])
@@ -748,16 +748,16 @@ def desolve_system(des, vars, ics=None, ivar=None):
748748
Check that :trac:`9823` is fixed::
749749
750750
sage: t = var('t')
751-
sage: x = function('x', t)
751+
sage: x = function('x')(t)
752752
sage: de1 = diff(x,t) + 1 == 0
753753
sage: desolve_system([de1], [x])
754754
-t + x(0)
755755
756756
Check that :trac:`16568` is fixed::
757757
758758
sage: t = var('t')
759-
sage: x = function('x', t)
760-
sage: y = function('y', t)
759+
sage: x = function('x')(t)
760+
sage: y = function('y')(t)
761761
sage: de1 = diff(x,t) + y - 1 == 0
762762
sage: de2 = diff(y,t) - x + 1 == 0
763763
sage: des = [de1,de2]
@@ -783,8 +783,8 @@ def desolve_system(des, vars, ics=None, ivar=None):
783783
784784
sage: t = var('t')
785785
sage: epsilon = var('epsilon')
786-
sage: x1 = function('x1', t)
787-
sage: x2 = function('x2', t)
786+
sage: x1 = function('x1')(t)
787+
sage: x2 = function('x2')(t)
788788
sage: de1 = diff(x1,t) == epsilon
789789
sage: de2 = diff(x2,t) == -2
790790
sage: desolve_system([de1, de2], [x1, x2], ivar=t)
@@ -1156,7 +1156,7 @@ def desolve_rk4(de, dvar, ics=None, ivar=None, end_points=None, step=0.1, output
11561156
desolve function In this example we integrate bakwards, since
11571157
``end_points < ics[0]``::
11581158
1159-
sage: y=function('y',x)
1159+
sage: y=function('y')(x)
11601160
sage: desolve_rk4(diff(y,x)+y*(y-1) == x-2,y,ics=[1,1],step=0.5, end_points=0)
11611161
[[0.0, 8.904257108962112], [0.5, 1.909327945361535], [1, 1]]
11621162

0 commit comments

Comments
 (0)