On 11 April 2014 20:19, John Cremona <john.crem...@gmail.com> wrote: > Here is how I would implement it:
Apologies, wrong thread. > > sage: v = [385, 231, 165, 105] > sage: _,_,U = Matrix(v).smith_form() > sage: U.column(0) > (-38, 76, -19, 2) > sage: U.column(0) * vector(v) > 1 > > > > On 11 April 2014 19:42, kcrisman <kcris...@gmail.com> wrote: >> >> >> On Friday, April 11, 2014 1:41:55 PM UTC-4, Greg Marks wrote: >>> >>> A problem that arose in a recent calculus class involved practical methods >>> for finding a numerical estimate of the arc length of the curve y = x^3 >>> from (0,0) to (2,8). So, one might ask, could one use SAGE to perform >>> this computation, say, to 10000 decimal places? (By the way, I don't think >>> this is such an unreasonable request. On a computer with 8 GB of RAM, one >>> can easily compute the arc length of a circle to one billion decimal places, >>> for example, using Hanhong Xue's implementation of the Chudnovsky algorithm >>> in GMP.) >>> >>> Here is how not to do it: >>> >>>> sage: %time n(1/sqrt(3)*integrate(sqrt(1+x^4), x, 0, 2*sqrt(3)), >>>> digits=10000) >>>> CPU times: user 1.53 s, sys: 0.07 s, total: 1.60 s >>>> Wall time: 1.60 s >>>> 8.630329222227694 >>> >>> >>> Well, at least it didn't take very long. Pretend you didn't know how to >>> antidifferentiate the integrand using special functions. We could proceed >>> as follows: >>> >>>> sage: from sympy import integrate, sqrt, var >>>> sage: x=var('x') >>>> sage: f=sqrt(1+x**4) >>>> sage: f.integrate(x) >>>> x*gamma(1/4)*hyper((-1/2, 1/4), (5/4,), >>>> x**4*exp_polar(I*pi))/(4*gamma(5/4)) >>> >>> >>> Performing the obvious simplifications in our heads, we now use this >>> antiderivative to evaluate our definite integral: >>> >>>> sage: from mpmath import mp, hyp2f1 >>>> sage: mp.dps = 10001 >>>> sage: %time arclength=2*hyp2f1(-1/2,1/4,5/4,-144) >>>> CPU times: user 144.20 s, sys: 0.20 s, total: 144.40 s >>>> Wall time: 144.55 s >>>> sage: place = file('/tmp/arclength.txt','w') >>>> sage: place.write(str(arclength)) >>>> sage: place.close() >>> >>> >>> The file /tmp/arclength.txt now contains the value of the definite >>> integral to 10000 decimal places. (I haven't tested it, but I'm pretty sure >>> the alternatives >>> >>>> sage: mpmath.quadts(lambda x: 1/sqrt(3)*sqrt(1+x^4), (0, 2*sqrt(3))) >>> >>> >>> and >>> >>>> sage: new_prec=gp.set_precision(10000) >>>> >>>> sage: gp('intnum(x = 0, 2*sqrt(3), 1/sqrt(3)*sqrt(1+x^4))') >>> >>> >>> would take much too long.) >>> >>> The good news is that this problem can be solved in SAGE. There was a >>> time when one of the few areas in which Maple and Mathematica could claim >>> superiority to SAGE was in this sort of integration problem. The procedure >>> given above at least provides evidence, if not proof, that this is no longer >>> the case. >>> >>> The bad news is that the commands I used were highly unintuitive! I had >>> to know to use sympy. I had to know which of its routines to import. I had >>> to know the syntax sympy would accept in defining the function (e.g. for >>> exponentiation). Then I had to know to call mpmath. I had to know the name >>> mpmath uses for the hypergeometric function, which is different from the >>> name sympy uses. >>> >>> It would be great if all of this were seamlessly integrated together in >>> SAGE, so that if a newcomer simply types in the obvious thing (such as "how >>> not to do it" above), he or she gets the desired result. Short of that, is >>> there anything simpler than the somewhat tortuous path that I followed? >> >> >> This is a great post, thanks! The problem is that Maxima knows some >> antiderivatives for such things, sympy knows others, and I don't know where >> the intersection is. >> >> n(1/sqrt(3)*integrate(sqrt(1+x^4), x, 0, 2*sqrt(3),algorithm='sympy'), >> digits=100) >> >> is another thing I would have gone with, but >> >> AttributeError: 'gamma' object has no attribute '_sage_' >> >> It would probably not be a good idea to have integration try every single >> subsystem for every integral though. >> >> There are a lot of tickets which would do exactly what you are talking >> about. Gluing sympy (which is really much improved from its early days, and >> very useful) in better, as we see didn't happen in my example, is one way to >> help; http://trac.sagemath.org/ticket/2516 might be another... see >> http://trac.sagemath.org/ticket/14446 for something similar. Aargh. >> >> I thought one could get arbitrary numerical integration precision from the >> GSL interface (numerical_integral) but I'm having trouble interpreting it to >> do so. >> >> Are you interested in helping us get these things organized better? It >> would be greatly appreciated. >> >> - kcrisman >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sage-support" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sage-support+unsubscr...@googlegroups.com. >> To post to this group, send email to sage-support@googlegroups.com. >> Visit this group at http://groups.google.com/group/sage-support. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To post to this group, send email to sage-support@googlegroups.com. Visit this group at http://groups.google.com/group/sage-support. For more options, visit https://groups.google.com/d/optout.