[LaTeX] Grafico di funzione con tikzpicture

Paolo902
Il codice

\begin{tikzpicture}
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle]
\addplot [smooth, samples=50, blue] {-abs(x)+1};
\addplot [smooth, samples=50, thick, blue] {-abs(x-4)+1};
\addplot [smooth, samples=50, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}


produce



Il problema è ovviamente nelle "gobbette": le funzioni sono valori assoluti :lol: ... Qualcuno ha qualche idea, per cortesia, per come ovviare a questo stupido e spiacevole incoveniente? Le ho già provate un po' tutte, ma non riesco a togliere quella brutta "smussatura", temo sia un problema legato alla definizione di valore assoluto... Qualche idea, per favore?

Grazie.

Risposte
Paolo902
A praticamente un mese esatto, ce l'ho fatta: ho aggiornato la distribuzione LaTeX. Ora pare funzionare tutto, anche questi benedetti grafici (finalmente appuntiti a dovere!).

Ringrazio tutti per l'aiuto e per i preziosi consigli.

apatriarca
Sono passati diversi anni e forse il problema si trova in qualche bug o incompatibilità della versione che usi. Io ti direi di provare ad aggiornare la distribuzione LaTeX.

Paolo902
Nulla di più probabile... Latex l'ho installato appena comprato questo computer, era l'estate 2009. Per l'installazione, l'avevo scaricato da qui, ma poi non l'ho mai aggiornato. Che cosa mi consigli di fare?
Grazie ancora.

claudio862
! Package pgfkeys Error: I do not know the key '/pgfplots/compat' and I am goin
g to ignore it. Perhaps you misspelled it.
See the pgfkeys package documentation for explanation.
Type H for immediate help.

Potrebbe essere che il tuo pacchetto PGFPlots sia così vecchio da non supportare quel parametro (e magari nemmeno samples e samples at correttamente, avremmo capito il problema). Ma dovrebbe essere molto vecchio (da una breve ricerca sembra compat sia stato introdotto con la versione 1.3, intorno al 2009/2010). Come hai installato il pacchetto / la distribuzione Latex?

Paolo902
Con questo
\documentclass{article}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle
]
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, blue] {-abs(x)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x-4)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}

\end{document}

ottengo



Invece, ed era questo che cercavo malamente di dirti prima, con il codice

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=1.7}

\begin{document}

\begin{tikzpicture}
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle
]
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, blue] {-abs(x)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x-4)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}

\end{document}


non ottengo nulla. L'errore in fase di compilazione è:
! Package pgfkeys Error: I do not know the key '/pgfplots/compat' and I am goin
g to ignore it. Perhaps you misspelled it.
See the pgfkeys package documentation for explanation.
Type H for immediate help.


Possibile che ci sia un errore nel mio pacchetto? Che cosa devo fare? Grazie mille.

claudio862
L'opzione compat non dovrebbe essere causa di niente, se non ricordo male è dovuto al fatto che tra diverse versioni del pacchetto cambiano le regole per la spaziatura tra gli assi e il grafico. È meglio impostarlo esplicitamente, così se in una versione successiva cambiano ancora, i grafici rimangono gli stessi. Si usa così:

\usepackage{pgfplots}
\pgfplotsset{compat=1.7}


Prova a compilare questo in un file nuovo, per vedere se almeno così funziona:

\documentclass{article}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle
]
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, blue] {-abs(x)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x-4)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}

\end{document}

Paolo902
Niente da fare, per un attimo ho sperato che tutto si sistemasse cancellando i file della compilazione, ma nulla... Per quanto riguarda PGFPlots non saprei proprio che fare. Noto però che ho dei problemi con questo pacchetto: stando al manuale, uno dovrebbe poter usare l'opzione - quando si carica il pacchetto - compat, che dovrebbe riguardare la compatibilità tra vecchie e nuove versioni. Se però io lo metto nelle opzioni di \usepackage{pgfplots} il compilatore mi dice che non capisce. Sono davvero perplesso.

Di solito compilo e uso PdfLatex: ho pensato potesse dipendere anche da quello, così ho provato a compilare Latex ma nulla... Grazie ancora.

claudio862
Ma è assurdo! :shock: I punti campionati non sono quelli specificati.

A questo punto sono a corto di idee… Prova a cancellare tutti i file generati durante la compilazione (ma non dovrebbe dipendere da questo). Vedi anche se riesci a capire che versione di PGFPlots stai usando (non saprei come).

