- Questo topic ha 8 risposte, 5 partecipanti ed è stato aggiornato l'ultima volta 14 anni fa da
Giulia.
-
CreatoreTopic
-
22 Agosto 2012 alle 6:24 #77238::
Ciao a tutti,
sono nuova del forum e avrei bisogno di una mano perchè sto scrivendo la tesi in latex e ho dei problemi per quanto riguarda i grafici.
Il problema è questo: sto cercando di plottare la funzione y=1-e^(-x) usando questo codice\begin{tikzpicture}
\begin{axis}[ xmin=0, xmax=10, ymin=0, ymax=1.5, xlabel=$N$,ylabel=$\dot{N}$, width=7cm,height=7cm]
\addplot [samples=200, thick, color=magenta]
{1-e^(-x)};
\end{axis}
\end{tikzpicture}ma il grafico che mi viene si interrompe al valore x=5, nel senso che latex mi plotta la funzione solo da x=0 (e questo ok perchè l’ho chiesto io) fino a x=5 lasciando poi tutto bianco. Qual’è il problema? Qualcuno può aiutarmi?
-
CreatoreTopic
-
AutoreRisposte
-
-
22 Agosto 2012 alle 6:49 #77239::
Ciao,
la funzione esponenziale nel manuale viene indicata con [tt]exp()[/tt], quindi scrivendo`\begin{tikzpicture}
\begin{axis}[ xmin=0, xmax=10, ymin=0, ymax=1.5, xlabel=$N$,ylabel=$\dot{N}$, width=7cm,height=7cm]
\addplot [samples=200, thick, color=magenta]
{1-exp(-x)};
\end{axis}
\end{tikzpicture}`
dovrebbe funzionare (anche se non ho provato).Ciao
Fra
-
22 Agosto 2012 alle 7:18 #77240
-
22 Agosto 2012 alle 8:19 #77241::
Ciao e benvenuta sul forum.
Secondo me ci sono problemi di precisione. La funzione infatti ha un asintoto orizzontale per y=1 e la precisione richiesta per il tracciamento forse supera le capacità di calcolo della libreria matematica di pgf.
Sembra infatti che la curva si arresti al valore di x=5 quando la funzione raggiunge il valore di circa 0.9933.
`\documentclass{standalone}\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0,
xmax=10,
ymin=0,
ymax=1.5,
xlabel=$N$,ylabel=$\dot{N}$,
width=7cm,height=7cm]
\addplot [samples=200, thick, color=magenta]
{1-exp(-x)};
\draw (axis cs:5,0)–(axis cs:5,1.5);
\end{axis}
\end{tikzpicture}
\end{document}`
Infatti, se poni ymax=1 ricevi un errore di “! Dimension too large.\pgf@yy “. TeX non è stato progettato per il calcolo numerico. Occorre in questi casi trovare un’altra strada.
Per esempio installare gnuplot ed utilizzarlo indirettamente per fare i calcoli, come specifica del comando \addplot.
Se però lavori in windows, gnuplot potrebbe essere un po’ ostico da installare.Potresti allora plottare non direttamente la funzione matematica, ma la sequenza numerica di punti già preparata in un file a parte nel formato x
y e caricarli in addplot.. R.
-
22 Agosto 2012 alle 9:21 #77242::
Ciao,
ci sarebbe una soluzione tutta interna al mondo TeX, utlilizzando LuaLaTeX. Ecco il codice:
`% !TEX program = lualatex\documentclass{standalone}
\usepackage{pgfplots}\def\plotfx{%
\directlua{
local function f(x)
return 1-math.exp(-x)
endtex.print(“\string\\addplot [thick,color=magenta] coordinates {“)
local frmt = “(\%0.5f, \%0.5f)”
local step = 0.05for x=0,10,step do
local s = string.format(frmt, x,f(x))
tex.print(s)
endtex.print(“};”)
}}\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0,
xmax=10,
ymin=0,
ymax=1.5,
xlabel=$N$,ylabel=$\dot{N}$,
width=7cm,height=7cm]\plotfx
\end{axis}
\end{tikzpicture}
\end{document}`Invece di eseguire i calcoli con la libreria matematica di pgf, chiamata in causa perché passi al comando \addplot una funzione come espressione analitica, si utilizza la libreria matematica di Lua per inserire nell’ambinete axis un comando \addplot per coordinate.
Non occorre in questo caso fornire l’opzione sample, perché i punti sono decisi dal valore assegnato alla variabile step.
Mentre per compilare il sorgente occorre utilizzare LuaLaTeX.
Probabilmente il meccanismo ti risulta poco chiaro, perché non conosci a fondo cosa è LuaTeX e cosa è LuaLaTeX, allo stesso modo di cosa
è TeX e cosa è LaTeX. Concentrati però solo sul codice Lua che viene chiamato all’interno della nuova macro \plotfx: con la funzione tex.print() non faccio altro che inserire istruzioni per pgfplots, come se le digitassi a mano.
Prima quindi, inserisco il comando \addplot con la direttiva coordinates,
poi “stampo” la sequenza di coordinate con un ciclo for
ed infine chiudo il comando \addplot con la necessaria parentesi e punto e virgola.Concettualmente non c’è differenza nello scrivere un file di testo con le coordinate e richiamarlo poi in un comando addplot con la direttiva file, solo che il sorgente rimane uno solo ed è un po’ più comodo.
Ecco l’immagine del grafico:
[attachment=401]plotfx.png[/attachment]Naturalmente rimane a tua scelta il motore matematico reale da usare per produrre i grafici che ti interessano, e che dipende da quanta capacità numerica è necessaria, ma sono d’accordissimo nell’usare pgfplots 😉
R.
Attachments:
You must be logged in to view attached files. -
22 Agosto 2012 alle 10:58 #77243::
@Palagi, la funzione che vuoi disegnare viene benissomo con il codice che ti ha dato @robitex; tra l’altro ti ha dato un codice autosufficiente che puoi compilare con LuaLaTeX (dando il comando dalla finestra comandi, oppure scegliendo l’apposito bottone nel tuo shell editor); ma il risultato è semplicemante un file pdf senza margini che puoi includere come una immagine all’interno di un ambiente figure, dando tu l’apposita didascalia e il label.Per altro la funzione che vuoi disegnare è fra le altre cose la risposta al gradino di un sistema del primo ordine; naturalmente co sono mille altri modi di interpretare quel disegno. Ma una delle cose che si imparano quando si studiano i transitori è che gli esponenziali si considerano esauriti quando sono trascorse 5 “costanti di tempo” dall’inizio; quindi a parte gli argomenti corretti di @robitex per spiegare perché la libreria matematica di pgfplots non ce la faccia ad andare oltre il valore 5, la tua funzione ha una “costante di tempo” unitaria, quindi quando la variabile vale 5 sono trascorse 5 “costanti di tempo” e l’esponenziale è da considerare nullo cosicché la tua funziona assume il valore unitario. Non ho guardato come la libreria di pgfplots calcoli l’esponenziale, ma presumo che usi sviluppi in serie un po’ particolari, cosicché se anche il problema dell’underflow o dell’overflow non fosse la causa vera del tuo problema, la libreria stessa dovrebbe difendersi da queste possibilità e non andrebbe oltre nei calcoli.
Perché Lua ce la fa? perché non lavora con i numeri interi ma con i numeri in notazione scientifica (floating point) e anche se non si possono escludere underflow o overflow, il rischio di bloccare i calcoli è infinitamente minore. Se hai anche un piccola infarinatura di informatica di base e di calcolo numerico, dovresti conoscere i problemi a cui ho accennato.
-
22 Agosto 2012 alle 23:28 #77244::
Sono fuori sede, perciò non posso partecipare attivamente alla conversazione. Le chiavi [tt]x/ymin[/tt] e [tt]x/ymax[/tt] non stabiliscono il dominio della funzione, ma solamente gli estremi della tela del grafico. Quando il dominio non è esplicitato, come nel tuo caso, pgfplots lo assume automaticamente compreso tra -5 e 5, come indicato a pag. 11 di questa recente guida. Siccome tu hai scelto di visualizzare il grafico tra 0 e 10 in ascissa, vedi una linea che si arresta in x=5.
Per assegnare un dominio ad una funzione, devi utilizzare la chiave [tt]domain[/tt] tra le opzioni di [tt]addplot[/tt] (o di [tt]axis[/tt] se vuoi assegnare lo stesso dominio a tutte le funzioni che tracci sulla stessa tela).
Nel tuo caso, sostituisci la riga corrispondente con
`\addplot [domain=0:10, samples=200, thick, color=magenta] {1-e^(-x)};`
Ciao
-
23 Agosto 2012 alle 4:52 #77245
-
23 Agosto 2012 alle 5:55 #77246
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.