Bottom Page

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)


Quote
#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)
Quote
#3
sorry, I think I posted this in the wrong forum.
Yoriz wrote Mar-27-2019, 01:05 PM:
It's ok I moved it
Quote
#4
Try
print(list(error))
And then look up generator expressions
Quote
#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))

Quote
#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)
Quote
#7
and by the way, this thread is still here. Are you sure you moved it?
Quote
#8
I moved it here because the issue is a general coding issue not data science
Quote
#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.
Quote
#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!
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  receive from a generator, send to a generator Skaperen 9 1,315 Feb-05-2018, 06:26 AM
Last Post: Skaperen

Forum Jump:


Users browsing this thread: 1 Guest(s)