Tikz – schem per lo studio del segno di un polinomio (disequazioni di grado >=3)

  • Creatore
    Topic
  • #121841
    Up
    0
    Down
    ::


    Buongiorno a tutti, ho realizzato un codice Tikz che genera, in automatico lo schema per lo studio del segno di un polinomio (e frazione algebrica). Il cui risultato è visibile nell’imagine linkata (ho provato a caricarla sul forum ma non riesco)

    https://drive.google.com/file/d/1RtrLDg31cLv9Gr4e7zDwZbQP4nBDm9jx/view?usp=sharing

    Il codice che genera l’immagine è il seguente.

    `
    \begin{tikzpicture}[scale=.80]

    % variabili
    %
    \def\h{.9}; % altezza delle linee
    \def\dil{2.5}; % aggiusta la distanza fra le soluzioni per dilatazione
    %
    \def\zeri{{1, 3, 5, 8}}; % indicare i valori degli zeri secondo l'ordinamento naturale
    \def\fattori{{“x-1”, “x-3”, “x-5”, “x-8”, “f(x)”}};
    \def\segni{{{“-” ,”\nexists” ,”+” , ,”+” , ,”+” , ,”+”}, % “\nexists” per le soluzioni da escludere
    {“-” , ,”-” ,”0″ ,”+” , ,”+” , ,”+”},
    {“-” , ,”-” , ,”-” ,”\nexists” ,”+” , ,”+”},
    {“-” , ,”-” , ,”-” , ,”-” ,”0″ ,”+”},
    {“+” ,”\nexists” ,”-” ,”0″ ,”+” ,”\nexists” ,”-” ,”0″ ,”+”}
    }};
    %
    \pgfmathsetmacro\z{dim(\zeri)}; % calcola il numero di zeri
    \pgfmathsetmacro\n{2*dim(\zeri)}; % calcola il numero di fattori + 1
    \pgfmathsetmacro\nrighe{dim(\fattori)-1};

    % Asse e griglia orizzontale
    %
    \draw[->] (0-\dil-.15, 0) — (\z*\dil+.15, 0) node[above]{$x$};
    \draw (-\dil, {-\z*\h}) — (\z*\dil, {-\z*\h});

    % Barre verticali e zeri
    %
    \pgfmathsetmacro\nbar{\z-1};
    \foreach \i in {0,…,\nbar} {
    \draw[dotted, gray!80] (\i*\dil, {-(\nrighe+0.5)*\h}) — (\i*\dil, 0);
    \draw (\i*\dil, 0) — (\i*\dil, +0.125) node[above] {$\pgfmathparse{\zeri[\i]}\pgfmathresult$};
    }

    % Segni
    %
    \foreach \row in {0,…,\nrighe} {
    \node

    at (-\dil-.25, {-(\row+0.5)*\h}) {\footnotesize segno di\; $\pgfmathparse{\fattori[\row]}\pgfmathresult$};
    \foreach \col in {0,…,\n} {
    \node at ({(\col-1)*\dil/2}, {-(\row+0.5)*\h}) {$\pgfmathparse{\segni[\row][\col]}\pgfmathresult$};
    }
    }

    \end{tikzpicture}
    `

    Quello che vorrei ottenere è di aggiungere un contorno o un box di sfondo bianco dove ci sono gli zeri o i \nexists in modo che essi non si sovrappongano alla linea tratteggiata di sfondo. Naturalmente lo sfondo bianco va messo solo in questi casi.

    Inoltre, se avete altri consigli per migliorare il codice sono a disposizione

    [attachment:1]C:\fakepath\Disequazioni.png[/attachment]

