Posts: 157 Threads: 30 Joined: Mar 2019 Reputation: **0** Likes received: 1 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: 325 Threads: 3 Joined: Jun 2018 Reputation: **23** Likes received: 55 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: 157 Threads: 30 Joined: Mar 2019 Reputation: **0** Likes received: 1 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: 325 Threads: 3 Joined: Jun 2018 Reputation: **23** Likes received: 55 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: 157 Threads: 30 Joined: Mar 2019 Reputation: **0** Likes received: 1 same empty graph, different error message. raise RuntimeError("matplotlib does not support generators " RuntimeError: matplotlib does not support generators as input Posts: 325 Threads: 3 Joined: Jun 2018 Reputation: **23** Likes received: 55 Posts: 157 Threads: 30 Joined: Mar 2019 Reputation: **0** Likes received: 1 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: 325 Threads: 3 Joined: Jun 2018 Reputation: **23** Likes received: 55 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: 157 Threads: 30 Joined: Mar 2019 Reputation: **0** Likes received: 1 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: 325 Threads: 3 Joined: Jun 2018 Reputation: **23** Likes received: 55 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. |