Python Forum

Full Version: Getting an unexpected generator object ?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
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)
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)
sorry, I think I posted this in the wrong forum.
Try
print(list(error))
And then look up generator expressions
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))
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)
and by the way, this thread is still here. Are you sure you moved it?
I moved it here because the issue is a general coding issue not data science
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.
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!
Pages: 1 2