Introduzione a Mathematica

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

5. Punti, cerchi, linee, angoli

Ultima modifica: 10 dicembre 2006

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}];
$FormatType = TraditionalForm;

Un problemino geometrico

Disegnare un triangolo isoscele che abbia i tre lati di lunghezze 12, 12 e 17. Disegnare il triangolo e dire quant'è l'angolo compreso fra i due lati uguali.

Calcolare e disegnare il triangolo

Nella risoluzione ci aiuteremo con delle figure, così impariamo anche un po' di programmazione grafica.
Dunque, disponiamo uno dei due lati di lunghezza 12 orizzontale, con estremi (0,0) e (12,0):

Show[Graphics[{Point[{0, 0}], Point[{12, 0}]}]];

Show e Graphics sono due due istruzioni che non approfondiamo per il momento. Quello che conta è il contenuto di Graphics: una lista di due Point. L'argomento di Point è la lista {ascissa,ordinata}.
Ora, il terzo vertice incognito {x,y} si trova a distanza 12 da uno dei due punti (prendiamo l'origine), cioè si trova sul cerchio di centro {0,0} e raggio 12, che si esprime con Circle[{0,0},12]:

Show[Graphics[{Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12]}]];

Un momento, invece di un cerchio è venuta un'ellisse?? Questo è perché per default Mathematica scala le figure in orizzontale e verticale per portarle a un formato standard. Noi qui vogliamo la stessa scala in orizzontale e in verticale: l'otteniamo con l'opzione AspectRatio->Automatic data come secondo argomento a Show:

Show[Graphics[{Point[{0, 0}], Point[{12, 0}], 
              Circle[{0, 0}, 12]}],AspectRatio -> Automatic];

Così va meglio. Ora, il terzo vertice incognito {x,y} dista 17 dal secondo vertice {12,0}, cioè sta sul cerchio di centro {12,0} e raggio 17: visualizziamo il cerchio con Circle[{12,0},17]:

Show[Graphics[{Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17]}],
AspectRatio -> Automatic];

I due cerchi si incontrano in due punti, uno in alto e uno in basso. Possiamo trovare le coordinate delle intersezioni con Solve: l'equazione del primo cerchio è

Sqrt[x^2 + y^2] == 12;

Quella del secondo cerchio è

Sqrt[(x - 12)^2 + y^2] == 17;

Facciamo il sistema fra le due equazioni e risolviamo (registrando il risultato come sol):

sol=Solve[{Sqrt[x^2 + y^2] == 12, 
              Sqrt[(x - 12)^2 + y^2] == 17},{x, y}]

N[sol]

Ecco: abbiamo le coordinate del terzo punto, o, meglio, le due possibilità, che sono simmetriche rispetto all'asse x. Evidenziamo le due soluzioni trovate nella figura. Qui viene a pennello il formato Mathematichese delle soluzioni: infatti per avere i due punti basta scrivere Point[{x,y}]/.sol:

Point[{x, y}] /. sol

Figura:

Show[Graphics[{Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17],Point[{x, y}] /. sol}],
AspectRatio -> Automatic];

I punti vengono piuttosto piccoli. Per ingrandirli usiamo la direttiva grafica PointSize[r], dove r è la frazione della larghezza complessiva della figura. Il valore di default di r è 0.008, cioè l'8 per mille della larghezza della figura (vedi Help>Help Browser>Built-in Functions>PointSize). Raddoppiamo il diametro dei punti con PointSize[0.016]; questa direttiva va piazzata prima dei punti su cui deve avere effetto:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17],Point[{x, y}] /. sol}],
AspectRatio -> Automatic];

Vogliamo anche i lati del triangolo, non solo i vertici. Per questo c'è Line[], che prende per argomento una lista di  coppie di coordinate. Il lato orizzontale è facile: Line[{{0,0},{12,0}}]

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17],Point[{x, y}] /. sol,Line[{{0, 0}, {12, 0}}]}],
AspectRatio -> Automatic];

Gli altri due lati richiedono le coordinate del terzo vertice. Scegliamo l'intersezione di sopra, che è la seconda in sol. Per estrarre il secondo elemento della lista sol si scrive sol[[2]]:

