<br><br><div class="gmail_quote">On Mon, Dec 12, 2011 at 10:17 AM, Gregor Thalhammer <span dir="ltr"><<a href="mailto:gregor.thalhammer@gmail.com">gregor.thalhammer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Am 12.12.2011 um 15:04 schrieb LASAGNA DAVIDE:<br>
<div class="im"><br>
> Hi,<br>
><br>
> I have written a class for polynomials with negative<br>
> exponents like:<br>
><br>
> p(x) = a0 + a1*x**-1 + ... + an*x**-n<br>
><br>
> The code is this one:<br>
><br>
> class NegativeExpPolynomial( object ):<br>
>      def __init__ ( self, coeffs ):<br>
>          self.coeffs = np.array( coeffs )<br>
><br>
>      def __call__( self, x ):<br>
>          return sum( (c*x**(-i) for i, c in enumerate(<br>
> self.coeffs ) ) )<br>
><br>
> where coeffs = [a0, a1, ..., an].<br>
><br>
> I find that the way i evaluate the polynomial is kind of<br>
> *slow*, especially for polynomial with order larger than<br>
> ~200 and for arrays x large enough.<br>
<br>
</div>I fear that such high orders create a lot of troubles since evaluating them is very sensitive to numerical errors.<br>
<div class="im"><br>
> Do you have suggestions on how to speed up this code?<br>
><br>
<br>
</div>Your polynomials with negative exponents are equivalent to a polynomial with positive exponents, but evaluated at 1/x. Therefore you can make use of the efficient polynomial functions of numpy. Try<br>
<br>
np.polyval(self.coeffs, x)<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div><br>Or numpy.polynomial.polynomial.polyval, which will use the coefficients in the same order. Or you could subclass numpy.polynomial.Polynomial and override the call to use 1/x instead of x.<br>
<br>Chuck <br></div><br></div>