[Mat Numerica] [RISOLTO] Risoluzione esercizio con Matlab
Ciao a tutti,
ho da poco iniziato un corso di matematica numerica e mi è stato assegnato un esercizio, e vorrei dei chiarimenti da parte di qualcuno che ha conoscenze consolidate in materia.
Faccio una piccola premessa per inquadrarvi lo scenario.
In pratica l'esercizio è incentrato sulla diffusine dell'inquinamento nei bacini d'acqua, in particolare nei laghi stratificati (ovvero in estate i laghi in zone temperate possono, da un punto di vista termico, diventare stratificati. Questa stratificazione divide il lago in due parti: l’epilimnio e l’ipolimnio separati da un piano detto Termoclino). È interessante studiare l’inquinamento in tale ambienti in quanto il termocline diminuisce molto lo scambio tra i due ambienti.

L'obiettivo dell'esercizio è conoscere la quota di profondità del Termoclino (lo stato intermedio).
Dalle basi teoriche sono giunto alla conclusione che per calcolare la posizione del termoclino occorre trovare il punto di flesso della curva temperatura-profondità, cioè è il punto in cui si annulla la derivata seconda della temperatura in funzione della profondità, che, poi, è anche il punto in cui è massima la derivata prima.
Ora parto dal principio così potete seguire:
Ho creato 2 vettori che contengono i valori di temperatura e profondità:
profondita= $ ( ( 20.6, 20.6, 20.6, 18.4, 12.7, 9.5, 8.9, 8.9 ) ) $;
temperatura=$ ( ( 0, 0.1, 2.7, 6.9, 11.5, 16.1, 20.7, 25.0 ) ) $;
Poi con il comando:
pp=spline(profondita,temperatura)
ho creato una variabile strutturata da cui è possibile estrarre i coefficienti su ogni intervallino della spline cubica interpolante i punti (profondità,temperatura).
Poi con il comando:
[x,C,l,k,d] = unmkpp(pp)
nella matrice C ho memorizzato di ogni intervallino i 4 coefficienti che individuano il polinomio di 3° grado:

Per ottenere i coefficienti della derivata prima della spline ho calcolato la derivata prima del polinomio di 3° grado :
Cder=[3*C(:,1) 2*C(:,2) C(:,3)];
Cder è quindi la matrice che contiene i coefficienti della derivata della spline.
Poi con il comando:
ppder=mkpp(x,Cder);
ottengo una nuova funzione ppder che rappresenta la derivata della spline nei nodi x.
Il procedimento fino ad ora è corretto oppure ho commesso qualche errore?
Se è corretto, vado avanti... altrimenti faccio mente locale e ricontrollo i passaggi.
Grazie a tutti coloro che vorranno intervenire.
ho da poco iniziato un corso di matematica numerica e mi è stato assegnato un esercizio, e vorrei dei chiarimenti da parte di qualcuno che ha conoscenze consolidate in materia.
Faccio una piccola premessa per inquadrarvi lo scenario.
In pratica l'esercizio è incentrato sulla diffusine dell'inquinamento nei bacini d'acqua, in particolare nei laghi stratificati (ovvero in estate i laghi in zone temperate possono, da un punto di vista termico, diventare stratificati. Questa stratificazione divide il lago in due parti: l’epilimnio e l’ipolimnio separati da un piano detto Termoclino). È interessante studiare l’inquinamento in tale ambienti in quanto il termocline diminuisce molto lo scambio tra i due ambienti.

L'obiettivo dell'esercizio è conoscere la quota di profondità del Termoclino (lo stato intermedio).
Dalle basi teoriche sono giunto alla conclusione che per calcolare la posizione del termoclino occorre trovare il punto di flesso della curva temperatura-profondità, cioè è il punto in cui si annulla la derivata seconda della temperatura in funzione della profondità, che, poi, è anche il punto in cui è massima la derivata prima.
Ora parto dal principio così potete seguire:
Ho creato 2 vettori che contengono i valori di temperatura e profondità:
profondita= $ ( ( 20.6, 20.6, 20.6, 18.4, 12.7, 9.5, 8.9, 8.9 ) ) $;
temperatura=$ ( ( 0, 0.1, 2.7, 6.9, 11.5, 16.1, 20.7, 25.0 ) ) $;
Poi con il comando:
pp=spline(profondita,temperatura)
ho creato una variabile strutturata da cui è possibile estrarre i coefficienti su ogni intervallino della spline cubica interpolante i punti (profondità,temperatura).
Poi con il comando:
[x,C,l,k,d] = unmkpp(pp)
nella matrice C ho memorizzato di ogni intervallino i 4 coefficienti che individuano il polinomio di 3° grado:

