NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Pythagorova Věta: pochopení odmocniny předpony C

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Helwa Surinen:14.1.2024 16:07

Co konkrétně ti nejde?

Zdravím všechny. Učím se sám tady na ITNetworku javu asi týden. A zaujal mě jeden příklad, a sice phytagorova věta (na toto cvičení jsem narazil na jiných stránkách). Ta je jasná co se týká matematiky. Ale co myslím není úplně jasné, jak by vypadal vzorec výpočtu předpony C bez té metody match. Ukážu skript, který jsem sesmolil a který si myslím asi půjde určitě zjednodušit. Ale jak jsem psal, učim se asi týden.

double obsahC = (a * a) + (b * b); asi půjde zjednodušit, myslím. A pak tam je zmíněné Match.sqrt. Jak by to vypadalo matematicky? Hledal jsem to na různých školních stránkách a sami pedagogové přímý vzorec neuvádí. Je to učivo základní školy, tehdy když jsme to braly byla velká násobilka a člověk si to musel buď pamatovat, nebo existovaly Tybulky. Sami učitelé znají jednu z praktik, odmocnit odhadem. Ale to u programování nikdy nemůže přeci platit. program potřebuje přesné zadání. Jak je to dnes nevím, jsem opravdu velmi mnoho let ze školy. Jaký máte názor?

Zkusil jsem: Co jsi již zkoušel?

package pythagoras;

import java.util.Scanner;
import java.nio.charset.StandardCharsets;

public class PythagorovaVeta {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8);
        System.out.println("Zadej předponu A : ");
        int a = Integer.parseInt(scanner.nextLine());
        System.out.println("Zadej předponu B : ");
        int b = Integer.parseInt(scanner.nextLine());
        double obsahC = (a * a) + (b * b);
        double predponaC = Math.sqrt(obsahC);
        System.out.println("Předpona C je dlouhá: " + predponaC + ", a obsah jejího čtverce činí: " + obsahC);
    }
}

Chci docílit: Čeho se snažíš dosáhnout?

Snažím se dosáhnout pochopení a spojení matematiky v programech.

 
Odpovědět
14.1.2024 16:07
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:14.1.2024 17:30

Máš v tom trochu zmatek.

  1. Jedná se o Pythagorovu větu
  2. Žádná předpona ale přepona
  3. Kratší strany se nazývají odvěsny
  4. Žádné match nepotřebuješ
  5. Pro výpočet délky přepony nepotřebuješ počítat obsah
  6. Obsah pravoúhlého trojúhelníku by se počítal (a*b)/2
  7. Pythagorova věta zni: Obsah čtverců nad přeponou pravouhleho trojúhelníku se rovná součtu obsahu čtverců nad oběma odvesnami. Tedy c2 = a2 + b2
  8. Pochybuji, že by se tato formulace nikde na stránkách s výukou matematiky nevyskytovala.
  9. Pochybuji, že výpočet odmocniny by učitelé řešili odhadem
  10. Pythagorova věta je natolik praktická věc že je dobré ji umět i dlouho že školy.

Z bodu číslo 7 si odvoď jak se vypočítá přepona c.

Nahoru Odpovědět
14.1.2024 17:30
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Helwa Surinen:14.1.2024 18:46

Asi jsem to napsal moc krkolomě. Pythagorova věta obsah ale potřebuje, na něm je to postavený. Zajímá mě jak by matematicky měl vypadat vzorec pro výpočet druhé odmocniny. A to Ti pedagogové neřeší. Nemyslím ten zvláštní znak pro odmocninu, ale - napíšu blbost: a + b = c. Takovej vzor myslím. Tento je špatně, samozřejmě. Jinak vím, že vzorec c2 = a2 + b2 je pythagorova věta, ale na to se neptám. Obsah pravouhleho trojuhelníku, tady Tě nechápu, to s tím vůbec nesouvisí. Já počítám obsah čtverce a z něho odmocninu pro uhlopříčku, jak to říká pyth. věta. Jinak jsem ze školy opravdu dlouho asi 35 let, tak se nemohu pamatovat všechno.

Editováno 14.1.2024 18:48
 
Nahoru Odpovědět
14.1.2024 18:46
Avatar
Helwa Surinen:14.1.2024 19:04

