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 [email protected]
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/
-~----------~----~----~----~------~----~------~--~---