Per ottenere i coefficienti della derivata prima della spline ho calcolato la derivata prima del polinomio di 3° grado :
Cder=[3*C(:,1) 2*C(:,2) C(:,3)];
Cder è quindi la matrice che contiene i coefficienti della derivata della spline.
Poi con il comando:
ppder=mkpp(x,Cder);
ottengo una nuova funzione ppder che rappresenta la derivata della spline nei nodi x.
Il procedimento fino ad ora è corretto oppure ho commesso qualche errore?
Se è corretto, vado avanti... altrimenti faccio mente locale e ricontrollo i passaggi.
Grazie a tutti coloro che vorranno intervenire.
Risposte
Non sbagli: il punto non deve cadere sulla retta, ma sulla spline cubica!
Sul ps: la \(x\) deve essere interna, sì. Se non lo è, significa che non è quello il polinomio che "contiene" lo zero, ma sarà quello subito dopo.
Sul ps: la \(x\) deve essere interna, sì. Se non lo è, significa che non è quello il polinomio che "contiene" lo zero, ma sarà quello subito dopo.
Scusami ho sbagliato, volevo dire che il punto non cade sulla funzione interpolante in alcun "tratto", ma addirittura è esterno alla spline...
Quindi la prima cosa da fare è verificare se la x di ogni polinomio è "interna al suo corrispettivo intervallo"; se il valore è esterno, il punto non è un flesso; se il valore ricade nel suo intervallo allora quella è la x di un punto di flesso.
Giusto?
Quindi la prima cosa da fare è verificare se la x di ogni polinomio è "interna al suo corrispettivo intervallo"; se il valore è esterno, il punto non è un flesso; se il valore ricade nel suo intervallo allora quella è la x di un punto di flesso.
Giusto?
Ok, ma stai andando a zonzo per niente.
Guarda il grafico che hai postato poco fa, quello con la spezzata: si vede ad occhio che lo zero è nel primo o nel secondo intervallo.
Guarda il grafico che hai postato poco fa, quello con la spezzata: si vede ad occhio che lo zero è nel primo o nel secondo intervallo.
Sono sincero... tutto ciò mi ha sfinito; questo problema del cavolo mi ha fatto perdere tempo, calma, pazienza... tutto!
La cosa che mi ha snervato più di tutte è stato il fare i procedimenti giusti e correttamente, am alla fine non trovarsi col risultato atteso...
Ti aggiorno con gli ultimi progressi che mi hanno portato alla soluzione (che avevo [quasi] raggiunto da due settimane);
i punti mi uscivano tutti esterni alla spline perchè:
[1] imponendo la derivata 2° = 0, calcolavo la x relativa al polinomio; questa x è la componente x ( ascisse) del flesso ma rispetto al polinomio stesso, ma corrisponde alla y (ordinata) rispetto alla spline!
[2] io verificavo i punti con il grafico (temperatura, [size=150]-[/size] profondità); la profondità negativa perchè lo 0 rappresentava la superficie dell'acqua e la startificazione si verifica, logicamente, sott'acqua!
Spero di essermi spiegato bene
:D
Questo è il risultato:

Raptorista, mi complimento con te innanzitutto per la tua competenza in materia e in secondo luogo (ma non meno importante) per la tua disponibilità che manifesti nell'aiutare coloro in difficoltà; è questo lo spirito collaborativo di chi partecipa a un forum; davvero esemplare, complimenti
La cosa che mi ha snervato più di tutte è stato il fare i procedimenti giusti e correttamente, am alla fine non trovarsi col risultato atteso...
Ti aggiorno con gli ultimi progressi che mi hanno portato alla soluzione (che avevo [quasi] raggiunto da due settimane);
i punti mi uscivano tutti esterni alla spline perchè:
[1] imponendo la derivata 2° = 0, calcolavo la x relativa al polinomio; questa x è la componente x ( ascisse) del flesso ma rispetto al polinomio stesso, ma corrisponde alla y (ordinata) rispetto alla spline!
[2] io verificavo i punti con il grafico (temperatura, [size=150]-[/size] profondità); la profondità negativa perchè lo 0 rappresentava la superficie dell'acqua e la startificazione si verifica, logicamente, sott'acqua!

Spero di essermi spiegato bene

Questo è il risultato:

Raptorista, mi complimento con te innanzitutto per la tua competenza in materia e in secondo luogo (ma non meno importante) per la tua disponibilità che manifesti nell'aiutare coloro in difficoltà; è questo lo spirito collaborativo di chi partecipa a un forum; davvero esemplare, complimenti

2012: Odissea nel forum XD
Finalmente sei arrivato alla soluzione, che comunque era ormai lì a portata di mano
Mi fa piacere leggere le ultime cose che scrivi: cominciavo anche io a sentire il peso di questo thread, ma per fortuna è risolto.
Finalmente sei arrivato alla soluzione, che comunque era ormai lì a portata di mano

Mi fa piacere leggere le ultime cose che scrivi: cominciavo anche io a sentire il peso di questo thread, ma per fortuna è risolto.
Ho aggiunto il tag [RISOLTO] nel titolo... io sono Molisano, se sei di queste parti o se ti trovi di passaggio contattami, ti offro volentieri una birra, magari mentre parliamo di spline cubiche

Ah già, non ho avuto modo di fartelo capire: io ODIO le spline! Muahahahahahaha!
Mi spiace, io abito in Lombardia; una birra l'avrei accettata molto volentieri comunque
Mi spiace, io abito in Lombardia; una birra l'avrei accettata molto volentieri comunque

Dai che alla fine non sono tanto brutte!!!!
Qualora dovessi calcolare anche la complessità computazoinale dell'algoritmo, come dovrei iniziare a "muovermi" ?
... prevenire è meglio che curare...



Qualora dovessi calcolare anche la complessità computazoinale dell'algoritmo, come dovrei iniziare a "muovermi" ?
... prevenire è meglio che curare...

Se non sbaglio, per il calcolo di una spline c'è la formula della complessità... In ogni caso, se prendi un buon libro [e.g. Quarteroni, Sacco, Saleri] e vai al capitolo sulle spline c'è tutta la derivazione con i calcoli da fare, da cui puoi contare somme e prodotti per tuo immenso diletto
