Getting an unexpected generator object ? - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Getting an unexpected generator object ? (/thread-17072.html) Pages:
1
2
|
Getting an unexpected generator object ? - mcgrim - Mar-27-2019 This program should find the difference between the integral of a specific function and the number obtained with the trapezoid formula. I expect to get some values within a range so I can graph them, but instead this is what I am getting: generator object <genexpr> at 0x000001A1B1A66F48 a=0 b=1 n=500 h=(b-a)/(n) def f(x): return x**2 def trapezoidal(f,a,b,n): return (h/2)*(f(a)+f(b))+h*( sum(f(a+h*i) for i in range(1, (n-1))) ) print(trapezoidal(f,a,b,n)) lambda x: f(x) c= integrate.quad(f,0,1) print(c) error=(abs(trapezoidal-c) for n in range (300,900)) print(error) RE: Getting an unexpected generator object ? - buran - Mar-27-2019 line 24 - using () brackets makes it generator expression use square brackets and it will be list comprehension (i.e. if you want to see the numbers when print) RE: Getting an unexpected generator object ? - mcgrim - Mar-27-2019 sorry, I think I posted this in the wrong forum. RE: Getting an unexpected generator object ? - Yoriz - Mar-27-2019 Try print(list(error))And then look up generator expressions RE: Getting an unexpected generator object ? - mcgrim - Mar-27-2019 I changed () to [] on line 24 and added 'list' to 25 but now I get an error "unsupported operand type(s) for -: 'function' and 'tuple'" here is the new code: a=0 b=1 n=500 h=(b-a)/(n) def f(x): return x**2 def trapezoidal(f,a,b,n): return (h/2)*(f(a)+f(b))+h*( sum(f(a+h*i) for i in range(1, (n-1))) ) print(trapezoidal(f,a,b,n)) lambda x: f(x) c= integrate.quad(f,0,1) print(c) error=[abs(trapezoidal-c) for n in range (200,900) ] print(list(error)) RE: Getting an unexpected generator object ? - gontajones - Mar-27-2019 from scipy import integrate a=0 b=1 n=500 h=(b-a)/(n) def f(x): return x**2 def trapezoidal(f,a,b,n): return (h/2)*(f(a)+f(b))+h*( sum(f(a+h*i) for i in range(1, (n-1)))) print(trapezoidal(f,a,b,n)) # Why this? lambda x: f(x) c= integrate.quad(f,0,1) print(c) error=(abs(trapezoidal(f,a,b,n)-c[0]) for n in range (300,900)) for idx, i in enumerate(error): print(idx, i) RE: Getting an unexpected generator object ? - mcgrim - Mar-27-2019 and by the way, this thread is still here. Are you sure you moved it? RE: Getting an unexpected generator object ? - Yoriz - Mar-27-2019 I moved it here because the issue is a general coding issue not data science RE: Getting an unexpected generator object ? - mcgrim - Mar-27-2019 thank you. I have changed line 24-25 with this code error=(abs(trapezoidal(f,a,b,n)-c[0]) for n in range (300,900)) print(list(error))and it works, however, I am not understanding the meaning of c[0], I just notice that if I write just 'c' I get an error. What does the 0 stand for? It looks like is the first element of a list, but c is the outcome of the integral so I am not sure what is the relationship between the integral and the list. RE: Getting an unexpected generator object ? - gontajones - Mar-27-2019 In fact c is the return of the integrate.quad() from scipy.integrate.quad.And it returns a Tuple: >>> c= integrate.quad(f,0,1) >>> print(c) (0.33333333333333337, 3.700743415417189e-15)So you need to get the first element of this tuple (index=0) to get only the integral of function f .BTW I'm just checking the code...not the math! |