Radici e espressioni simboliche

elea3

Un paio di idee, senza arrivare agli script, anche perché –adesso vi conto.

Non dico che sono in ritardo su quanto ho promesso; faccio quello che gli americani chiamano appellarsi al quarto emendamento, ecco.

Ci sono tanti linguaggi di programmazione, alcuni rendono più semplice fare determinate operazioni, altri sono più simpatici (non a tutti, ovvio), altri ancora non sono così conosciuti (almeno da me).

Ci sono argomenti che ho già trattato in passato ma che adesso salta fuori che sarebbe opportuno riprendere:

  • trovare le radici di un’espressione;
  • semplificare un’espressione simbolica.

Si può fare? ci provo.

Trovare le radici di un’espressione

0

Considero l’espressione in figura, equazione di terzo grado, il primo che è moderatamente ostico (o comunque non immediato). _c è uno script derivato da bc, ne semplifica in qualche misura l’uso (forse lo racconterò, non oggi che sono in ritardo).

La prima idea, quella giusta secondo me, è di usare Maxima:

(%i1) expr : 8*x^3 + 4*x^2 + 2*x - 258 = 0;
                             3      2
(%o1)                     8 x  + 4 x  + 2 x - 258 = 0
(%i2) solve (expr);
                    sqrt(123) %i + 7      sqrt(123) %i - 7
(%o2)        [x = - ----------------, x = ----------------, x = 3]
                           4                     4

OK, ma delle tre soluzioni due sono complesse; se voglio solo quelle reali opero così:

(%i3) realroots (expr);
(%o3)                               [x = 3]

OK, ma Maxima è vecchio, implementato come si usava una volta, poco conosciuto, …

Qualcosa di più mainstream, tipo JavaScript? Ahemmm… quello no, ma c’è Python.
Per le espressioni simboliche si può usare il package SymPy.

>>> from sympy import Symbol
>>> x = Symbol('x')
>>> expr = 8*x**3 + 4*x**2 + 2*x - 258
>>> from sympy.solvers import solve
>>> solve(expr)
[3, -7/4 - sqrt(123)*I/4, -7/4 + sqrt(123)*I/4]

OK, da tutte le soluzioni, anche quelle complesse; notare che SymPy usa anche simboli aggiuntivi rispetto a Python, qui I equivale a j di Python. Naturalemte se voglio solo le soluzioni reali posso:

>>> from sympy import real_roots
>>> real_roots(expr)
[3]

OK. JavaScript, in realtà Node resta da vedere, e personalmente m’interessa poco, anzi niente.

Semplificazione espressioni simboliche

Alle volte capitano; roba che si fa in prima media, e forse me la sono dimenticata.
Con Maxima ho:

(%i1) expr : (a + b)^2 - b^2 + a*b - c;
                                         2    2
(%o1)                     (- c) + (b + a)  - b  + a b
(%i2) ratsimp (expr);
                                               2
(%o2)                         (- c) + 3 a b + a
(%i3) a : 1; b : 2; c : 3;
(%o3)                                  1
(%o4)                                  2
(%o5)                                  3
(%i6) ev (expr);
(%o6)                                  4

Mentre com Python:

>>> from sympy import Symbol, simplify
>>> a = Symbol('a')
>>> b = Symbol('b')
>>> c = Symbol('c')
>>> expr = (a + b)**2 - b**2 + a*b - c
>>> simplify(expr)
a**2 + 3*a*b - c

Calcolare il valore numerico è un po’ più quixotico, serve lambda:

>>> expr
a**2 + 3*a*b - c
>>> f = lambda a, b, c : a**2 + 3*a*b - c
>>> f(1, 2, 3)
4

ma si può fare di meglio:

>>> a = 1; b = 2; c = 3
>>> expr = a**2 + 3*a*b - c
>>> eval(str(expr))
4

Ci sarebbe ancora un’alternativa (sexy) ma non adesso; prossimamente; forse.

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

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

Logo 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...

This site uses Akismet to reduce spam. Learn how your comment data is processed.

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