sol[[2]]

Aggiungiamo il secondo lato di lunghezza 12:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17],Point[{x, y}] /. sol,Line[{{0, 0}, {12, 0}}],Line[{{0, 0},{x, y} /. sol[[2]]}]}],
AspectRatio -> Automatic];

e il lato di lunghezza 17:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17],Point[{x, y}] /. sol,Line[{{0, 0}, {12, 0}}],Line[{{0, 0}, {x, y} /. sol[[2]]}],Line[{{12, 0},{x, y} /. sol[[2]]}]}],
AspectRatio -> Automatic];

Possiamo risparmiare battiture di tasti combinando i tre lati del triangolo in un'unica Line che prende come argomento la lista dei tre vertici, col primo vertice ripetuto alla fine:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Circle[{0, 0}, 12],Circle[{12, 0}, 17],Point[{x, y}] /. sol,Line[{{0, 0},{12, 0},{x, y} /. sol[[2]],{0, 0}}]}],
AspectRatio -> Automatic];

Ora che abbiamo il triangolo possiamo anche fare a meno dei due cerchi e del punto intersezione in basso:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Point[{x, y}]/.sol[[2]],Line[{{0, 0}, {12, 0}, {x, y} /. sol[[2]], {0, 
                      0}}]}],
AspectRatio -> Automatic];

Si può economizzare sulla regola di sostituzione sol[[2]] portandola fuori dalla lista:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Point[{x, y}],Line[{{0, 0}, {12, 0}, {x, y}, {0, 0}}]}/.sol[[2]]],
AspectRatio -> Automatic];

Calcolare l'angolo

Ricordiamoci ora che il problema iniziale era di calcolare l'angolo compreso fra i due lati di lunghezza 12. Nella nostra figura l'angolo è quello in basso a sinistra. Qui bisogna usare la trigonometria. Dato un punto {x,y} del piano, l'angolo compreso fra l'asse x positivo e la semiretta per l'origine e il punto si può ricavare da diverse formule, più o meno adatte a seconda di quale sia il quadrante a cui appartiene {x,y}. Il nostro punto sta nel secondo quadrante (x è negativa e y positiva). Una formula adatta è arccos[ascissa/raggio]:

ArcCos[(x/(Sqrt[(x^2) + (y^2)]))]

Nel nostro caso

angolo=ArcCos[(x/(Sqrt[(x^2) + (y^2)]))]/.sol[[2]]

Il valore esatto del nostro angolo è ArcCos[-(1/288)]. Il valore in virgola mobile è

N[angolo]

La funzione ArcCos dà risultati in radianti. Per passare ai gradi basta dividere per π/180, che è il valore di un grado in radianti:

angoloInGradi = N[(angolo/(Pi/180))]

Dunque il nostro angolo supera i 90 gradi per meno di 0,2 gradi. Cioè circa 12 primi:

N[((angoloInGradi - 90)/(1/60))]

La funzione Circle può anche dare un arco, invece di un cerchio completo: basta scrivere Circle[{x, y},raggio,{(Subscript[θ, 0]), (Subscript[θ, 1])}], dove (Subscript[θ, 0]), (Subscript[θ, 1]) sono l'angolo iniziale e finale dell'arco. Con questo possiamo abbellire la figura del triangolo evidenziando l'angolo al vertice:

Show[Graphics[{PointSize[ .016],Point[{0, 0}],Point[{12, 0}],Point[{x, y}],Line[{{0, 0}, {12, 0}, {x, y}, {0, 0}}],Circle[{0, 0},1,{0, angolo}]}/.sol[[2]]],
AspectRatio -> Automatic];

Esercizi

Disegnare un triangolo con lati 29, 29 e 41. Calcolare l'angolo compreso fra i due lati uguali.

L'angolo ArcCos[-(1/288)] è forse un angolo notevole, cioè un multiplo razionale di π? Per saggiare il problema calcolare N[ArcCos[-(1/288)]/π, 40] e dire se ha l'aria di essere un numero decimale periodico.

