Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
dobrý den, potřeboval bych do tohoto programu (Gauss-seidelova iterační metoda) zabudovat podmínku, aby se výpočet iterací ukončil, pokud již iterace spňují zadanou přesnost např. 0,0001. Jde o zápočtový projekt a neumím s tou přesností už týden pohnout. Vypadá to jednoduše, ale nedaří se mi tam tu podmínku zabudovat
Offline
Nemáš tam podmínku while nutnou k předčasnému ukončení:
for proměnná in struktura while podmínka do příkazy end do
nebo si můžeš vybrat tuto:
for proměnná from odkud by krok to kam while podmínka do příkazy end do
Možná, že máš jinou variantu, ale while by tam mělo být.
Offline
Moc jsem toho s tou podmínkou nevymyslel, ačkoliv se mi honí hlavou hodně myšlenek. Napadlo mě něco ve smyslu tohoto (viz rámeček v obrázku)-samozřejmě, že jen takhle to fungovat nebude. Prostě nevím jak odečíst složky dvou vektorů a následně je porovnat s tou přesností, ačkoliv jsem ten návod pro Maple ( na http://www.stud.fme.vutbr.cz) celý prošel (ne jenom dneska) tak nevím jak dál. Nečekám, že to za mě někdo naprogramuje, ale za jakýkoliv další krok kupředu budu rád.
Takže k té mojí základní myšlence:
nebo na to jdu úplně špatně?
Offline
Jdeš na to dobře, ale musíš myslet na to, že máš dvě smyčky v sobě vnořené.
Takže pokud není vnitřní smyčka ukončená, tak se vnější nedostane ke slovu, ale myslím, že to není tvůj případ (ta musí proběhnout kompletně).
Ještě je důležité porovnávat s absolutní hodnotou, to znamená, že
hodn:= abs( ... nějaký výpočet ... )
jinak by se mohlo stát, že výpočet by se mohl ukončit dříve, než bylo zamýšleno (hodn pokud by byla záporná, by byla menší než presnost).
Pokud vektor má 3 rozměry [x,y,z], pak jejich odchylku budeš porovnávat tak, že odečteš od sebe jednotlivé směry a jejich absolutní hodnoty sečteš. Tím zajistíš jejich shodu ve všech směrech.
vektor1: [x1,y1,z1]
vektor2: [x2,y2,z2]
Takže asi takto:
hodn:= abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2)
Maple neznám, takže se s tím budeš muset poprat sám. Ale takhle by to mělo fungovat.
Offline
jenže potřebuju porovnat se zadanou přesností rozdíly po jednotlivých složkách (tedy abslotutní hodnoty rozdílu) takže nemělo by to vypadat asi takto? :
for prom1 from 1 by 1 to maxIt while presnost<hodn1 and presnost<hodn2 and presnost < hodn3 do
hodn1:= abs(x1 - x2);
hodn2:=abs(y1 - y2) ;
hodn3:=abs(z1 - z2);
for prom2 ...do
end do;
end do;
problém je, že taky nějak špičkově maple neovládám a začínám se do toho zamotávat
Offline
Přesně takto, ale s podmínkou or.
Kdyby si dal and, pak by se cyklus ukončí když jedna z podmínek přestane platit (splní nastavenou přesnost).
Ty potřebuješ, aby všechny 3 podmínky splnily zadání.
Ještě, jak na to koukám, by byl výhodnější cyklus until, než while, ale to asi Maple neumí.
Podmínka While se testuje nejdřív (před tělem cyklu), until se testuje až po provedení těla cyklu což by bylo výhodnější.
Ale můžeme to nechat jak si to napsal.
Jenom bych pro jistotu nastavil jednu z proměnných hodn (třeba hodn1), na hodnotu mimo nastavenou přesnost, aby se nestalo, že by se vnější cyklus ukončil dřív než nastane.
hodn1:=1;
for prom1 from 1 by 1 to maxIt while presnost<hodn1 or presnost<hodn2 or presnost < hodn3 do
hodn1:=abs(x1 - x2);
hodn2:=abs(y1 - y2);
hodn3:=abs(z1 - z2);
for prom2 ...do
end do;
end do;
Jinak obecně platí, pokud je krok 1 (by 1), tak se nemusí zadávat. Pak by to mohlo být takto:
for prom1 from 1 to maxIt while presnost<hodn1 or presnost<hodn2 or presnost < hodn3 do
ale raději to vyzkoušej, zda nebude Maple hlásit chybu. Jinak s tím by 1 je to asi jednoznačnější.
Offline