Introduzione a Mathematica

Gianluca Gorni
Università di Udine, Dipartimento di Matematica e Informatica

4. Equazioni

Ultima modifica: 25 maggio 2007

Questo file è concepito principalmente per essere letto interattivamente su schermo. Per questo, e anche per risparmiare spazio, gli output di solito sono omessi. L'utente che legge da schermo li deve rigenerare mandando in esecuzione le celle di input una alla volta.
Qualcuno vorrà stampare per leggere su carta: in tal caso apra i gruppi di celle ed esegua tutte le celle prima di stampare. Le celle si possono eseguire tutte in un sol colpo col menu Kernel>Evaluation>Evaluate Notebook

Inizializzazione

Inizializzazione consigliata:

SetOptions[$FrontEnd, 
        CommonDefaultFormatTypes -> {"Output" -> 
              TraditionalForm}];

Distinguere fra assegnazione (=) ed equazione (==)

Chiedo a Mathematica se 3=3:

3 = 3

Cosa vuol dire questo messaggio? Vuol dire che noi scrivendo 3=3 chiediamo a Mathematica di assegnare il valore 3 al secondo membro all'oggetto 3 che sta al primo membro. Tuttavia Mathematica permette di assegnare valori solo a variabili. L'oggetto 3 al primo membro non è una variabile, ma un "raw object" , una costante.
Un esempio in cui i due membri sono diversi:

3 = 4

Per chiedere a Mathematica se 3=3 la sintassi giusta è col doppio uguale:

3 == 3

3 == 4

Quando Mathematica incontra un doppio uguale, salvo avviso contrario non esegue sui due membri se non le trasformazioni che farebbe se incontrasse i due membri da soli, cioè in genere niente o quasi:

x + x + y == z

(x^2) == 2

a == a

Se i due membri non vengono identici carattere per carattere, Mathematica restituisce l'uguaglianza senza pronunciarsi se sia vera o falsa:

(((x + y))^2) == (x^2) + 2  x y + (y^2)

(a^2) - (b^2) == (a - b) (a + b)

Per capire se un'uguaglianza è un'indentità si può provare con Simplify:

Simplify[(((x + y))^2) == (x^2) + 2  x y + (y^2)]

Simplify[(a^2) - (b^2) == (a - b) (a + b)]

Comunque l'uso più comune del doppio uguale è per le equazioni, all'interno di comandi come Reduce e Solve.

Equazioni risolte passo-passo

Conti come questi si possono anche fare "manualmente" manipolando equazioni. Prima di tutto carichiamo le seguenti definizioni ausiliarie:

Unprotect[Plus, Power, Times, Factor, Or, 
        Equal];

    
((a_ == b_) + c_) := (a + c == 
            b + c);
((a_ == b_)*c_) := (a*c == 
            b*c);
(a_ == b_)^
          n_ := (a^n == b^n);
Factor[a_ == b_] := 
        Factor[a] == Factor[b];
ExpandAll[Or[a_, b__]] ^:= 
        Or @@ ExpandAll[{a, b}];
ExpandAll[Equal[a_, b_]] ^:= 
        Equal @@ ExpandAll[{a, b}];

    
Protect[Plus, Power, Times, Factor, Or, 
        Equal];

    
\(\(prodottiNotevoli = {a_\^2 - 
              b_\^2 :> \((a - b)\)\ \((a + b)\), 
          a_\^2 + b_?
                Negative :> \((a - \@\(-b\))\)\ \((a + \@\(-b\))\)};\)\)