Esprimere ArcSin[1/4] in gradi, primi e secondi.

La costante Degree ha valore numerico π/180. Provare a eseguire 45Degree, Cos[45*Degree], Sin[90Degree], Simplify[Degree/Pi], FullSimplify[Degree/π].

In una formula, per esempio Sin[45*Degree], selezionare Degree e poi andare sul menù Help>Find Selected Function. Conviene memorizzare l'abbreviazione da tastiera per questo aiuto.

In un'espressione Mathematica complicata può essere difficile da capire come si annidano le varie parentesi. Se si clicca più volte in un punto dell'espressione viene selezionata la parte via via crescente dell'espressione che contiene il punto cliccato. Vedi anche il menù Edit>Expression Input>Extend Selection.

Esempio avanzato: risolvere un'equazione diofantea di primo grado e visualizzare il risultato

Un programma per risolvere le equazioni diofantee di primo grado in due variabili:

risolviDiofantea[membro1_ == membro2_, {x_Symbol, y_Symbol}, 
          k_Symbol] := 
        Module[{eq, coefX, coefY, termineNoto, mcd, solMcd, solOmogenea, 
            solGenerale}, 
eq = 
            ExpandAll[membro1 - membro2]; 
coefX = 
            Coefficient[eq, x]; 
coefY = 
            Coefficient[eq, y]; 
termineNoto = 
            eq /. {x -> 0, y -> 0}; 
{mcd, 
              solMcd} = ExtendedGCD[coefX, coefY]; 
If[
            mcd == 0, 
            If[termineNoto == 0, Return[{{}}], 
              Return[{}]]]; 
If[
            Mod[termineNoto, mcd] ≠ 0, 
            Return[{}]]; 
solOmogenea = {coefY, -coefX}/
              mcd; 
solGenerale = 
            Expand[-solMcd*termineNoto/mcd + 
                k*solOmogenea]; 
Thread[{x, y} -> 
              solGenerale]];
risolviDiofantea[True, {x_Symbol, y_Symbol}, 
          k_Symbol] := {{}};

Esempio:

risolviDiofantea[3  x + 2  y == 5, {x, y}, k]

Un programma per visualizzare le soluzioni delle equazioni diofantee di primo grado:

figuraDiofantea[eq_, {x_Symbol, y_Symbol}, k_Symbol] := 
        Module[{sol, soluzionePiena, kmedio, kmin, kmax, x1, y1, x2, 
            y2}, 
sol = 
            risolviDiofantea[eq, {x, y}, k]; 
If[
            sol == {}, 
            Return[Null]]; 
soluzionePiena := 
            Graphics[{RGBColor[1, 0, 0], PointSize[ .03], 
                Table[Point[{x, y}], {x, -3, 3}, {y, -3, 
                    3}]}, {GridLines -> {Range[-3, 3], 
                    Range[-3, 3]}, Frame -> True, 
                AspectRatio -> Automatic}]; 
If[
            sol == {{}}, 
            Return[Show[soluzionePiena]]]; 
kmedio = 
            k /. Solve[D[x^2 + y^2 /. sol, k] == 0, 
                  k][[1]]; 
{kmin, 
              kmax} = {Floor[kmedio - 1], 
              Floor[kmedio + 2]}; 
{{x1, y1}, {x2, 
                y2}} = {x, y} /. 
                sol /. {{k -> kmin}, {k -> 
                    kmax}}; 
Show[
            Graphics[{Dashing[{ .02,  .02}], 
                Line[{x, y} /. 
                      sol /. {{k -> kmin}, {k -> kmax}}], 
                RGBColor[1, 0, 0], 
                PointSize[ .03], Point[{x, y}] /. sol /. 
                  Table[{k -> r}, {r, kmin, kmax}]}], 
            GridLines -> {Range[Min[x1, x2], Max[x1, x2]], 
                Range[Min[y1, y2], Max[y1, y2]]}, Frame -> True, 
            AspectRatio -> Automatic]];

Esempio:

figuraDiofantea[3  x + 2  y == 5, {x, y}, k];