Posts: 203
Threads: 41
Joined: Mar 2019
Thanks,
I am also trying to graph the error vs h with a loglog function, but I have two separate issues.
loglog is not recognized and when I omit it, the graph I obtain is empty.
from scipy import *
import numpy as np
from numpy import array
from scipy import integrate
import matplotlib.pyplot as plt
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))
print(list(error))
plt.plot((list(error),list(h)) for n in range (300,900))
Posts: 333
Threads: 4
Joined: Jun 2018
Importing loglog:
from matplotlib.pyplot import loglog error = (abs(trapezoidal(f, a, b, n) - c[0]) for n in range(300, 900))
plt.plot(list(error), [(b - a) / n for n in range(300, 900)]) From where are you taking this?
Maybe with more info we could help you with the Math too.
Posts: 203
Threads: 41
Joined: Mar 2019
the graph is still empty and this error message shows up:
"have shapes {} and {}".format(x.shape, y.shape))
ValueError: x and y must have same first dimension, but have shapes (0,) and (600,)
Posts: 333
Threads: 4
Joined: Jun 2018
Try this:
error_list = [abs(trapezoidal(f, a, b, n) - c[0]) for n in range(300, 900)]
plt.plot(error_list, [(b - a) / n for n in range(300, 900)])
Posts: 203
Threads: 41
Joined: Mar 2019
same empty graph, different error message.
raise RuntimeError("matplotlib does not support generators "
RuntimeError: matplotlib does not support generators as input
Posts: 333
Threads: 4
Joined: Jun 2018
Posts: 203
Threads: 41
Joined: Mar 2019
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))
print(list(error))
plt.plot(error, [h for n in range(300, 900)])
Posts: 333
Threads: 4
Joined: Jun 2018
You missed my last post...
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_list=[abs(trapezoidal(f,a,b,n)-c[0]) for n in range (300,900)]
print(error_list)
plt.plot(error_list, [h for n in range(300, 900)])
Posts: 203
Threads: 41
Joined: Mar 2019
I see that I forgot the square bracket. Is hard to see sometimes. Thanks.
Now the graph is only a horizontal line, does that imply that there is a logical error?
Posts: 333
Threads: 4
Joined: Jun 2018
I think that h should be a function of n ...
But to change it you'll have to think about trapezoidal(f,a,b,n) and check if it's really returning what are you expecting.
For now...
from scipy import integrate
import matplotlib.pyplot as plt
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_list=[abs(trapezoidal(f,a,b,n)-c[0]) for n in range (300,900)]
print(error_list)
plt.plot(error_list, [(b-a)/(n) for n in range(300, 900)])
plt.show() Like I said, you need to check the Math.
Maybe you can use numpy.trapz.
|