Krásnej článek, jak vypočítat odmocninu ručně je tady: Jak vypočítat odmocninu bez kalkulačky . I si to částečně pamatuji ze školy. Ale pořád mi to neodpovídá na otázku. Jak programátoři různých jazyků vytvořili metodu, v tomto případě Match.sqrt. Jinými slovy, jak přišli na nějaký vzorec, podle kterého to počítají. Ať už v javě, nebo i v jiných jazycích?

 
Nahoru Odpovědět
14.1.2024 19:04
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:14.1.2024 19:04

Ano, z definice Pythagorovy věty se používají obsahy které vzniknou nad přeponou a odvěsnami. Je mezi nimi vztah který jsem popsal v bodě 7. Jinak obsahy nemají žádný praktický význam.

Odmocňování v matematice je částečně inverzní operací k umocňování. **Druhá odmocnina z čísla x je takové nezáporné číslo a, pro které platí a2 = x.

Počítat obsah čtverce nad přeponou pravoúhlého trojúhelníku vůbec nemusíš, nemá to praktický význam. Jediný smysl kdy to má je pokud chceš zjistit délku jedné odvěsny, pokud znáš délku druhé odvěsny a délku přepony.

Nahoru Odpovědět
14.1.2024 19:04
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:14.1.2024 19:08

Jak vypočítat druhou odmocninu pomocí metody opakovaného půlení intervalu jsem psal v diskuzi zde (psáno v C):
Druhá odmocnina

Nahoru Odpovědět
14.1.2024 19:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Helwa Surinen:14.1.2024 19:13

(a + b) / 2.0? To nemůže přece platit?

 
Nahoru Odpovědět
14.1.2024 19:13
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:14.1.2024 19:21

Vytváření funkcí pro výpočet odmocnin, jako je Math.sqrt v jazyce Java, obvykle vychází z matematických principů, jako je například Newtonova metoda pro výpočet odhadu odmocniny. Newtonova metoda je iterativní numerická metoda, která konverguje k řešení rovnice. Obecně se algoritmy pro výpočet odmocniny snaží aproximovat hodnotu odmocniny pomocí opakovaných kroků, které postupně konvergují k přesnějším odhadům.

Zde je příklad jednoduché implementace v Javě:

public class Main {
    public static void main(String[] args) {
        double x = 16.0;
        double epsilon = 0.0001;
        double result = squareRoot(x, epsilon);
        System.out.println("Odmocnina z " + x + " je přibližně: " + result);
    }

    public static double squareRoot(double x, double epsilon) {
        double guess = x / 2;
        while (Math.abs(guess * guess - x) > epsilon) {
            guess = (guess + x / guess) / 2;
        }
        return guess;
    }
}
Nahoru Odpovědět
14.1.2024 19:21
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:14.1.2024 19:26

(a + b) / 2.0? To nemůže přece platit?

Však to také není konečný výsledek ale počáteční nastavení středu intervalu.. A v cyklu se pak mění krajní meze a i nastavuje nová pozice středu.

Nahoru Odpovědět
14.1.2024 19:26
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Helwa Surinen:14.1.2024 19:39

Dneska to vzdávám. PS: už mi to nemyslí, jsem od půlčtvrtý na nohou. Napřed projdu nějakou výuku, a pak se k tomuto tématu vrátím. Já Ti vůbec nerozumím, co píšeš. jen bych řekl, ta metoda přibližného odhadu, kterou jsi poskytl je na mě už složitej skript, i když ji nějak intuitivně chápu. Ale nedokáži si z ní odvodit laicky, jak bych na papíru vypočítal odmocninu. Potřebuji si zopakovat matematiku, scriptem mi to nemůžeš vysvětlit. Ale bylo to fajn diskuse. usmívá se Zjistil jsem, i když to tak nevypadá, nejsem zas tak blbej po těch letech.

Editováno 14.1.2024 19:40
 
Nahoru Odpovědět
14.1.2024 19:39
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:14.1.2024 19:42

Analyzuj si na papíru metodu opakovaného půlení intervalu. Z té pochopíš jak to funguje..

Nahoru Odpovědět
14.1.2024 19:42
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Helwa Surinen:15.1.2024 7:32

Usínal jsem s odmocňováním v hlavě usmál se. Ale no posuď sám, viz komenty ve Tvém příkladu:

public class NewtonovaMetoda {
    public static void main(String[] args) {
        double x = 10.0;            // číslo, které odmocňujeme
        double epsilon = 0.0001;    // koeficient odchylky, nula by měla dát přesný výsledek
        // ale ne u čísel, kde není jasný celý výsledek. Např. 9 ano, 10 ne. Proto se domnívám
        // koeficient epsilon musí mít nějakou hodnotu, aby vznikl přibližný výsledek
        double result = squareRoot(x, epsilon);
        System.out.println("Odmocnina z " + x + " je přibližně: " + result);
    }
    public static double squareRoot(double x, double epsilon) {
        double guess = x / 2;   // guess -> z angl. odhad vydělíme dvěma
        while (Math.abs(guess * guess - x) > epsilon) { // opakovací cyklus
            // Metoda abs() vrátí absolutní hodnotu čísla
            guess = (guess + x / guess) / 2;    //
        }
        return guess;
    }
}

Tak, vyzkoušel jsem si tři různé způsoby odmocnění čísla 10. První tímto Newtonovým půlením a výsledek je při koeficientu epsilon 0.0001: 3.1622776604441363.
Druhý pomocí metody Match.sqrt: 3.1622776601683795.
A třetí pomocí windows kalkulačky, což je: 3,162277660168379

Všimněme si jemných rozdílů. Každý způsob domnívám se, používá pro výpočet malinko jiný koeficient epsilon. A tím mi to vlastně též odpovídá na můj původní dotaz. I když bys řekl, že to není použití odhadu, přesto se ten odhad při půlení intervalu v podstatě používá. Jinými slovy, nikdy nedocílíme u všech různých čísel přesnou odmocninu. U jasných čísel typu 9 ano, pokud dosadím do epsilon nulu. Ale u čísel typu 10 to už nebude fungovat. Proto tam musí být nějaký koeficient epsilon s nějakou minimální hodnotou. Je to tak DarkCodere? Ale zajímavé je, když použiji číslo 9, odmocniny se změní. Match.sqrt a kalkulačka vyhodí výsledek 3 a Tvůj skript přibližný výsledek 3.000015360039322. Což mě vedek myšlence, že Match.sqrt a windows kalkulačka mají v sobě varianty pro čísla násobilky, která se dají dobře odmocnit (nevím, jak je pojmenovat ajťácky).
Pak jsi na začátku psal, v bodě 4., že žádný Match nepotřebuji. Jak jsi to myslel? Jde o to, nějak mám za ty roky v hlavě zakodováno, čím kratší zápis skriptu, tím optimálnější a šetrnější pro chod počítače. Když nepoužiji Match, tím bude script delší, obsáhlejší a zabere více paměti. Přemýšlím správně?
V každém případě jsi mi velmi pomohl, půlení intervalem jsem asi pochopil a celou otázku odmocnin asi také. Ale hlavně jsi mi ukázal jeden krásný příklad, jak učit lidi. Sám jsem takto učil grafiku. Nedávat odpověď přímo s výsledkem, ale studente, musíš se snažit a učit se a hlavně hledat. To se mi líbí DarkCodere, dobrej přístup a palec nahoru.

 
Nahoru Odpovědět
15.1.2024 7:32
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:15.1.2024 12:36

Co si před spaním přečteš, to v hlavě zůstane.😀

Ano, že každý způsob používá odlišnou odchylku (epsilon), je jisté. Stanovení odchylky udává přesnost a čas potřebný k dosažení dané přesnosti. Někdy je třeba preciznost, někdy rychlost. Programátor si pak může zvolit to co uzná za vhodné. Určitý odhad se používá. Když zvolíš vhodný interval, bude výpočet trvat kratší dobu, ale také se nemusíš dopídit výsledku. Je tedy důležité jaký způsob se zvolí. Newtonova metoda konverguje rychleji ale může selhat. Naproti tomu bisekční metoda je robustnější, ale konerguje k výsledku pomaleji. Nikdy se nenastavuje epsilon na 0 neboť by pak výpočet nefungoval napříč pozitivními reálnými čísly.

Přistroje mají nějakou přesnost, třeba to že se tam vejde 12 cifer. Proto epsilon je nastaven tak aby se to počítalo pro tuto šíři. Pokud je odlišnost až za velikostí displeje, může se zobrazit jako celé číslo, ikdyž tomu tak ve skutečnosti není.