Visualizzazione 9 filoni di risposte
  • Autore
    Risposte
    • #121842
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Ti potrebbe essere utile il pacchetto tabularray; ne leggi la documentazione con taxdoc tabularray.
        Come e cosa fare è troppo lungo da spiegare qui in una paginata del forum.

      • #121843
        Up
        0
        Down
        ::


        tabularray lo uso già per le tabelle. Però vorrei fare il grafico vero e proprio

      • #121844
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Per mettere in grafico le funzioni c’è il pacchetto TikZ con il suo “figliolo” pgfplots. Entrambi con documentazioni chilometriche, ma con ottimi servizi di Indexing, per cui usando intelligentemente l’indice analitico si arriva presto a padroneggiare i due pacchetti.
          Attento, sono molto ingombranti in memoria; ovviamente dipende da che cosa vuoi disegnare, ma può succedere che la memoria di lavoro si esaurisca.. Nella deprecata ipotesi che ciò si manifesti, bisogna configurare l’installazione del prorpio Sistema TeX (TeX Live o MiKTeX) in relazione al proprio sistema operativo (Mac, Windows, Linux) in modo da allargare la memoria di Lavoro.

          Altrimenti ci sarebbe un altro pacchetto, euclideangreometry.sty, con la sua documentazione euclideangeometry-man.pdf (da leggere usando texdoc da terminale) che impegna molta meno memoria, ma è molto più ruspante; nel manuale di euclideangeometry si sono diversi esempi di tracciamento di funzioni; nel tuo caso non dovrebbe essere piuttosto facile da usare.
          Invatti dall’equazone sotto forma di frazioni con numeratore e denominatore scomposti in fattori, hai le coordinate di zeri e asintoti verticali; calcolare la derivata di una funzione così semplice è una cosa da poco; puoi calcolarti le ascisse e le ordinate di massimi e minimi e i valori delle pendenze negli zeri. Dopo di che i comandi \Curve di euclideangeometry ti permettono di disegnare una curva come quella che ti interessa, con pochi statement e te la vavi con poche righe di codice.
          Ovviamente conoscere massimi e minimi, e magari i valori delle derivate negli zeri della funzione ti può essere utile anche se usi pgfplots.
          Se ben ricordo uno degli esempi di euclideangeometry-man riguarda uno dei temi di matematica agli esami di maturità di quest’ultima estate.

        • #121845
          Up
          0
          Down
          ::


          Perdonami, ma io ho usato chiaramente TikZ con pgfplots. E conosco la chilometrica documentazione.

          Quello che non riesco a trovare è come definire opportunamente array misti e come fare i controlli in base alla tipologia delle variabili.

          Se riuscissi a capire come scrivere la condizione che mi identifica gli elementi (volutamente) nulli nell’array potrei perfezionare il codice. Ma non li trovo

          I controlli che cerco sono del tipo
          Se array[j] not= nullo allora scrivi questo
          Se array[j] = 0 OR array[j] = “\nexists” allora scrivi questo

          o, più semplicemente un ciclo FOR che da solo esclude i valori nulli dell’array

          e non serve neanche l’else

          R.

        • #121846
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Capisco di non avere capito.
            Continuo a non capire.
            Dici che vuoi fare il grafico; ti dico come fare il grafico, ma dopo avertoelo detto mi dice che vuoi scrivere qualcosa nella matrice non sapendo se defi metter if … \else .. \fi oppure se puoi fare on un ciclo for..
            Ancora più oscuro, per me. Non credo di avere abbastanza fantasia per comprendere il tuo gergo ,matematico/informatico.
            Temo che uno schizzo disegnato alla buona su un pezzo di carta con la matrice e il diagramma, con qualcosa segnato in rosso che permetta di capire che cosa vorresti fare mi aiuterebbe. Tuttavia non volgio farti perdere tempo. Spero che qualcun altro capisca ciù che ti occorre e ti possa dare un suggerimento adeguato.
            Per me ho evidentemente finito qui.

          • #121847
            Up
            0
            Down
            ::


            Sto parlando del grafico dei segni che si usa per risolvere una disequazione.

            Il codice che ho copiato (e che ho creato) produce questo:
            https://drive.google.com/file/d/1RtrLDg31cLv9Gr4e7zDwZbQP4nBDm9jx/view?cf_lbyyhhwhyjj5l3rs65cb3w=ppte4rhs9nl6j6hwtw7fc

            Io vorrei solo perfezionarlo per evitare la sovrapposizione di 0 e \nexists sulle righe punteggiate verticali.

          • #121848
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::

              robertodivito” post=122394Sto parlando del grafico dei segni che si usa per risolvere una disequazione.

              Il codice che ho copiato (e che ho creato) produce questo:
              https://drive.google.com/file/d/1RtrLDg31cLv9Gr4e7zDwZbQP4nBDm9jx/view?cf_lbyyhhwhyjj5l3rs65cb3w=ppte4rhs9nl6j6hwtw7fc

              Io vorrei solo perfezionarlo per evitare la sovrapposizione di 0 e \nexists sulle righe punteggiate verticali.

              Ciao,
              ho preparato questo codice che immette il simbolo con uno sfondo bianco coprente, come da tua idea.
              `
              % !TeX program = LuaLaTeX
              \documentclass[tikz]{standalone}
              \usepackage{amssymb}

              \begin{document}
              \begin{tikzpicture}
              % linea tratteggiata verticale
              \draw[dashed] (0, -2cm) — (0, 2cm);

              % non copre
              \node at (0,-1) {$\nexists$};

              % copre
              \node[fill=white] at (0, 1) {$\nexists$};

              \end{tikzpicture}
              \end{document}
              `

              Funziona ma non è molto elegante. L’ideale sarebbe interrompere la linea tratteggiata così da far “ricalcolare” i trattini.
              Controllalo e fammi sapere.

              Ho risposto perché la cosa mi interessa, non tanto come insegnante di matematica alle superiori, ma come puro problema di programmazione.
              Purtroppo o per fortuna, vado sempre a battere lì, lì su LuaTeX.
              Questo motore integra come tutti sanno l’interprete Lua, ma le potenzialità di questo strumento sono ancora molto molto sotto utilizzate.
              Un enorme numero di problemi proprio per i Prof. troverebbero soluzioni brillanti.

              Abbiamo solo l’imbarazzo della scelta di come implementare il codice. Se ti interessa fammi un fischio, porebbe uscirne davvero un lavoro interessante da pubblicare magari su Ars (oltre che risolvere la composizione).

              Ah ultima cosa. Esistono in giro pacchetti già pronti per lo studio del segno. Gli avrai sicuramente dato un’occhiata ma scommetto che non ti sarà piaciuta la “grafica” e hai fatto per conto tuo.
              Alla prossima.
              R.

            • #121849
              Up
              0
              Down
              ::


              Ciao,

              grazie per aver risposto. Il problema che ho non riguarda la parte tikz (quindi il codice da te proposto per creare lo spazio bianco) quanto in realtà nei controlli. Non riesco a gestire i tipi di dati e a realizzare controlli funzionanti. Né riesco a trovare una fonte su questo argomento che sia completa e mi permetta di agire a mio piacimento

              Detto questo, cercando sui forum in inglese ho trovato diverse alternative. Quella che mi sembra più promettente è questa:

              https://tex.stackexchange.com/questions/598780/sign-table-with-bullets-and-circles

              Che però va assolutamente modificata da un punto di vista estetico (per farla assomigliare a quella creata da me).

              Ora sono un po’ impegnato a scuola, ma nel weekend ci metto un po’ mano. Pur conoscendo Tikz non coscevo Tikz-tab che è stato usato.

              Dopo alcuni tentativi ti aggiorno se vuoi per vedere cosa sono riuscito a fare.

              Grazie di nuovo,

              Roberto

              P.S. Per interropere la linea punteggiata in un certo punto (nota 1) ci vuole comunque un controllo che è proprio il mio problema

              (nota: oppure al contrario farla sempre interrotta e metterla solo dove non vanno gli zeri e i \nexists)

            • #121850
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::


                Ma mi sembra sempre più un problema per Lua…
                🙂
                R.

              • #121851
                Up
                0
                Down
                ::


                Allora, ho creato un esempio funzionante di codice. L’ho anche migliorato perché adesso permette di inserire il segno di oggetti di secondo grado (o superiore) direttamente.

                Il codice è il seguente.

                `
                \documentclass[11pt]{article}

                \usepackage{tikz, pgfplots, pgfmath, pgffor, amssymb}

                \begin{document}

                Sign table for the function
                \[
                f(x) = \frac{x(x^2-1)}{x+2}
                \]

                \bigskip

                \begin{tikzpicture}[scale=.80]

                % variables and sign array
                %
                \def\h{0.9}; % row height
                \def\w{2.5}; % column width
                %
                \def\zeros{{“-2”, “-1”, 0, 1}}; % zeros and point of not existence
                \def\factors{{“x+2”, “x”, “x^2-1”, “f(x)”}};
                \def\signs{{{“-” ,”\nexists” ,”+” , ,”+” , ,”+” , ,”+”},
                {“-” , ,”-” , ,”-” ,”0″ ,”+” , ,”+”},
                {“+” , ,”+” ,”0″ ,”-” , ,”-” ,”0″ ,”+”},
                {“+” ,”\nexists” ,”-” ,”0″ ,”+” ,”0″ ,”-” ,”0″ ,”+”},
                }};
                %
                \pgfmathsetmacro\nzeros{dim(\zeros)-1}; % number of zeros
                \pgfmathsetmacro\ncol{2*dim(\zeros)}; % Number of columns
                \pgfmathsetmacro\nrow{dim(\factors)-1}; % number of rows

                % Abscissa axis
                %
                \draw[->] (-\w, 0) — ({(\nzeros+1)*\w+0.125}, 0) node[above]{$x$};
                \draw (-\w, {-\nrow*\h}) — ({(\nzeros+1)*\w}, {-\nrow*\h});

                % Zeros and vertical (dotted) lines
                %
                \foreach \i in {0,…,\nzeros} {
                \draw[dotted, gray!80] (\i*\w, {-(\nrow+0.125)*\h}) — (\i*\w, 0);
                \draw (\i*\w, 0) — (\i*\w, +0.125) node[above] {$\pgfmathparse{\zeros[\i]}\pgfmathresult$};
                }

                % Signs and zeros table
                %
                \foreach \row in {0,…,\nrow} {
                \node

                at (-\w-0.125, {-(\row+0.5)*\h}) {\footnotesize signs of\, $\pgfmathparse{\factors[\row]}\pgfmathresult$};
                \foreach \col in {0,…,\ncol} {
                \node at ({(\col-1)*\w/2}, {-(\row+0.5)*\h}) {$\pgfmathparse{\signs[\row][\col]}\pgfmathresult$}; % <-- (1) } } \end{tikzpicture} \end{document} ` Purtroppo non riesco ancora a risolvere il problema della sovrapposizione della riga punteggiata con gli zeri. Ho provato con un box ma crea un box vuoto anche sulla linea tratteggiata. Ho provato con un \contour ma mi restituisce un errore del tipo: Incomplete \iffalse; all text was ignored after line 52.} dove la linea 52 è la fine dell'ultimo \foreach. Immagino che sia dovuto ad una eccezione dovuta al tentativo di creare un contorno di un carattere nullo (da cui il riferimento ad un \iffalse che probabilmente è nella definzione di \contour). Questo suggerisce anche una possibile strada per sistemare il codice. Gestendo l'eccezione del contenuto nullo in contour. Ma anche questa al momento è una ipotesi di lavoro Ciao R.

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

            Go to top