Integrazione numerica: metodo dei rettangoli

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()

Lascia un commento