Racket e l’arcotangente iperbolica

CNJ

In in precedente post era rimasta in sospeso una domanda: quanto vale l’arcotangente iperbolica di -2? A differenza di Common Lisp (CL) Racket liscio risponde male; o almeno diversamente da CL, Wolfram Alpha e altri. Come mai?

Uhmmm, sembra una cosa complessa. Intanto conviene partire da Wikipedia (come faremmo senza la Wiki? (auto-cit.)) che ci da la formula:

wkatnh

Sembra semplice. Però c’è scritto che vale solo per il dominio ]-1, 1[ 😦 E sì, logico: per x = 1 il denominatore della frazione si annulla 😦 E per x < -1 la frazione ha valore negativo e il logaritmo… 😦

Insomma non tanto semplice, anzi complessa 😉

Ma, when the going gets tough, (cit.) Smettila, ti sbianchetto! sei ripetitivo!!!

C’è il Web, googlando spesso si trova, ecco:

, era una cosa complessa, cioè semplice ma bisognava usare i numeri complessi 😀
Nota per qualcuno: sì lo so che dal post precedente era chiarissimo ma se non facevo un po’ di manfrina questo post sarebbe stato troppo breve e poi i grafici della funzione nel piano complesso mi sembrano molto interessanti, io da solo non ci sarei riuscito.
Nota perso incubosa: meno male che ho già passato gli esami di mate & dintorni, pensa se a un prof di cattivo umore viene in mente di chiederti qual è il dominio di arctanh(z). Prof, dai, lo so che (forse) sono paranoie ma … 🙄

OK, tutto ciò premesso Racket va alla grande:

h0

proprio come dicono gli altri nel post citato precedentemente.

Perso (sì, lo so, si dovrebbe dire personalmente, me l’hanno fatto notare e sono anche stato sgridato, ma è un adattamento dal français, prendetevela con il mio ‘mico J-C o immaginate che ci sia l’accento sulla O) trovo lo script elegantissimo, tanto da riprodurlo qui di seguito:

#lang racket

(define (atanh x)
  (if (= x 1)
    "+/- infinity"  
    (* 1/2 (log (/ (+ 1 x) (- 1 x))))))

La funzione si riduce a una sola riga, inserita in un test if per discriminare la condizione di infinito (non ho indagato per il segno, who cares?). Notare che i numeri per Racket (OK, per il Lisp) non sono quelli dei successori di Algol (e Fortran).

Si può fare con Python? Io sono noto come evangelista Python che per tante cose è ottimo e meriterebbe di più e allora devo dire sì, certo.

C’è solo da tener conto di una cosa: i numeri complessi, non ci sono di default, serve il modulo cmath, presente fin dall’installazione del linguaggio. Io uso (e raccomando) la versione 3.x ma è uguale a quello della versione precedente (che consiglio solo in caso di codice esistente o dipendente da moduli non disponibili per la 3, per esempio Wx).

Ecco:

#!/usr/bin/python3

import cmath

def atanh(x):
    if (x == 1):
        return "+/- infinity"
    else:
        return 0.5 * cmath.log ((1 + x) / (1 - x))
        
#test
x = 0
print(x, atanh(x))
x = 1
print(x, atanh(x))
x = 2
print(x, atanh(x))
x = -2
print(x, atanh(x))

h1

OK, ah! con riferimento al post precedente sull’argomento: Racket promosso summa cum laude, nèh. Ma –si sa– Racket rockz 😀 😉 🙄 :mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: