At the moment, (a) "piecewise" is only set up for piecewise polynomials, (b) the "integrate" command is "integral". So, for your function (which is piecewise polynomial), this should work:
sage: f1a = lambda x: -x+1; f1b = lambda x: x+1 sage: f2a = lambda x : -(x - 2) - 1; f2b = lambda x : (x - 2) - 1 sage: tri_wave = piecewise([ [(-1,0), f1a], [(0,1),f1b], [(1,2), f2a], [(2,3),f2b]]) sage: tri_wave.integral() --------------------------------------------------------------------------- <type 'exceptions.AttributeError'> Traceback (most recent call last) /mnt/drive_hda1/sagefiles/sage-2.9.alpha5/<ipython console> in <module>() /home/wdj/wdj/sagefiles/sage-2.9.alpha5/local/lib/python2.5/site-packages/sage/functions/piecewise.py in integral(self, x) 636 invs = self.intervals() 637 n = len(funcs) --> 638 return sum([funcs[i].integral(x,invs[i][0],invs[i][1]) for i in range(n)]) 639 640 def convolution(self,other): <type 'exceptions.AttributeError'>: 'function' object has no attribute 'integral' I have no idea what that error means. It is (if you look at the piecewise.py code) clear that integral is a method for the class PiecewisePolynomial and that tri_wave is an instance of that class. Indeed, tri_wave.[tab] gives you the methods allowed: sage: tri_wave. tri_wave.base_ring tri_wave.intervals tri_wave.convolution tri_wave.laplace tri_wave.cosine_series_coefficient tri_wave.length tri_wave.critical_points tri_wave.list tri_wave.derivative tri_wave.plot tri_wave.domain tri_wave.plot_fourier_series_partial_sum tri_wave.end_points tri_wave.plot_fourier_series_partial_sum_cesaro tri_wave.extend_by_zero_to tri_wave.plot_fourier_series_partial_sum_filtered tri_wave.fourier_series_cosine_coefficient tri_wave.plot_fourier_series_partial_sum_hann tri_wave.fourier_series_partial_sum tri_wave.riemann_sum tri_wave.fourier_series_partial_sum_cesaro tri_wave.riemann_sum_integral_approximation tri_wave.fourier_series_partial_sum_filtered tri_wave.sine_series_coefficient tri_wave.fourier_series_partial_sum_hann tri_wave.tangent_line tri_wave.fourier_series_sine_coefficient tri_wave.trapezoid tri_wave.fourier_series_value tri_wave.trapezoid_integral_approximation tri_wave.functions tri_wave.unextend tri_wave.integral tri_wave.which_function I have no idea if this is another bug or what. Once I understand this, hopefully I can fix the first bug. On Jan 14, 2008 1:00 AM, William Stein <[EMAIL PROTECTED]> wrote: > > On 1/13/08, Hector Villafuerte <[EMAIL PROTECTED]> wrote: > > > > I defined a piecewise function (specifically, a triangular wave) like this: > > > > sage: f1(x) = -abs(x) + 1 > > sage: f2(x) = abs(x - 2) - 1 > > sage: tri_wave = piecewise([ [(-1,1), f1], [(1,3), f2]]) > > > > One can plot it and it looks very nice: > > > > sage: tri_wave.plot() > > > > But while calculating this integral I get "ValueError: Value not > > defined outside of domain." > > > > sage: integrate(tri_wave(x)^2, x, -1, 3) > > > > Is there a way to integrate piecewise-defined functions? > > As always, thanks for your help, > > This is clearly broken. As a band-aide, you can at least > numerically integrate as follows: > > sage: integral_numerical(lambda x: tri_wave(x)^2, -1, 3) > (1.3333333333333333, 1.4765966227514582e-14) > > The first output (1.3333...) is the answer, and the second is an error bound. > > I've made the bug you point out above trac #1773: > http://trac.sagemath.org/sage_trac/ticket/1773 > > -- William > > > > > --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://sage.math.washington.edu/sage/ and http://sage.scipy.org/sage/ -~----------~----~----~----~------~----~------~--~---