Posts: 203
Threads: 41
Joined: Mar 2019
Mar-27-2019, 12:33 PM
(This post was last modified: Mar-27-2019, 12:58 PM by Yoriz.)
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)
Posts: 8,091
Threads: 154
Joined: Sep 2016
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)
Posts: 203
Threads: 41
Joined: Mar 2019
Mar-27-2019, 01:03 PM
(This post was last modified: Mar-27-2019, 01:05 PM by Yoriz.)
sorry, I think I posted this in the wrong forum.
Posts: 2,164
Threads: 35
Joined: Sep 2016
Try print(list(error)) And then look up generator expressions
Posts: 203
Threads: 41
Joined: Mar 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))
Posts: 333
Threads: 4
Joined: Jun 2018
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)
Posts: 203
Threads: 41
Joined: Mar 2019
and by the way, this thread is still here. Are you sure you moved it?
Posts: 2,164
Threads: 35
Joined: Sep 2016
I moved it here because the issue is a general coding issue not data science
Posts: 203
Threads: 41
Joined: Mar 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.
Posts: 333
Threads: 4
Joined: Jun 2018
Mar-27-2019, 01:40 PM
(This post was last modified: Mar-27-2019, 01:41 PM by gontajones.)
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!
|