Python Forum
Getting an unexpected generator object ?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Getting an unexpected generator object ?
#1
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)
Reply
#2
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)
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#3
sorry, I think I posted this in the wrong forum.
Reply
#4
Try
print(list(error))
And then look up generator expressions
Reply
#5
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))
Reply
#6
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)
Reply
#7
and by the way, this thread is still here. Are you sure you moved it?
Reply
#8
I moved it here because the issue is a general coding issue not data science
Reply
#9
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.
Reply
#10
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!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Creating list of lists from generator object t4keheart 1 2,161 Nov-13-2020, 04:59 AM
Last Post: perfringo
  unexpected object? urufu 2 1,963 Mar-08-2020, 02:35 PM
Last Post: urufu
  receive from a generator, send to a generator Skaperen 9 5,423 Feb-05-2018, 06:26 AM
Last Post: Skaperen

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020