Kuidas arvuti ringi üles leidis, ilma et keegi oleks talle ringi joonistanud

Märkmikus relations.ipynb ei kasutatud ühtegi joonistamise käsku. Arvuti lihtsalt kontrollis läbi rohkem kui 168 tuhat punkti ja jättis alles need, mis vastasid ühele reeglile. Allpool käime selle mõtte samm-sammult läbi. Programmeerimist pole vaja osata.

Need 20 punkti on kogu tulemus. Kuidas nendeni jõuti?

1

Kaks arvude rida

Kõigepealt tehti kaks ühesugust arvude nimekirja: x ja y. Mõlemad algavad arvust −2 ja kasvavad sammuga 0,01:

−2,00 · −1,99 · −1,98 · … · 2,08 · 2,09

Kokku on kummaski reas 410 arvu. Mõtle neist kui joonlaua mõõtejoontest: x-rida on rõhtne joonlaud paberi alumises servas, y-rida püstine joonlaud vasakul.

Miks lõpeb rida 2,09-ga, mitte 2,1-ga? Python peatub alati enne antud lõpp-punkti. See ei mõjuta tulemust, sest ring jääb vahemikku −1 kuni 1.

2

Kõik võimalikud paarid

Järgmiseks paaritati iga x iga y-ga. Paar (x; y) on üks punkt ruudulisel paberil. Kui igal real on 410 arvu, tekib paare 410 × 410 = 168 100. Matemaatikas nimetatakse kõigi paaride hulka otsekorrutiseks ja kirjutatakse X × Y.

Päris võrk on nii tihe, et punktid sulavad halliks pinnaks. Vali hõredam samm, et näha, millest see koosneb:

410arvu kummaski reas
168 100paari ehk punkti

Tähtis on see: ringi punktid on juba kuskil selle võrgu sees olemas. Midagi ei pea juurde joonistama, tuleb ainult õiged punktid välja sorteerida.

3

Reegel, mis ütleb „jah“ või „ei“

Iga punkti kohta küsitakse üks küsimus:

kas x² + y² on täpselt 1?

Miks just see? Pythagorase teoreemi järgi on x² + y² punkti kauguse ruut keskpunktist. Kui see on 1, on punkt keskpunktist täpselt ühe ühiku kaugusel. Ring ongi kõigi selliste punktide kogum, mis on keskpunktist ühekaugusel.

Proovi ise

Klõpsa võrgul või kirjuta arvud kastidesse. Punkt nihkub lähimale võrgupunktile.

Punkt (0,7; 0,7) on nõks: see paistab ringi peal olevat, aga summa on 0,98. Reegel on range ja „peaaegu“ ei lähe arvesse.

4

Sõel: kõik punktid ükshaaval läbi

Nüüd tuleb märkmiku süda. Arvuti võtab paarid järjest ette, ühe kaupa, ja esitab igaühele sama küsimuse. Kui vastus on „jah“, pannakse paar eraldi nimekirja, mille nimi märkmikus on seos. Kui „ei“, minnakse lihtsalt edasi.

praegu kontrollitav veergjuba kontrollitudleitud punkt
0punkti kontrollitud
0läbis reegli
Vajuta „Käivita sõel“.

Arvuti jaoks on see igav, aga väga lihtne töö: 168 100 korda sama küsimus. Inimene kulutaks sellele nädalaid, arvuti teeb selle hetkega.

5

Miks ainult 20 punkti, mitte terve ring?

Reegel nõudis, et summa oleks täpselt 1. Kahe komakohaga arvude seas on selliseid paare väga vähe. Need tulevad kahest tuntud täisnurksest kolmnurgast:

KolmnurkPunktArvutus
3–4–5(0,6; 0,8)0,36 + 0,64 = 1
7–24–25(0,28; 0,96)0,0784 + 0,9216 = 1
„lame“ juht(1; 0)1 + 0 = 1

Kui keerata need ümber ja vahetada märke, saab kokku täpselt 20 punkti. Kõik ülejäänud võrgupunktid on ringist natuke sees- või väljaspool.

Kui lubada reeglile väike viga, ehk küsida „kas x² + y² on umbes 1?“, ilmub ring nähtavale:

20punkti läbib reegli

Siit tuleb oluline õppetund: arvuti teeb täpselt seda, mida reegel ütleb. Liiga range reegel jätab välja peaaegu kõik, liiga lõdva reegli korral muutub joon paksuks vööks.

6

Sama asi koodina

Siin on märkmiku olulised read koos tõlkega tavakeelde. Abistavad print-käsud on välja jäetud, need olid vaid vahepealseks kontrolliks.

x = np.arange(-2, 2.1, 0.01).round(2)
y = np.arange(-2, 2.1, 0.01).round(2)

Tee kaks arvurida: −2-st kuni 2,1-ni sammuga 0,01. round(2) ümardab kahe komakohani, et ei tekiks arve nagu 0,6000000001.

pairs = list(product(x, y))
pairs_array = np.array(pairs)

Paarita iga x iga y-ga (otsekorrutis) ja pane tulemus tabelisse, kus on 168 100 rida ja 2 veergu.

seos = np.empty((0, 2))

Tee tühi nimekiri nimega seos. Sinna hakkavad kogunema sobivad paarid.

for paar in pairs_array:

Võta paarid ükshaaval ette. Järgmised read korduvad iga paari jaoks.

    if paar[0]**2 + paar[1]**2 == 1:

Küsi: kas x² + y² on täpselt 1? (paar[0] on x, paar[1] on y, **2 tähendab ruutu.)

        seos = np.append(seos, [paar], axis=0)

Kui jah, lisa see paar nimekirja seos lõppu.

fig = px.scatter(x=seos[:,0], y=seos[:,1])
fig.update_yaxes(scaleanchor="x", scaleratio=1)

Joonista leitud punktid. Teine rida teeb telgedel ühe ühiku ühepikkuseks, muidu näeks ring välja nagu muna.

7

Suur mõte: seos on reegliga valitud paarid

Diskreetses matemaatikas on seos lihtsalt mingi osa kõigist paaridest. Märkmikus leitud ring kirjutatakse nii:

R = { (x; y) ∈ X × Y | x² + y² = 1 }

Loe: „R on kõik need paarid, mille puhul x² + y² = 1“. Sama võttega saab leida ükskõik millise kujundi, vahetada tuleb ainult reeglit. Proovi:

0paari 168 100-st kuulub seosesse

Ehk lühidalt: tee kõik paarid, kontrolli igaüht reegliga, jäta alles sobivad. Just nii märkmik ringi leidis.