Paolo902
Niente, proprio non capisco:

\begin{tikzpicture}[]
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle]
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, blue] {-abs(x)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x-4)+1};
\addplot+[samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}






Mettendo addplot+ con l'opzione smooth mi viene lo stesso grafico, con l'unica differenza dell'archetto in alto... Grazie ancora.

claudio862
Qualcosa non torna… Prova a stampare anche i punti, non solo la linea interpolante (\addplot+ invece di \addplot).

Paolo902
"claudio86":
Strano, a me già con samples=100 da un grafico quasi corretto (bisogna zoomare un po' prima di notare qualcosa). Probabilmente però ti conviene togliere il parametro smooth, dato che vuoi disegnare una linea spezzata.


Non so davvero che cosa pensare. Scusa se continuo a rompere le scatole, ma con il codice che mi hai gentilmente indicato tu

\begin{tikzpicture}[]
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle]
\addplot [samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, blue] {-abs(x)+1};
\addplot [samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x-4)+1};
\addplot [samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}


ottengo

che è esattamente quella che ottengo senza l'opzione smooth. A questo punto, dov'è il problema? :shock:
Grazie.

claudio862
Strano, a me già con samples=100 da un grafico quasi corretto (bisogna zoomare un po' prima di notare qualcosa). Probabilmente però ti conviene togliere il parametro smooth, dato che vuoi disegnare una linea spezzata.

\begin{tikzpicture}[]
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle]
\addplot [samples=500, blue] {-abs(x)+1};
\addplot [samples=500, thick, blue] {-abs(x-4)+1};
\addplot [samples=500, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}

Eventualmente puoi anche impostare esplicitamente i punti in cui campionare con samples at.

\begin{tikzpicture}[]
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle]
\addplot [samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, blue] {-abs(x)+1};
\addplot [samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x-4)+1};
\addplot [samples at={-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5}, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}

Paolo902
Ciao Sergio, no, purtroppo no. Anzi, ho provato ad aggiungere smooth sperando che sistemasse le cose, ma nulla. E' come se lui vedesse strettamente positivo il valore assoluto di 0... insomma, secondo lui \( |0| \simeq 0.25\). Grazie mille comunque per l'aiuto.

Paolo902
Grazie mille per il tuo aiuto. E' comunque molto possibile che sia io a fare casino, non ho grande dimestichezza con questo benedetto pacchetto tikz e già qualche giorno fa ho avuto problemi con un grafico. Ti allego il mio preambolo, se puoi dare uno sguardo mi fai un piacere.

 \documentclass[10pt,a4paper,twoside]{amsbook}
\usepackage[utf8x]{inputenc}
\usepackage{ucs}
\usepackage{setspace}
\usepackage[italian]{babel}
\usepackage{calc}
\usepackage{lmodern}
\usepackage{url}
\usepackage{graphicx, subfig, wrapfig}
\usepackage{xcolor}

\usepackage{tikz}
\usepackage{pgf}
\usepackage{pgfplots}

\usepackage{mathtools}
\usepackage{amssymb,amsmath,amsthm,amsfonts}
\usepackage{mathrsfs, dsfont, a4wide}
\usepackage[
 colorlinks=true, 
 urlcolor=blue, 
 citecolor=Violet,
 linkcolor=blue]{hyperref}
\usepackage{esint}

\parskip2ex
\onehalfspacing

\author{}
\title{}

\begin{document}
\maketitle
\tableofcontents
\newpage
[...]

E' ben noto [...]

\begin{tikzpicture}[]
\begin{axis}
[enlargelimits, xmin=-5,xmax=5,ymin=-1,ymax=1,
axis x line=middle,
axis y line=middle]
\addplot [smooth, samples=5000, blue] {-abs(x)+1};
\addplot [smooth, samples=500, thick, blue] {-abs(x-4)+1};
\addplot [smooth, samples=500, thick, blue] {-abs(x+4)+1};
\end{axis}
\end{tikzpicture}

\end{document}

claudio862
Mostra il documento intero. A me con 500 campioni viene ben appuntito.

Paolo902
Ti ringrazio molto per la tua risposta. Purtroppo però avevo già provato ad aumentare il numero di samples, ma nulla. C'è proprio un problema legato alla funzione abs: possibile che non si riesca a mettere a posto :lol: ? Uffi...

Grazie ancora.

claudio862
Aumenta il numero dei campioni, es. samples=500.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.