Comando derivate

  • Creatore
    Topic
  • #43313
    Up
    0
    Down
    ::


    Ciao a tutti,

    sto cercando di definire un nuovo comando che riguarda le derivate di una funzione, ma con le mie quasi nulle conoscenze in ambito della programmazione in tex, non riesco a venirne a capo.

    Quello che vorrei fare è creare un comando di questo tipo:
    `\der[3]{xyz}{f(x,y,z)}`

    dove il nome \der spero non sia un obrobrio, [3] indica che ci si riferisce ad una derivata del terz’ordine di f rispetto a {xyz}, in maniera tale che il risultato sia questo:
    `\frac{\partial^3 f(x,y,z)}{\partial x \partial y \partial z}`

    È possibile fare qualcosa del genere?

    Io trovo che un comando del genere possa velocizzare la scrittura di queste espressioni (anche nel caso della semplice derivata parziale rispetto ad una sola variabile). Anche secondo voi potrebbe essere utile? Oppure ritenete che non abbia molto senso? (Se è così, perché?)

    In ogni caso, grazie mille.

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #43314
      Up
      0
      Down
      ::

      Ciao a tutti,

      sto cercando di definire un nuovo comando che riguarda le derivate di una funzione, ma con le mie quasi nulle conoscenze in ambito della programmazione in tex, non riesco a venirne a capo.

      Quello che vorrei fare è creare un comando di questo tipo:
      `\der[3]{xyz}{f(x,y,z)}`

      dove il nome \der spero non sia un obrobrio, [3] indica che ci si riferisce ad una derivata del terz’ordine di f rispetto a {xyz}, in maniera tale che il risultato sia questo:
      `\frac{\partial^3 f(x,y,z)}{\partial x \partial y \partial z}`

      È possibile fare qualcosa del genere?

      Io trovo che un comando del genere possa velocizzare la scrittura di queste espressioni (anche nel caso della semplice derivata parziale rispetto ad una sola variabile). Anche secondo voi potrebbe essere utile? Oppure ritenete che non abbia molto senso? (Se è così, perché?)

      In ogni caso, grazie mille.

      `\documentclass[a4paper]{article}

      \makeatletter
      \newcommand{\der}[2]{\begingroup
      \@tempswafalse\toks@={}\count@=\z@
      \@for\next:=#2\do
      {\advance\count@\@ne
      \if@tempswa
      \toks@=\expandafter{\the\toks@\,}%
      \else
      \@tempswatrue
      \fi
      \toks@=\expandafter{\the\expandafter\toks@\expandafter\partial\next}}%
      \frac{\partial\ifnum\count@=\@ne\else^{\number\count@}\fi#1}{\the\toks@}%
      \endgroup}
      \makeatother

      \begin{document}
      \[
      \der{f}{x}\qquad \der{f}{x,y}\qquad \der{f}{x,y,z}
      \]
      \end{document}`
      Non fa automaticamente le derivate multiple rispetto a una stessa variabile. Ci si può lavorare, però. 🙂

      Ciao
      Enrico

    • #43315
      Up
      0
      Down
      ::


      Ciao Enrico,

      grazie davvero! Ho provato il codice che mi hai fornito e, anche se sicuramente si può migliorare come dici tu, direi che fa già molto 😀 …

      Ti ringrazio ancora…
      Ciao

    • #43316
      Up
      0
      Down
      ::

      Ciao Enrico,

      grazie davvero! Ho provato il codice che mi hai fornito e, anche se sicuramente si può migliorare come dici tu, direi che fà già molto 😀 …

      Ti permetto di usare il codice seguente solo se prometti di non scrivere più “fa” con l’accento. 🙂
      `\documentclass[a4paper]{article}

      \makeatletter
      \newcommand{\der}[2]{\begingroup
      \@tempswafalse\toks@={}\count@=\z@
      \@for\next:=#2\do
      {\expandafter\check@var\next
      \advance\count@\der@exp
      \if@tempswa
      \toks@=\expandafter{\the\toks@\,}%
      \else
      \@tempswatrue
      \fi
      \toks@=\expandafter{\the\expandafter\toks@\expandafter\partial\der@var}}%
      \frac{\partial\ifnum\count@=\@ne\else^{\number\count@}\fi#1}{\the\toks@}%
      \endgroup}
      \def\check@var{\@ifstar{\mult@var}{\one@var}}
      \def\mult@var#1#2{\def\der@var{#2^{#1}}\def\der@exp{#1}}
      \def\one@var#1{\def\der@var{#1}\chardef\der@exp\@ne}
      \makeatother

      \begin{document}
      \[
      \der{f}{x}\qquad \der{f}{*{2}{x},y}\qquad \der{f}{*{3}{x},y,*{4}{z}}
      \]
      \end{document}`
      La derivazione consecutiva più volte rispetto a una variabile si indica con “*{numero}{variabile}”; se il numero è di una sola cifra si può anche omettere la coppia di graffe e così se la variabile ha il nome di una sola lettera; quindi “*3x” va bene quanto “*{3}{x}” ed è forse più facile da scrivere.

      Spiegazione TeXnica.

      (1) Apro un gruppo nel quale azzero il registro token \toks@ e il contatore \count@; inoltre pongo a falso il condizionale temporaneo.

      (2) Eseguo un ciclo sulla lista data come secondo argomento. Ogni passo del ciclo consiste di vari passaggi, il primo dei quali è guardare l’elemento della lista per separarlo nelle sue componenti se è del tipo *{numero}{variabile}.

      (3) Siccome l’elemento della lista che stiamo esaminando è l’espansione di \next, lo espando dandolo in pasto a \check@var; questo comando essenzialmente guarda se il token che segue è *.

      (3.1) Se lo è esegue \mult@var che definisce \der@var come “variabile^{numero}” e definisce \der@exp come l’esponente voluto.

      (3.2) Se il token che segue non è * siamo nel caso di “derivata semplice” e quindi definiamo \der@var come “variabile” e poniamo in \der@exp il numero 1.

      (4) Il valore finale del contatore \count@ ci serve per scrivere l’esponente al numeratore, quindi lo aumentiamo del valore contenuto in \der@exp.

      (5) Se il condizionale \@tempswa è falso siamo al primo elemento della lista, quindi poniamo il condizionale a vero; altrimenti aggiungiamo a \toks@ (che contiene il denominatore) uno spazio sottile.

      (6) Adesso aggiungiamo al denominatore \partial”variabile^{esponente}”.

      (7) Alla fine del ciclo possiamo scrivere la frazione che ha come esponente \partial^{esponente finale}”primo argomento di \der”; se \count@ è 1 c’è una sola derivata e quindi l’esponente si omette. A denominatore mettiamo il contenuto del registro \toks@.

      Ciao
      Enrico

    • #43317
      Up
      0
      Down
      ::


      Ciao Enrico,

      non so come ringraziarti! 😀 Grazie davvero!

      Ti permetto di usare il codice seguente solo se prometti di non scrivere più “fa” con l’accento.

      Strano, solitamente sto attento a quello che scrivo… soltanto che ho scritto di fretta, e avendo in mente la “à” di “già”, ho scritto “fà” al posto di “fa”. In ogni caso, come puoi vedere, ho tolto l’errore. Vedrò di non commettere più quest’errore, d’altronde il tuo codice vale molto più di quest’”impegno”!

      Ora cercherò anche di comprendere il tuo codice alla luce della tua spiegazione.

      Grazie mille e ciao!

    • #43318
      Up
      0
      Down
      ::


      Grazie, avevo proprio bisogno di un comando del genere 😀
      Piccolo problema: se la variabile rispetto a cui si deriva contiene un pedice, questo viene posizionato alla sinistra della frazione.
      Esempio:
      `\documentclass{article}

      \makeatletter
      \newcommand{\der}[2]{\begingroup
      \@tempswafalse\toks@={}\count@=\z@
      \@for\next:=#2\do
      {\expandafter\check@var\next
      \advance\count@\der@exp
      \if@tempswa
      \toks@=\expandafter{\the\toks@\,}%
      \else
      \@tempswatrue
      \fi
      \toks@=\expandafter{\the\expandafter\toks@\expandafter\partial\der@var}}%
      \frac{\partial\ifnum\count@=\@ne\else^{\number\count@}\fi#1}{\the\toks@}%
      \endgroup}
      \def\check@var{\@ifstar{\mult@var}{\one@var}}
      \def\mult@var#1#2{\def\der@var{#2^{#1}}\def\der@exp{#1}}
      \def\one@var#1{\def\der@var{#1}\chardef\der@exp\@ne}
      \makeatother

      \begin{document}
      \[
      \der{f_i}{x_i}
      \]

      \end{document}`

    • #43319
      Up
      0
      Down
      ::

      Grazie, avevo proprio bisogno di un comando del genere 😀
      Piccolo problema: se la variabile rispetto a cui si deriva contiene un pedice, questo viene posizionato alla sinistra della frazione.
      Esempio:

      Basta una lieve modifica:
      `\documentclass{article}

      \makeatletter
      \newcommand{\der}[2]{\begingroup
      \@tempswafalse\toks@={}\count@=\z@
      \@for\next:=#2\do
      {\expandafter\check@var\next\@nil
      \advance\count@\der@exp
      \if@tempswa
      \toks@=\expandafter{\the\toks@\,}%
      \else
      \@tempswatrue
      \fi
      \toks@=\expandafter{\the\expandafter\toks@\expandafter\partial\der@var}}%
      \frac{\partial\ifnum\count@=\@ne\else^{\number\count@}\fi#1}{\the\toks@}%
      \endgroup}
      \def\check@var{\@ifstar{\mult@var}{\one@var}}
      \def\mult@var#1#2\@nil{\def\der@var{#2^{#1}}\def\der@exp{#1}}
      \def\one@var#1\@nil{\def\der@var{#1}\chardef\der@exp\@ne}
      \makeatother

      \begin{document}
      \[
      \der{f_i}{x_i}
      \]

      \end{document}`
      Si tratta di rendere delimitato l’argomento che viene interpretato come simbolo della variabile.

      Ciao
      Enrico

    • #43320
      Up
      0
      Down
      ::


      Ora funziona correttamente. Grazie nuovamente 😀

    • #43321
      Up
      0
      Down
      ::


      Bellissimo e utilissimo. Complimenti.

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

Go to top