####################################################### # # # filename: integrazione_numerica.mpl6 # # scopo: alcuni metodi di integrazione numerica # # # # 1. Metodo della secante # # 2. Metodo della tangente # # 3. Metodo di Simpson # # 4. Metodo dei 3/8 di Newton # # 5. Metodo di Bode # # # ####################################################### ####################################################### # Metodo della secante # # Ultima modifica: Claudio Marsan, 21 maggio 2002 # # Testato con: Maple V Release 6.02 su Windows 2000 # # Uso: # # int_secante(x^3 + 2*x^2 + x + 12, 0..2, 10); # ####################################################### int_secante := proc(f::algebraic, # la funzione da integrare i::range, # l'intervallo di integrazione n::posint) # il numero di sottointervalli local incognite, # serve per stabilire le incognite di f F, # la funzione da integrare a, # estremo sinistro dell'intervallo di integrazione b, # estremo destro dell'intervallo di integrazione delta; # l'ampiezza di un sottointervallo incognite := op(select(type, indets(f), name)); F := unapply(f, incognite); a := evalf(lhs(i)); b := evalf(rhs(i)); delta := evalf((b - a)/n); return(0.5*delta*(F(a) + 2*sum(F(a + 'k'*delta), 'k'=1..n-1) + F(b))); end proc; ####################################################### # Metodo della tangente # # Ultima modifica: Claudio Marsan, 21 maggio 2002 # # Testato con: Maple V Release 6.02 su Windows 2000 # # Uso: # # int_tangente(x^3 + 2*x^2 + x + 12, 0..2, 10); # ####################################################### int_tangente := proc(f::algebraic, # la funzione da integrare i::range, # l'intervallo di integrazione n::posint) # il numero di sottointervalli local incognite, # serve per stabilire le incognite di f F, # la funzione da integrare a, # estremo sinistro dell'intervallo di integrazione b, # estremo destro dell'intervallo di integrazione delta; # l'ampiezza di un sottointervallo incognite := op(select(type, indets(f), name)); F := unapply(f, incognite); a := evalf(lhs(i)); b := evalf(rhs(i)); delta := evalf((b - a)/n); return (delta*sum(F(a + ('k' - 0.5)*delta), 'k'=1..n)); end proc; ###################################################### # Metodo di Simpson # # Ultima modifica: Claudio Marsan, 21 maggio 2002 # # Testato con: Maple V Release 6.02 su Windows 2000 # # Uso: # # int_Simpson(x^3 + 2*x^2 + x + 12, 0..2, 10); # ###################################################### int_Simpson := proc(f::algebraic, # la funzione da integrare i::range, # l'intervallo di integrazione n::posint) # il numero di sottointervalli local incognite, # serve per stabilire le incognite di f F, # la funzione da integrare a, # estremo sinistro dell'intervallo di integrazione b, # estremo destro dell'intervallo di integrazione delta; # l'ampiezza di un sottointervallo incognite := op(select(type, indets(f), name)); F := unapply(f, incognite); a := evalf(lhs(i)); b := evalf(rhs(i)); delta := evalf((b - a)/n); return(delta/6.0 * (F(a) + 2*sum(F(a + 'k'*delta), 'k'=1..n-1) + F(b) + 4*sum(F(a + ('k' - 0.5)*delta), 'k'=1..n))); end proc; ###################################################### # Metodo dei 3/8 di Newton # # Ultima modifica: Claudio Marsan, 21 maggio 2002 # # Testato con: Maple V Release 6.02 su Windows 2000 # # Uso: # # int_Newton(x^3 + 2*x^2 + x + 12, 0..2, 10); # ###################################################### int_Newton := proc(f::algebraic, # la funzione da integrare i::range, # l'intervallo di integrazione n::posint) # il numero di sottointervalli local incognite, # serve per stabilire le incognite di f F, # la funzione da integrare a, # estremo sinistro dell'intervallo di integrazione b, # estremo destro dell'intervallo di integrazione delta; # l'ampiezza di un sottointervallo incognite := op(select(type, indets(f), name)); F := unapply(f, incognite); a := evalf(lhs(i)); b := evalf(rhs(i)); delta := evalf((b - a)/n); return(delta/8.0 * (F(a) + 2*sum(F(a + 'k'*delta), 'k'=1..n-1) + F(b) + 3*sum(F(a + ('k' - 2/3)*delta) + F(a + ('k' - 1/3)*delta), 'k'=1..n))); end proc; ###################################################### # Metodo di Bode # # Ultima modifica: Claudio Marsan, 22 maggio 2002 # # Testato con: Maple V Release 6.02 su Windows 2000 # # Uso: # # int_Bode(x^3 + 2*x^2 + x + 12, 0..2, 10); # ###################################################### int_Bode := proc(f::algebraic, # la funzione da integrare i::range, # l'intervallo di integrazione n::posint) # il numero di sottointervalli local incognite, # serve per stabilire le incognite di f F, # la funzione da integrare a, # estremo sinistro dell'intervallo di integrazione b, # estremo destro dell'intervallo di integrazione delta; # l'ampiezza di un sottointervallo incognite := op(select(type, indets(f), name)); F := unapply(f, incognite); a := evalf(lhs(i)); b := evalf(rhs(i)); delta := evalf((b - a)/n); return(delta/90.0 * (7*F(a) + 14*sum(F(a + 'k'*delta), 'k'=1..n-1) + 7*F(b) + 32*sum(F(a + ('k' - 0.75)*delta) + F(a + ('k' - 0.25)*delta), 'k'=1..n) + 12*sum(F(a + ('k' - 0.5)*delta), 'k'=1..n))); end proc;