1 | initial version |
Did you try the 2 codes ?
The first "code" shows us that Maxima's sign
is unhappy with I
: file a ticket against Maxima.
The second "code" shows a problem with parametric_plot3d
:
sage: parametric_plot3d([cos(t), sin(t), h(t)], (t, 0, 4*pi), aspect_ratio=1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-103-49367a62c914> in <module>
----> 1 parametric_plot3d([cos(t), sin(t), h(t)], (t, Integer(0), Integer(4)*pi), aspect_ratio=Integer(1))
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/misc/decorators.py in wrapper(*args, **kwds)
649 kwds[new_name] = kwds[old_name]
650 del kwds[old_name]
--> 651 return func(*args, **kwds)
652
653 return wrapper
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/plot/plot3d/parametric_plot3d.py in parametric_plot3d(f, urange, vrange, plot_points, boundary_style, **kwds)
1004 if plot_points == "automatic":
1005 plot_points = 75
-> 1006 G = _parametric_plot3d_curve(f, urange, plot_points=plot_points, **kwds)
1007 else:
1008 if plot_points == "automatic":
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/plot/plot3d/parametric_plot3d.py in _parametric_plot3d_curve(f, urange, plot_points, **kwds)
1061 """
1062 from sage.plot.misc import setup_for_eval_on_grid
-> 1063 g, ranges = setup_for_eval_on_grid(f, [urange], plot_points)
1064 f_x, f_y, f_z = g
1065 w = [(f_x(u), f_y(u), f_z(u)) for u in xsrange(*ranges[0], include_endpoint=True)]
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/plot/misc.py in setup_for_eval_on_grid(funcs, ranges, plot_points, return_vars)
149 vars)
150 else:
--> 151 return (fast_float(funcs, *vars, **options),
152 [tuple(_range + [range_step])
153 for _range, range_step in zip(ranges, range_steps)])
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_eval.pyx in sage.ext.fast_eval.fast_float (build/cythonized/sage/ext/fast_eval.c:1617)()
74
75 if isinstance(f, (tuple, list)):
---> 76 return tuple([fast_float(x, *vars, expect_one_var=expect_one_var) for x in f])
77
78 cdef int i
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_eval.pyx in sage.ext.fast_eval.fast_float (build/cythonized/sage/ext/fast_eval.c:1830)()
86
87 try:
---> 88 return fast_callable(f, vars=vars, domain=float,
89 expect_one_var=expect_one_var)
90 except AttributeError:
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.fast_callable (build/cythonized/sage/ext/fast_callable.c:4518)()
463
464 etb = ExpressionTreeBuilder(vars=vars, domain=domain)
--> 465 et = x._fast_callable_(etb)
466
467 if isinstance(domain, sage.rings.abc.RealField):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:93084)()
12625 """
12626 from sage.symbolic.expression_conversions import fast_callable
> 12627 return fast_callable(self, etb)
12628
12629 def show(self):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1866
1867 """
-> 1868 return FastCallableConverter(ex, etb)()
1869
1870 class RingConverter(Converter):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
204 div = self.get_fake_div(ex)
205 return self.arithmetic(div, div.operator())
--> 206 return self.arithmetic(ex, operator)
207 elif operator in relation_operators:
208 return self.relation(ex, operator)
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in arithmetic(self, ex, operator)
1784 elif exponent == 0.5:
1785 from sage.misc.functional import sqrt
-> 1786 return self.etb.call(sqrt, operands[0])
1787 elif exponent == -0.5:
1788 from sage.misc.functional import sqrt
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7029)()
743 return self(base)**exponent
744 else:
--> 745 return ExpressionCall(self, fn, [self(a) for a in args])
746
747 def choice(self, cond, iftrue, iffalse):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6116)()
617 return self.constant(x)
618
--> 619 return fc(self)
620
621 def _clean_var(self, v):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:93084)()
12625 """
12626 from sage.symbolic.expression_conversions import fast_callable
> 12627 return fast_callable(self, etb)
12628
12629 def show(self):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1866
1867 """
-> 1868 return FastCallableConverter(ex, etb)()
1869
1870 class RingConverter(Converter):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
212 return self.tuple(ex)
213 else:
--> 214 return self.composition(ex, operator)
215
216 def get_fake_div(self, ex):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in composition(self, ex, function)
1832 {arctan2}(v_0, v_1)
1833 """
-> 1834 return self.etb.call(function, *ex.operands())
1835
1836 def tuple(self, ex):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7029)()
743 return self(base)**exponent
744 else:
--> 745 return ExpressionCall(self, fn, [self(a) for a in args])
746
747 def choice(self, cond, iftrue, iffalse):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6116)()
617 return self.constant(x)
618
--> 619 return fc(self)
620
621 def _clean_var(self, v):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:93084)()
12625 """
12626 from sage.symbolic.expression_conversions import fast_callable
> 12627 return fast_callable(self, etb)
12628
12629 def show(self):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1866
1867 """
-> 1868 return FastCallableConverter(ex, etb)()
1869
1870 class RingConverter(Converter):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
204 div = self.get_fake_div(ex)
205 return self.arithmetic(div, div.operator())
--> 206 return self.arithmetic(ex, operator)
207 elif operator in relation_operators:
208 return self.relation(ex, operator)
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in arithmetic(self, ex, operator)
1794 elif operator == mul_vararg:
1795 operator = _operator.mul
-> 1796 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1797
1798 def symbol(self, ex):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in <lambda>(x, y)
1794 elif operator == mul_vararg:
1795 operator = _operator.mul
-> 1796 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1797
1798 def symbol(self, ex):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7029)()
743 return self(base)**exponent
744 else:
--> 745 return ExpressionCall(self, fn, [self(a) for a in args])
746
747 def choice(self, cond, iftrue, iffalse):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6116)()
617 return self.constant(x)
618
--> 619 return fc(self)
620
621 def _clean_var(self, v):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:93084)()
12625 """
12626 from sage.symbolic.expression_conversions import fast_callable
> 12627 return fast_callable(self, etb)
12628
12629 def show(self):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1866
1867 """
-> 1868 return FastCallableConverter(ex, etb)()
1869
1870 class RingConverter(Converter):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
203 if getattr(self, 'use_fake_div', False) and (operator is _operator.mul or operator is mul_vararg):
204 div = self.get_fake_div(ex)
--> 205 return self.arithmetic(div, div.operator())
206 return self.arithmetic(ex, operator)
207 elif operator in relation_operators:
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in arithmetic(self, ex, operator)
1794 elif operator == mul_vararg:
1795 operator = _operator.mul
-> 1796 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1797
1798 def symbol(self, ex):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in <lambda>(x, y)
1794 elif operator == mul_vararg:
1795 operator = _operator.mul
-> 1796 return reduce(lambda x,y: self.etb.call(operator, x,y), operands)
1797
1798 def symbol(self, ex):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.call (build/cythonized/sage/ext/fast_callable.c:7029)()
743 return self(base)**exponent
744 else:
--> 745 return ExpressionCall(self, fn, [self(a) for a in args])
746
747 def choice(self, cond, iftrue, iffalse):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.__call__ (build/cythonized/sage/ext/fast_callable.c:6116)()
617 return self.constant(x)
618
--> 619 return fc(self)
620
621 def _clean_var(self, v):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression._fast_callable_ (build/cythonized/sage/symbolic/expression.cpp:93084)()
12625 """
12626 from sage.symbolic.expression_conversions import fast_callable
> 12627 return fast_callable(self, etb)
12628
12629 def show(self):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in fast_callable(ex, etb)
1866
1867 """
-> 1868 return FastCallableConverter(ex, etb)()
1869
1870 class RingConverter(Converter):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
194 except TypeError as err:
195 if 'self must be a numeric expression' not in err.args:
--> 196 raise err
197
198 operator = ex.operator()
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in __call__(self, ex)
191 try:
192 obj = ex.pyobject()
--> 193 return self.pyobject(ex, obj)
194 except TypeError as err:
195 if 'self must be a numeric expression' not in err.args:
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/symbolic/expression_conversions.py in pyobject(self, ex, obj)
1724 if isinstance(obj, Constant):
1725 obj = obj.expression()
-> 1726 return self.etb.constant(obj)
1727
1728 def relation(self, ex, operator):
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/ext/fast_callable.pyx in sage.ext.fast_callable.ExpressionTreeBuilder.constant (build/cythonized/sage/ext/fast_callable.c:6370)()
659 """
660 if self._domain is not None:
--> 661 c = self._domain(c)
662 return ExpressionConstant(self, c)
663
/usr/local/sage-9/local/lib/python3.9/site-packages/sage/rings/number_field/number_field_element.pyx in sage.rings.number_field.number_field_element.NumberFieldElement.__float__ (build/cythonized/sage/rings/number_field/number_field_element.cpp:19548)()
1916 if c.imag == 0:
1917 return c.real
-> 1918 raise TypeError('unable to coerce to a real number')
1919
1920 def _complex_double_(self, CDF):
TypeError: unable to coerce to a real number
On the other hand, the following call works :
sage: parametric_plot3d([lambda u:cos(u), lambda u:sin(u), lambda u:h(u)], (0, 4*pi), aspect_ratio=1)
Launched html viewer for Graphics3d Object
as does this one :
sage: parametric_plot3d([cos, sin, lambda u:h(u)], (0, 4*pi), aspect_ratio=1)
Launched html viewer for Graphics3d Object
But not this one :
sage: parametric_plot3d([cos, sin, h], (0, 4*pi), aspect_ratio=1)
[ Snip... ]
TypeError: unable to coerce to a real number
This implies that lambda u:h(u)
is interpreted as a function for parametric_plot3d
purposes, but not h
. File a ticket against that...