L’applicazione presenta 3 quesiti di integrazione numerica dell’Esame di Stato (Liceo Scientifico)
Puoi scegliere se le altezze dei rettangoli sono di sinistra / al centro / di destra e il numero di rettangoli
Web VPython
Bisogna tradurre linspace() e fare a meno di zip()
Web VPython 3.2
#from vpython import *
#-------------------------------------------------------- Problema
ANNO = {
"2001": ["sin(x)" , 0, pi , 2.0 ],
"2003": ["1/(1+x**2)" , 0, 1 , pi/4],
"2008": ["1/sqrt(1-x**2)", 0, 1/2, pi/6]
}
#-------------------------------------------------------- Default
fun = "sin(x)"
a = 0
b = pi
e = 2.0
n = 5
caso = "Sinistra"
#-------------------------------------------------------- Calcoli
def linspace(start, stop, num):
step = (stop-start)/(num-1)
return [start + i*step for i in range(num)]
def approssima():
fx = []
Sy = 0
x = a+delta
for i in range(n):
y = eval(fun); fx.append(y)
Sy += y
x += h
appr = h*Sy
return appr, fx
#-------------------------------------------------------- Binding
def bind_funzioni(evt):
global fun, a, b, e
x = evt.text
fun_info = ANNO[x]
fun = fun_info[0]
a = fun_info[1]
b = fun_info[2]
e = fun_info[3]
wtext_esatto.text = " ({:.6f})".format(e)
elabora()
def bind_n(evt):
global n
n = evt.value
wtext_n.text = n
elabora()
def bind_altezze(evt):
global caso
caso = evt.text
elabora()
def elabora():
global g, h, h2, delta
g.delete()
h = (b-a)/n
h2 = h/2
if (caso == "Sinistra"): delta = 0
elif(caso == "Centro" ): delta = h2
elif(caso == "Destra" ): delta = h
else : print("ERRORE: caso")
g = graph(fast = False, xtitle = "x", ytitle = "f(x)", xmin = a-0.1, xmax = b+0.1)
APPR, Y_APPR = approssima()
wtext_appr.text = "{:.6f}".format(APPR)
X = arange(a, b, h)
DATA_APPR = []
for i in range(n):
DATA_APPR.append((X[i]+h2, Y_APPR[i]))
g_rettangoli = gvbars(color = color.magenta, delta = h, data=DATA_APPR)
X = linspace(a, b, num=100)
DATA_FUN = []
for x in X:
DATA_FUN.append((x, eval(fun)))
g_funzione = gcurve(color = color.blue, data = DATA_FUN)
#-------------------------------------------------------------------------- INTERFACCIA
N_MIN = 1
N_MAX = 10
c=canvas()
c.append_to_caption("INTEGRAZIONE NUMERICA: metodo dei rettangoli")
c.append_to_caption("\n\nAnno\n\t")
radio(bind = bind_funzioni, name = "funzioni", text = "2001", checked = True)
c.append_to_caption(" ")
radio(bind = bind_funzioni, name = "funzioni", text = "2003")
c.append_to_caption(" ")
radio(bind = bind_funzioni, name = "funzioni", text = "2008")
c.append_to_caption("\nAltezze\n\t")
radio(bind = bind_altezze, name = "altezze", text = "Sinistra", checked = True)
c.append_to_caption(" ")
radio(bind = bind_altezze, name = "altezze", text = "Centro")
c.append_to_caption(" ")
radio(bind = bind_altezze, name = "altezze", text = "Destra")
c.append_to_caption("\nNumero rettangoli\n\t")
slider_n = slider(bind = bind_n, left = 0, step = 1, min = N_MIN, max = N_MAX, value = n)
c.append_to_caption(" ")
wtext_n = wtext(text = n)
c.append_to_caption("\nApprossimazione\n\t")
wtext_appr = wtext(text = 0)
wtext_esatto = wtext(text = " ({:.6f})".format(e))
c.append_to_caption("\n\n")
c.delete()
g = graph()
elabora()