pgfplots: singoli punti da vari files

  • Creatore
    Topic
  • #79953
    Up
    0
    Down
    ::


    Ciao a tutti. Spiegherò la mia situazione in dettaglio perché è piuttosto difficile da comprendere.

    Sto lavorando a delle simulazioni numeriche di una palla soggetta a forza di gravità, portanza aerodinamica e forza d’attrito provocata dall’aria. Durante questa simulazione numerica salvo in un file il tempo, la posizione della palla (3 coordinate), la velocità della palla (3 coordinate) e l’errore sull’energia meccanica dovuto all’algoritmo. La simulazione è effettuata su 50 secondi, con differenti passi di tempo (1s, 0.1s, 0.01s, 0.001s); ogni passo di tempo scelto corrisponde a un differente file di simulazione.

    Quello che mi serve è dimostrare che, a un tempo t fisso (prenderò il tempo finale a 50s) la soluzione numerica converge verso la soluzione analitica in modo lineare se diminuisco il passo di tempo. Per fare ciò ho bisogno di disegnare graficamente la differenza abs(r(50)-r(analitica)) (dove r è il modulo della posizione) e abs(v(50)-v(analitica)) (dove v è il modulo della velocità) in funzione del passo di tempo.

    Per calcolare il modulo devo utilizzare evidentemente l’opzione expr di pgfplots. Per esempio: y expr={sqrt(\thisrowno{1}^2+\thisrowno{2}^2+…}. Il problema è che il passo di tempo utilizzato non è salvato nel file. Quindi devo inserirlo manualmente per la coordinata x. Mentre le componenti dei vettori posizione e velocità sono salvate in un file e il file è differente per ogni passo di tempo. Dunque per ogni punto del mio grafico la coordinata x la inserisco manualmente, l’altra la devo calcolare a partire da un file ogni volta differente (quindi è come mischiare i campi coordinate e table di pgfplots). Infine mi serve che ogni punto creato come descritto sopra faccia parte dello stesso grafico (stesso stile, collegati da una linea, …).

    È possibile fare ciò? Se si, come?

    Grazie mille,
    R.

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #79954
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Hai quattro file corrispondenti a 4 passi di tempo in progressione geometrica che contengono la posizione nello spazio e le tre componenti della velocità nello spazio.

        Vuoi tracciare l’errore fra i moduli delle posizioni e delle velocità all’ultimo campione di ciascun file, visto che tutti e quattro i file si riferiscono ad un intervallo complessivo di 50s.
        Dunque vorresti fare un diagramma con quattro ascisse in progressione geometrica che in ordinata abbiano l’errore finale (sicuro la differenza fra i moduli e non il modulo delle differenze?). Secondo te questo diagramma dovrebbe rappresentare un diagramma lineare in cui l’errore diminuisce linearmente con il passo scelto in progressione geometrica.

        Mah; non metto lingua nell’approccio concettuale che evidentemente non ho capito, perché per quel che ho capito (ed evidentemente non l’ho capito) esso è errato.

        Ma veniamo al punto che chiedi; invece di spremere le meningi a trovare un accrocchio che ti permetta di scrivere del codice complicatissimo epe fare una cosa che a mano si fa in pochi secondi, io ti suggerirei di fare a mano.

        Prepari un quinto file dove nella prima colonna metti il passo di tempo e nelle colonne 2-4 le tre coordinate della posizione simulata e nelle colonne 5-7 le tre coordinate della posizione calcolata analiticamente; nelle colonne 8-10 e 11-13 fai lo stesso per le tre componenti di velocità simulate e calcolate; Il file contiene solo quattro righe e i valori da mettere nelle colonne sono trasferiti per copia e incolla dai file che hai già. Poi con questo quinto file disegni quello che credo di aver capito che tu voglia disegnare.

        Che l’errore diminuisca al diminuire del passo è un fatto noto; che diminuisca linearmente con il passo non credo che si possa vedere da un diagramma lineare errore vs passo; forse con entrambe le scale logaritmiche, ma non certo con le scale lineari specialmente se il passo è in progressione geometrica. Stai attento all’errore algoritmico che potrebbe consegnarti funzioni di errore per passi piccoli costituite da rumore “deterministico”.

        Naturalmente se non o capito il tuo problema, è evidente che ho fatto commenti e ho dato suggerimenti che non stanno in piedi. 😐 😯 🙄

      • #79955
        Liverpool
        Partecipante
          Up
          0
          Down
          ::


          Probabilmente ha ragione @OldClaudio, che si fa prima a mano. In una stessa colonna (corrispondente ad un istante di tempo) hai, al variare della riga, la posizione, a seguire la velocità e l’errore sull’energia (cioè 7 righe)? Ho capito bene?

        • #79956
          Up
          0
          Down
          ::


          Non metto becco per quanto riguarda il metodo; invece per quanto riguarda l’aspetto TeXnico della faccenda ho trovato un post che potrebbe esserti utile: link.

          Ciao
          Claudio

        • #79957
          Up
          0
          Down
          ::

          OldClaudio” post=79168Hai quattro file corrispondenti a 4 passi di tempo in progressione geometrica che contengono la posizione nello spazio e le tre componenti della velocità nello spazio.

          Vuoi tracciare l’errore fra i moduli delle posizioni e delle velocità all’ultimo campione di ciascun file, visto che tutti e quattro i file si riferiscono ad un intervallo complessivo di 50s.
          Dunque vorresti fare un diagramma con quattro ascisse in progressione geometrica che in ordinata abbiano l’errore finale (sicuro la differenza fra i moduli e non il modulo delle differenze?). Secondo te questo diagramma dovrebbe rappresentare un diagramma lineare in cui l’errore diminuisce linearmente con il passo scelto in progressione geometrica.

          Mah; non metto lingua nell’approccio concettuale che evidentemente non ho capito, perché per quel che ho capito (ed evidentemente non l’ho capito) esso è errato.

          Ma veniamo al punto che chiedi; invece di spremere le meningi a trovare un accrocchio che ti permetta di scrivere del codice complicatissimo epe fare una cosa che a mano si fa in pochi secondi, io ti suggerirei di fare a mano.

          Prepari un quinto file dove nella prima colonna metti il passo di tempo e nelle colonne 2-4 le tre coordinate della posizione simulata e nelle colonne 5-7 le tre coordinate della posizione calcolata analiticamente; nelle colonne 8-10 e 11-13 fai lo stesso per le tre componenti di velocità simulate e calcolate; Il file contiene solo quattro righe e i valori da mettere nelle colonne sono trasferiti per copia e incolla dai file che hai già. Poi con questo quinto file disegni quello che credo di aver capito che tu voglia disegnare.

          Che l’errore diminuisca al diminuire del passo è un fatto noto; che diminuisca linearmente con il passo non credo che si possa vedere da un diagramma lineare errore vs passo; forse con entrambe le scale logaritmiche, ma non certo con le scale lineari specialmente se il passo è in progressione geometrica. Stai attento all’errore algoritmico che potrebbe consegnarti funzioni di errore per passi piccoli costituite da rumore “deterministico”.

          Naturalmente se non o capito il tuo problema, è evidente che ho fatto commenti e ho dato suggerimenti che non stanno in piedi. 😐 😯 🙄

          Hai ragione che sono forse andato a finire all’ufficio “complicazione affari semplici” e che fare a mano è più veloce. Farò così.

          Per quanto riguarda l’approccio concettuale mi sembra giusto. Se ho che per la soluzione analitica il raggio a 50s è r(50s), per una soluzione numerica con un passo di tempo di 1s il raggio a 50s è r_1(50s) e se per una soluzione numerica con un passo di tempo di 0.1s è r_0.1(50s) un grafico che riporta i seguenti valori

          PassoDiTempo Errore
          0s r(50s)-r(50s)
          0.1s r_0.1(50s)-r(50s)
          1s r_1(50s)-r(50s)

          è una retta (per via dell’errore di troncatura). Penso di essermi spiegato male precedentemente.

        • #79958
          Liverpool
          Partecipante
            Up
            0
            Down
            ::


            Per l’ascissa puoi usare [tt]x expr=10^(\coordindex-3)[/tt] se il periodo di campionamento aumenta per riga oppure [tt]x expr=10^(-\coordindex)[/tt] se diminuisce per riga.
            Attenzione che i vari [tt]\thisrowno{n}[/tt] vanno tra parentesi tonde, se vuoi che funzioni anche con numeri negativi. Es:
            `y expr=sqrt((\thisrowno{1})^2+(\thisrowno{2})^2+(\thisrowno{3}^2))`
            Ho provato a creare una nuova tabella unendo le righe o le colonne di file differenti in maniera automatica. Se il tempo varia per colonna, come avevo pensato all’inizio, non ci sono problemi. Se invece il tempo varia per riga, ho i soliti problemi di espansione all’interno del ciclo (per determinare l’ordinale dell’ultima riga della tabella) e non sono riuscito a risolverli. Tra l’altro bisogna trasporre due volte la tabella perché [tt]pgfplotstable[/tt] lavora per colonna (oppure usare [tt]datatool[/tt]).

            Ciao

        Visualizzazione 4 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top