Bod 4, tím jsem měl na mysli že není match ale Math. Nejspíš u tebe došlo k automatické korekci textu. Jinak integrované matematické funkce můžeš určitě používat, jsou optimalizované.

To mě těší že jsem Ti pomohl a porozuměl si jak to asi tak funguje. Klidně pak označ příspěvek jako řešení tvého dotazu. On celý proces vysvětlení je samozřejmě o dost složitější. To proč si tomu porozuměl bylo dáno i tvým zájmem. V úvodním dotazu jsem jen opravil správné formulace a nasměřoval správným směrem. Ale to nejdůležitější bylo drobné pojednání o problému a poté ukázkové příklady. Tedy rovnou řešení. Pokud chceme po někom, abychom viděli co se naučil, je třeba to dotyčnému správně předat a ujistit se že to chápe. Ne ho v tom nechat plavat ať si na to přijde sám. Proč ztrácet čas. Ne nadarmo mám dodatek o poučkách u svých příspěvků. Vím co je důležité aby to druhý pochopil a jak to podat. Věř tomu, že nejvíc Ti pomohl ty dva ukázkové příklady na odmocniny, kde pak na jeden jsem tě odkázal s papírovou analýzou. Bisekční metoda je velmi snadno pochopitelná a je na ni vidět to jak to funguje, jak výsledek konverguje víc a víc k požadované hodnotě. Díky za ocenění!

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
15.1.2024 12:36
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Helwa Surinen:15.1.2024 14:05

Děkuji Ti. A dodám. Už včera večer jsem googlil podle Tvých rad témata newtonova metoda a opakované půlení intervalu. To co mi vyšlo by se dalo říct je asi vysokoškolské učivo matematiky. A také se to schodovalo částečně s výukou rozkladu odmocněného čísla středoškolské matematiky. Co mě vlastně pomohlo nejvíc je, že jsem se na to vyspal a pak nalezená učiva na tato témata (Ale vysvětlena neprogramátorsky, více laicky), které jsem vygooglil. Ano, nasměroval si mě správným směrem.

Také mi celá naše konverzace ukázala ještě jeden poznatek. Je dobrý si po sobě přečíst, co píšu, aby nedocházelo k omylu. Viz například překlepy predpona/prepona, match/Math a tak dále. A také slovník, jakým se zde mluví. Já jsem se snaži psát jako laik, což byl záměr. A Ty jsi zvolil odpovědi jako programátor. To je dobré vnímat. A dobré se tak učit rovnou myslet. Díky.

 
Nahoru Odpovědět
15.1.2024 14:05
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Helwa Surinen
DarkCoder:15.1.2024 14:35

Máš zápal pro věc, snahu řešit a pochopit. To he dobře. Ano, na střední škole pro tohle není prostor, tam se učí jak to používat. Pokud se ale chceme posouvat, je třeba dané věci chápat více do hloubky. Únava a pocity dělají své, spánek může skutečně nakopnout.

Nejsem příznivcem matematických zápisů. Preferuji lidské vysvětlení do maximálního detailu a programátorské pro finální podobu. Jinak i já píšu překlepy a ne vždy si to co napíšu zpětně projdu. Tomu co jsi psal jsem porozuměl, přesto jsem napsal to aby si příliš neodbočil od toho čeho si chtěl dosáhnout.

Když něco tvořím, rovnou si představuji postupy a kód v hlavě. Detaily samozřejmě ladím průběžně.

A nyní trochu motivace. Pochopení jak funguje výpočet odmocniny dává možnost optimalizaci. Představ si v grafice výpočet vzdáleností mezi body. Bodu máme obrovské množství. Jak užitečné může být napsat si vlastní funkci s menší přesností, která postačuje, než použít vestavěnou funkci která je sice skvělá, ale pro nás je prioritou čas nikoli extrémní přesnost. Šance že ušetříme několik FPS je velká a takovéto ušetření procesoroveho času může být pro aplikaci zásadní.

Nahoru Odpovědět
15.1.2024 14:35
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Helwa Surinen:15.1.2024 17:22

Ano v blenderu, nebo illustratoru takovej plugin hodne pomuze 😀

 
Nahoru Odpovědět
15.1.2024 17:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.