1 | initial version |

If your goal is to plot, then you only need a function that accepts numbers and returns numbers:

```
def f(x):
if -2 <= x < -1:
return x + 1
elif -1 <= x < 0:
return 0
elif 0 <= x < 1:
return x^2
elif 1 <= x <= 3:
return x^3
```

Indeed,

```
sage: plot(f,(-2,3))
```

Now, this function does not play well with symbolic variables:

```
sage: var('x')
sage: print(f(x))
None
```

It is because inequalities with symbolic variables only evaluate to `True`

when Sage can prove them; here none of them can be proved because nothing is known about `x`

. If you add assumptions then you can achieve something:

```
sage: assume(0<=x)
sage: assume(x<1)
sage: f(x)
x^2
```

But it does not help with plotting. The above explains why e.g. `var('x'); plot(f(x),(x,2,3))`

does not work.

You can have piecewise-defined symbolic functions in Sage, to some extent:

```
sage: var('x')
sage: f = piecewise([([-2,-1], x+1), ((-1,0), 0), ((0,1), x^2), ([1,3], x^3)])
sage: plot(f,(-2,3))
```

It gives the same plot. Now it is also possible to evaluate `f(x)`

for symbolic `x`

:

```
sage: f(x)
piecewise(x|-->x + 1 on [-2, -1], x|-->0 on (-1, 0), x|-->x^2 on (0, 1), x|-->x^3 on [1, 3]; x)
sage: plot(f(x),(x,-2,3))
```

Again, the same plot. This 'piecewise' functionality is unfortunately somewhat fragile, e.g. `diff(f,x)`

returns junk.

2 | No.2 Revision |

If your goal is to plot, then you only need a function that accepts numbers and returns numbers:

```
def f(x):
if -2 <= x < -1:
return x + 1
elif -1 <= x < 0:
return 0
elif 0 <= x < 1:
return x^2
elif 1 <= x <= 3:
return x^3
```

Indeed,

```
sage: plot(f,(-2,3))
```

Now, this function does not play well with symbolic variables:

```
sage: var('x')
sage: print(f(x))
None
```

It is because inequalities with symbolic variables only evaluate to `True`

when Sage can prove them; here none of them can be proved because nothing is known about `x`

. If you add assumptions then you can achieve something:

```
sage: assume(0<=x)
sage: assume(x<1)
sage: f(x)
x^2
```

But it does not help with plotting. The above explains why e.g. `var('x'); plot(f(x),(x,2,3))`

does not work.

You can have univariate piecewise-defined symbolic functions in Sage, to some extent:

```
sage: var('x')
sage: f = piecewise([([-2,-1], x+1), ((-1,0), 0), ((0,1), x^2), ([1,3], x^3)])
sage: plot(f,(-2,3))
```

It gives the same plot. Now it is also possible to evaluate `f(x)`

for symbolic `x`

:

```
sage: f(x)
piecewise(x|-->x + 1 on [-2, -1], x|-->0 on (-1, 0), x|-->x^2 on (0, 1), x|-->x^3 on [1, 3]; x)
sage: plot(f(x),(x,-2,3))
```

Again, the same plot. This 'piecewise' functionality is unfortunately somewhat fragile, e.g. `diff(f,x)`

returns junk.

To plot a surface with a piecewise parametrization, avoid symbolic variables:

```
def g(x,y):
if x >= y:
return x
else:
return y
parametric_plot3d([lambda x,y: x, lambda x,y: y, g], (-1,1), (-1,1))
```

3 | No.3 Revision |

If your goal is to plot, then you only need a function that accepts numbers and returns numbers:

```
def f(x):
if -2 <= x < -1:
return x + 1
elif -1 <= x < 0:
return 0
elif 0 <= x < 1:
return x^2
elif 1 <= x <= 3:
return x^3
```

Indeed,

```
sage: plot(f,(-2,3))
```

Now, this function does not play well with symbolic variables:

```
sage: var('x')
sage: print(f(x))
None
```

It is because inequalities with symbolic variables only evaluate to `True`

when Sage can prove them; here none of them can be proved because nothing is known about `x`

. If you add assumptions then you can achieve something:

```
sage: assume(0<=x)
sage: assume(x<1)
sage: f(x)
x^2
```

But it does not help with plotting. The above explains why e.g. `var('x'); plot(f(x),(x,2,3))`

does not work.

You can have univariate piecewise-defined symbolic functions in Sage, to some extent:

```
sage: var('x')
sage: f = piecewise([([-2,-1], x+1), ((-1,0), 0), ((0,1), x^2), ([1,3], x^3)])
sage: plot(f,(-2,3))
```

It gives the same plot. Now it is also possible to evaluate `f(x)`

for symbolic `x`

:

```
sage: f(x)
piecewise(x|-->x + 1 on [-2, -1], x|-->0 on (-1, 0), x|-->x^2 on (0, 1), x|-->x^3 on [1, 3]; x)
sage: plot(f(x),(x,-2,3))
```

Again, the same plot. This 'piecewise' functionality is unfortunately somewhat fragile, e.g. `diff(f,x)`

returns junk.

To plot a surface with a piecewise parametrization, avoid symbolic variables:

```
def g(x,y):
if x >= y:
return x
else:
return y
parametric_plot3d([lambda x,y: x, lambda x,y: y, g], (-1,1), (-1,1))
```

Your surface:

```
x_3, y_3 = 1/3, 1/4
def X(u,v):
return u
def Y(u,v):
return v
def Z(u,v):
if 1-u-v <= 0 or u <= 0 or v <= 0: # when P=(u,v) is outside of B or lies on its boundary
return 0
else: # i.e., exactly when P lies in the interior of B
return exp(-((u-x_3)^2+(v-y_3)^2)/((1-u-v)^2*(u^2)*(v^2)))
print(Z(x_3,y_3))
parametric_plot3d([X,Y,Z], (x_3-0.1,x_3+0.1), (y_3-0.1,y_3+0.1), plot_points=[200,200], viewer='threejs')
parametric_plot3d([X,Y,Z], (-2,2), (-2,2), plot_points=[200,200], viewer='threejs')
```

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.