annullamentoDelProdotto = (a_Times == 0) :> 
          Or @@ Map[# == 0 &, List @@ a];
estraiDaOr = #1 /. 
            HoldPattern[
                Or[a__]] :> {a}[[First[#2]]] &;
distribuisci = {(p : {(_Or + _. ) .. }) :> 
            Or @@ MapIndexed[estraiDaOr, 
                p], (p : {(_Or*_. ) .. }) :> 
            Or @@ MapIndexed[estraiDaOr, p]};

Esempio1

Poi poniamoci il problema di risolvere l'equazione 3  x + 4 == 0:

Clear[x];
3  x + 4 == 0

Togliamo 4 da ambo i membri: usiamo il simbolo %, che sta per l'ouput immediatamente precedente:

Clear[x];
3  x + 4 == 0;
% - 4

Dividiamo ambo i membri per 3:

Clear[x];
3  x + 4 == 0;
% - 4;
%/3

L'equazione è risolta! Questa è una soluzione ed è l'unica perché i passaggi che abbiamo fatto sono tutti reversibili:

Clear[x];
x == -(4/3);
%*3;
% + 4

Esempio 2

Prendiamo l'equazione (x^2) + 2  x - 3 == 0:

(x^2) + 2  x - 3 == 0

Con l'intenzione di mettere in evidenza un quadrato perfetto, aggiungiamo 4 ad ambo i membri:

(x^2) + 2  x - 3 == 0;
% + 4

Fattorizziamo:

(x^2) + 2  x - 3 == 0;
% + 4;
% // Factor

Portiamo 4 al primo membro:

(x^2) + 2  x - 3 == 0;
% + 4;
% // Factor;
% - 4

Scomponiamo col prodotto notevole:

(x^2) + 2  x - 3 == 0;
% + 4;
% // Factor;
% - 4;
% /. prodottiNotevoli

Applichiamo la regola dell'annullamento del prodotto:

(x^2) + 2  x - 3 == 0;
% + 4;
% // Factor;
% - 4;
% /. prodottiNotevoli;
% /. annullamentoDelProdotto

Isoliamo x nelle due equazioni aggiungendo rispettivamente 1 e -3 da ambo i membri:

(x^2) + 2  x - 3 == 0;
% + 4;
% // Factor;
% - 4;
% /. prodottiNotevoli;
% /. annullamentoDelProdotto;
% + {1, -3} /. distribuisci

Ecco risolta l'equazione! Queste sono tutte e sole le soluzioni perché i passaggi che abbiamo fatto sono tutti reversibili.

Equazioni risolte con regole di sostituzione: Solve

Per risolvere le equazioni algebriche il comando principale è Solve, che prende come primo argomento l'equazione (o la lista delle equazioni) da risolvere e come secondo argomento l'incognita (o la lista delle incognite):

Solve[x - 1 == 2 - x, x]

Ci vuole del tempo per abituarsi al modo in cui Mathematica formatta le soluzioni delle equazioni. Nella matematica tradizionale la soluzione di x - 1 == 2 - x si scrive come x = 3/2, con l'uguaglianza. Invece Mathematica la presenta come una regola di sostituzione x -> 3/2. Come se non bastasse, ci mette attorno due livelli di parentesi graffe: {{x -> 3/2}}. Perché tutto ciò?
Lo scopo è di mettere la soluzione in un formato sostituibile immediatamente in altre formule. Supponiamo che mi interessi il valore di (x^2) - 2 piuttosto che la x in sé e per sé. Allora basta che scriva

(x^2) - 2/.Solve[x - 1 == 2 - x, 
        x]

Oppure, se devo riusare più volte la soluzione, le do un nome:

sol = 
        Solve[x - 1 == 2 - x, x];
(x^2) - 2/.sol

Equazioni con più incognite o con più soluzioni: liste di liste

E le parentesi graffe a cosa servono? Beh, ricordiamoci che oltre alle equazioni singole ci sono anche i sistemi in più incognite, e non sempre la soluzione è unica. La situazione generale è di avere più di una soluzione, ognuna delle quali dà il valore di più incognite. Mathematica struttura il risultato come una lista di liste di regole di sostituzione: ogni lista al primo livello è una soluzione, espressa come lista di regole di sostituzione per le singole incognite.
Un esempio di un'equazione in un'incognita con due soluzioni:

Solve[(x^2) == 4,x]

Il sistema di due equazioni in due incognite  {({{x + y == 1}, {x - y == 2}}) si imposta con le due equazioni fra graffe e le due incognite pure fra graffe. Questo sistema ha una sola soluzione:

Solve[{x + y == 1, x - y == 2},{x, y}]

Il sistema di secondo grado {({{(x^2) - y == 1}, {x + y == 0}}) con due equazioni in due incognite ha due soluzioni:

Solve[{(x^2) - y == 2, x + y == 0},{x, y}]

Un'equazione senza soluzioni:

Solve[x - 1 == x + 1,x]

Un'equazione con soluzioni non reali:

Solve[(x^2) == -1,x]

In un sistema sottodeterminato, con infinite soluzioni, Mathematica esprime alcune delle variabili in termini delle altre:

Solve[{x - y + z == 0, 2  x + y + z == 1}, {x, y, 
        z}]

Osservate che quando si usa l'output di Solve in una sostituzione (espressione/.Solve[...]), il risultato è una lista: il primo elemento è il risultato della sostituzione con la prima soluzione, il secondo elemento viene dalla seconda sostituzione, eccetera:

x + 1/.Solve[(x^2)==4,x]

Il -1 viene dalla soluzione x -> -2, mentre il 3 viene dall'altra soluzione x -> 2.

Se desideriamo i valori delle soluzioni di Solve, senza le frecce, non ci vuole molto:

x/.Solve[(x^2) == 4,x]

Posso isolare la prima delle due soluzioni di Solve[x^2==4,x] scrivendo Solve[x^2==4,x][[1]], la seconda con Solve[x^2==4,x][[2]]seconda. Questo è un meccanismo generale: l'i-esimo elemento di una lista = {(Subscript[x, 1]), (Subscript[x, 2]),  ... , (Subscript[x, n])} si estrae con lista[[i]]:

Solve[(x^2) == 4, x]

Solve[(x^2) == 4, x][[1]]

Solve[(x^2) == 4, x][[2]]

sol = Solve[(x^2) == 4, x];
sol[[1]]

Problemi risolti

Geometria

Problemino: in un rettangolo la somma dei due lati è 15 e la differenza è 3. Quant'è l'area?
Soluzione. Chiamiamo a,b le lunghezze dei due lati. Il sistema da risolvere è {({{a + b == 15}, {a - b == 3}}). Il comando per risolverlo è Solve[{a+b==15, a-b==3},{a,b}]. Però qui non ci interessano tanto i valori di a e b ma l'area a b. Possiamo avere l'area direttamente con

sol = 
      Solve[{a + b == 15, a - b == 3}, {a, 
          b}]
a*b/.sol

Geometria analitica

Problemino: trovare le intersezioni fra la parabola y = (x^2) - 3 col cerchio (x^2) + (y^2) - y - 4 = 0.
Soluzione:

sol = 
      Solve[{y == x^2 - 3, x^2 + y^2 - y - 4 == 0}, {x, y}]

Se si preferiscono i risultati in termini di coppie {x, y}, si può scrivere

{x, y}/.sol

Una lista di liste in forma tradizionale viene spesso formattata come matrice. Se vogliamo vedere le parentesi graffe trasformiamo l'output con il menu Cell>Convert To>StandardForm, oppure scriviamo

StandardForm[{x, y}/.sol]

Geometria analitica

Problemino: trovare centro e raggio del cerchio passante per i punti (0, 0), (1, 1), (-1, 2).
Soluzione: l'equazione generica del cerchio di centro (a, b) e raggio r è (((x - a))^2) + (((y - b))^2) == (r^2). La richiesta che il cerchio passi per (0, 0) si scrive con

equazioneCerchio = (((x - a))^2) + (((y - b))^2) == 
        (r^2)

equazioneCerchio/.{x -> 0, y -> 0}

Analogamente il passaggio per gli altri due punti si scrive come

equazioneCerchio/.{x -> 1, y -> 1}

equazioneCerchio/.{x -> -1, y -> 2}

Possiamo ottenere le tre condizioni con una singola regola di sostituzione:

condizioni=equazioneCerchio/.{{x -> 0, y -> 0}, {x -> 1, 
              y -> 1}, {x -> -1, y -> 2}}

Abbiamo ottenuto tre equazioni nelle tre incognite a, b, r. Possiamo risolverle:

Solve[condizioni,{a, b, r}]

Le due soluzioni hanno le stesse a, b ma r opposti. La prima soluzione ha r negativo, che non avrebbe senso, però nell'equazione del cerchio r viene elevato al quadrato, quindi alla fine viene la stessa cosa. La seconda soluzione invece è accettabile tranquillamente. Conclusione: esiste un solo cerchio che passa per i punti (0, 0), (1, 1), (-1, 2): ha centro in (-(1/6), (7/6)) e raggio (5/(3 (Sqrt[2]))). L'equazione è:

equazioneCerchio/.Solve[condizioni,{a, b, r}][[2]]

Possiamo portare a primo membro e scriverle in forma espansa:

((x - a)^2 + (y - b)^2 - r^2 == 0/.Solve[condizioni,{a, b, r}][[2]])//ExpandAll//Together//Numerator

L'equazione viene senza termine noto. Cosa prevedibile, dato che il cerchio passa per (0, 0).

Equazioni non algebriche

Solve è progettato principalmente per le equazioni algebriche. Equazioni che contengono funzioni non algebriche (esponenziali, logaritmi, funzioni trigonometriche...) non sempre sono risolte completamente.
Un esempio in cui Mathematica dà la soluzione completa:

Solve[Log[x] == 1,x]

Un'altro esempio in cui Mathematica avverte che possono essere andate perse delle soluzioni.

Solve[2^x == 2, x]

In effetti sono andate perse delle soluzioni complesse. Una è 1 + 2  π i/Log[2]. Provare per credere a valutare Simplify[
        (2^(1 + 2  π i/Log[2]))].

L'equazione Sin[x] == 0 ha infinite soluzioni: tutti i numeri della forma x = n π al variare di n ∈ ℤ. Mathematica trova soltanto quella con n = 0, ma è gentile nell'avvisarci del pericolo:

Solve[Sin[x] == 0,x]

Equazioni con soluzioni in forma logica: Reduce

Un'alternativa a Solve è Reduce, che presenta le soluzioni in forma di espressione logica:

Reduce[(x^2) == 2,x]

Reduce[(x^2) == 2,x]//StandardForm

La doppia sbarra verticale in x == -(Sqrt[2])||x == (Sqrt[2]) è la disgiunzione logica "oppure". Un sistema di equazioni:

Reduce[{(x^2) - y == 2, x + y == 0},{x, y}]

Reduce[{x^2 - y == 2, x + y == 0}, {x, y}] // 
      InputForm

Nella StandardForm i doppi ampersand in x==-2&&y==2||x==1&&y==-1 sono la congiunzione logica "e". La congiunzione "e" ha la precedenza nella notazione rispetto alla disgiunzione "oppure". Quindi il risultato va interpretato come (x==-2&&y==2)||(x==1&&y==-1).
I risultati di Reduce sono meno prontamente spendibili di Solve. Dove Reduce batte Solve è nel dirimere i casi speciali quando le equazioni dipendono da parametri. Esempio:

Solve[a*x == b, x]

Solve dà la soluzione generica b/a, senza ammonire l'utente che questa non è valida nel caso speciale a = 0.

Reduce[a*x == b,x]

Invece Reduce ci fa la distinta di tutti i casi possibili:
1) quando a = 0 e b = 0 tutti gli x sono soluzione (a==0&&b==0 non impone nessuna restrizione su x);
2) quando a ≠ 0 la soluzione è unica e vale x = b/a.
3) il caso a = 0 e b ≠ 0 non viene riportato perché non ha soluzioni; in una disgiunzione una coponente falsa si può cancellare.

Reduce risolve l'equazione di secondo grado a (x^2) + b x + c == 0 in tutti i casi, mentre Solve dà solo il caso "generico" a ≠ 0:

Reduce[a*(x^2) + b*x + c == 0,x]

Solve[a*(x^2) + b*x + c == 0,x]

Reduce è un comando molto potente, e risolve per esempio anche disequazioni (nelle versioni di Matematica dalla 5 in poi):

Reduce[(x^2) + 3  x - 2 < 0, x]

Notazione bidimensionale per i sistemi di equazioni

Volete anche voi scrivere i sistemi di equazioni nella forma {({{2  x + (x^2) == -1}, {x == 3}})? Selezionate la cella seguente e poi andate su File>Generate Palette from Selection: nascerà una tavolozza cliccabile e salvabile.

({{{({{\[Placeholder]}, {\[Placeholder]}}), {({{\[Placeholder]}, {\[Placeholder]}, {\[Placeholder]}}), {({{\[Placeholder]}, {\[Placeholder]}, {\[Placeholder]}, {\[Placeholder]}})}})

({{Solve[{({{\[Placeholder]}, {\[Placeholder]}})}//Flatten,{\[Placeholder], \[Placeholder]}], {({{\[Placeholder]}, {\[Placeholder]}, {\[Placeholder]}}), {({{\[Placeholder]}, {\[Placeholder]}, {\[Placeholder]}, {\[Placeholder]}})}})

Solve[{({{x + 1 == 10}, {y - 1 == 0}})}//Flatten,{x, y}]

{({{x + y == 0}, {x - y == 1}})

Solve[{({{x + y == 0}, {x - y == 1}})}//Flatten,{x, y}]

Solve[{({{x + y == 0}, {x - y == 1}})}//Flatten,{x, y}]

Esercizi

In un rettangolo la somma dei due lati adiacenti è 15 e la differenza è 3. Quant'è l'area?

Trovare le intersezioni fra le curve di equazione y == (x^2) e 4  (x^2) - 3  (y^2) == 1.

Trovare i coefficienti a, b in modo tale che l'ellisse ((x^2)/(a^2)) + ((y^2)/(b^2)) == 1 incontri la parabola y == (x^2) - x nei punti di ascisse 1 e (3/4).

Trovare i coefficienti a, b in modo tale che il sistema {({{x + a y == a}, {a x - y == b}}) abbia come soluzione x == 1, y == -2.

Per quali valori dei parametri a, b il sistema {({{x - a y == a}, {a x - y == b}})ha una sola soluzione, nessuna soluzione, infinite soluzioni?

Che cosa viene con Solve[(((x^2) - 1)/(x - 1)) == 2, x]? Il risultato è giusto? Come si potrebbe spiegare?