Metodo dei trapezi per punti non equispaziati

Messaggioda feddy » 12/01/2017, 19:04

Ciao a tutti,

come da titolo, volevo implementare in MatLab il metodo dei trapezi per un insieme di punti non equispaziati.

Per la regola dei trapezi, $ int_(a)^(b) f(x) dx = sum_(i = 1) ^(m) int_(x_i)^(x_(i+1)) f(x) dx ~~ sum_(i = 1) ^(m) ((x_(i+1)-x_i)/2)*(f(x_i)+f(x_i+1)) $

L'ho implementato con la seguente function:

Codice:
function I=trapeziNonEq(x,y)
%INPUT
%x->vettore contenente i punti xi
%y->vettore delle f(xi)
%OUTPUT
%valore dell'integrale tra a=x(1) e b=x(end)

m=length(x);
I=0;

for i=1:1:m-1
    I=I+((x(i+1)-x(i))/2)*(y(i)+y(i+1))
end



Ora, per testarlo, ho provato tale routine sull'insieme di dati

$x=[0,2,5,6,7,8,10]$ e $y=[0,4,5,8,8.5,9,12]$.
Il risultato che trovo è che l'integrale vale $61.5.$

Provando a interpolare questo insieme di punti col comando polyfit, e trovando il polinomio interpolante, mi risulta che il valore esatto calcolato da MatLab è $70.6$.

Cambiando i valori trovo risultati che si differiscono di molto.

Eppure, testando su un insieme di punti non equispaziati ma tali che il polinomio interpolante sia una retta (esempio:$x=[0,2,5,6,7,8,10]$ e $y=[0,2,5,6,7,8,10]$) trovo il risultato esatto.

La domanda che mi sorge è: il metodo dei trapezi per punti non equispaziati è corretto (dal punto di vista del coedice) ma alquanto impreciso proprio per come è fatto, oppure ho sbagliato nell'implementarlo?
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 739 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Metodo dei trapezi per punti non equispaziati

Messaggioda Raptorista » 13/01/2017, 13:13

Prova a confrontare con un risultato calcolato a mano: per esempio per i punti \([(0,1),(1,2),(1.5,2)]\) il risultato dovrebbe essere, se non ho contato male i quadretti, \(I = 2.5\). Ti viene?
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 4121 di 9616
Iscritto il: 28/09/2008, 19:58

Re: Metodo dei trapezi per punti non equispaziati

Messaggioda feddy » 13/01/2017, 17:26

Sì, viene corretto.
Penso che il mio risultato non combacia perché il comando polyfit con cui vado a costruire il polinomio interpolante può generare un polinomio interpolante che non rispecchia l'esatto andamento della funzione. Dovrebbe essere quello il motivo. Anche perché la formula da implementare è molto semplice.
Che dici, puo' essere?
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 741 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: Metodo dei trapezi per punti non equispaziati

Messaggioda Raptorista » 13/01/2017, 17:36

Anche secondo me il problema sta nel fatto che polyfit fa "qualcosa", ma non sai bene che cosa.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 4122 di 9616
Iscritto il: 28/09/2008, 19:58

Re: Metodo dei trapezi per punti non equispaziati

Messaggioda feddy » 16/01/2017, 16:21

Credo di aver trovato il problema. Ho notato che polyfit è particolarmente instabile per punti non equispaziati.

Il comando polyfit1 restiuisce i coefficienti del polinomio interpolante un insieme di punti.

Ho testato su più funzioni il seguente schema:

-Definisco una funzione (per esempio $sin(x)*cos(x)$).

-Su un insieme di punti (volontariamente non equispaziati), trovo le immagini:
e.g $xi=[0,1,3,7,10], yi=[f(0),f(1),f(3),f(7),f(10)]$.

-tramite polyfit trovo i coefficienti e costruisco con un ciclo opportuno il polinomio interpolante $q(x)$

-plotto i seguenti due grafici.
1.Quello ottenuto dalla funzione che ho definito in partenza sull'intervallo $[0,10]$ col comando plot(t,f(t),'b')
2.Quello ottenuto dalla valutazione del polinomio interpolante sullo stesso intervallo: plot(t,q(t),'r')

Noto che il polinomio interpolante passa sì per i nodi, ma evidentemente in modo differente da quello corretto.
E' questo il motivo dell'errore nel calcolo dell'area sottesa.

Immagine



Immagine

Note

  1. https://it.mathworks.com/help/matlab/ref/polyfit.html. Documentazione del comando. Ho notato che negli esempi vengono infatti sempre presi punti "equally spaced". Non c'è scritto però se questa scelta sia la migliore o meno


Ultimo bump di feddy effettuato il 16/01/2017, 16:21.
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 757 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA


Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite