Stránka 1 z 1

c# Gaussova eliminační metoda

Napsal: ned 4. zář 2011, 18:48
od lelekdk
chtěl bych si napsat program a vlastní řešení (výpočet) bych chtěl řešit pomocí Gaussovo eliminační metody. Programy na to jsou, takže to určitě jde. Spíše jestli to zvládne někdo, kdo se teprve v c# učí.

jako zadání jsem si našel středoškolskou analytiku, kde se měla najít kružnice daná 3 Body (tedy sestaví se 3 rovnice o třech neznámých). Tento příklad mi přijde ideální pro Gaussovo eliminační metodu.

na vstupu programu by se měly vyplnit souřadnice bodů: (celkem 6 hodnot – do txtBoxu)
K (x1 , y1)
L (x2 , y2)
M (x3 , y3)
Hodnoty X a Y se vyplní do 6 txtBoxu
následně se sestaví 3 rovnice o 3 neznámých
x2 + y2 + Ax + By + C = 0 (vzor obecné rovnice kružnice, z které budeme vycházet)
X a Y známe - z Bodů
A, B, C - neznámé, které hledáme

tyto neznámé bych chtěl vypsat do labelu

cvičné zadání
K (10,2), L(0,4), M(-2,-6)
x2 + y2 si převedeme na druhou stranu rovnice (takže nám zůstanou neznámé A B C na jedné straně = hodnota (číslo) na druhé straně)
pro ukázku zadání a výpočtu přikládám screen:
Obrázek
C = -32
B = 4
A = -8
Obecná rovnice pak vypadá takto:
x2 + y2 -8x + 4y -32 = 0
zdroj obráku:
http://maths.cz/clanky/gaussova-eliminacni-metoda.html
určitě to nebude moc náročné, spíše nemám jen potřebné znalosti.
Následně dopočítat souřadnice středu, poloměr atd. to už pak bude easy pokud budu znát A B C.

Ošetření podmínky, že body nesmí tvořit přímku, tak to beru jako samozřejmost.

díky za rady případně za postup/návod

Re: c# Gaussova eliminační metoda

Napsal: ned 4. zář 2011, 22:33
od Maranov
Krásný sloh, nejsem si jistý, na co se vlastně ptáš.

Gaussova eliminace na PC? Numerické řešení soustavy lineárních rovnic bych radši prováděl iteracemi. Třeba Gauss-Seidelovou metodou - aproximuješ výsledek, dokud nedosáhneš potřebné přesnosti.

Nevím, kde vidíš problém, prostě musíš k řádkům přičítat vhodné násobky jiných řádků, dokud nedostaneš trojúhelníkový tvar (i.e. musíš přičítat tak, aby jsi ho dostal), problém je, nemusí to vždy mít řešení. Měl bych pěkné skripta, ale nemůžu je šířit, možná menší citaci. Přijde ti to těžké, protože to je těžké. Není to vůbec vhodné pro PC.

Postupoval bych prostě jak "na papíře", odshora, vhodně přičteš 1 rovnici k druhé, druhou k třetí... až k poslední a pak v další iteraci znovu. Do toho vždy kontroluj, zda jsi nezískal nekonečně mnoho či žádné řešení, stejně jako potřebný trojúhelníkový tvar - jedno existující řešení.

Nebo možná vzít první rovnici a použít ji k eliminaci té dané neznámé ve všech řádcích níže. Stejně tak vzít druhou a použít ji k eliminaci všech neznámých č.2 níže. To by snad šlo udělat efektivně v jednom cyklu - dobrý postup, řekl bych. Tak to dělá i ten skript.

Re: c# Gaussova eliminační metoda

Napsal: ned 4. zář 2011, 23:31
od lelekdk
ono spíše moc nevím jak to napsat v c#, protože na papíře udělám některé úkony mnohem snáze než to napsat obecně v c#, tedy říct aplikaci vezmi tohle a udělej s tím tohle.

nad srovnávací metodou jsem přemýšlel, protože v konečném zadání budu mít pouze 3 rovnice o třech neznámých (gaussova metoda s úpravou na trojúhelníkový tvar by pak měla fungovat na x rovnic což zase akutně nepotřebuji - jen mi to příjde jako jednoduší, protože ji používám poměrně často na podobné problemy). Ta srovnávací metoda je asi něco jiného než jsi asi myslel ty. to co popisuješ, to bys mi mohl poradit jak by vypadal ten cyklus?

Re: c# Gaussova eliminační metoda

Napsal: pon 5. zář 2011, 00:12
od Maranov
Co je dobré na papíře, nemusí být dobré v počítači. Většinou je to naopak.

Jestli budeš mít jen 3 rovnice, tak se na to normálně vykašli a použij Sarrusovo pravidlo. Získáš relativně jednoduchý výraz a vypočítáš determinant nerozšířené matice (bez pravých stran).

Pak aplikuješ Cramerovo pravidlo - zjistíš vždy determinant matice s nahrazeným jistým sloupcem sloupcem pravých stran a dopočítáš neznámou.

Napadá mě řešit to třeba vytvořením funkce, která z matice (double[][]) navrátí determinant (double ZískejDeterminant(double[][] matice)), pomocí Sarrusova pravidla, ignorujíc sloupec navíc (pravé strany). Můžeš pak prohodit sloupec s neznámou a sloupec pravých stran a zase zavolat funkci a získat tak onen "det Ai", následně to vrátit zpět a prohodit další. Vydělením původním determinantem, bez prohozených sloupců získáš vždy potřebnou neznámou.

Re: c# Gaussova eliminační metoda

Napsal: pon 5. zář 2011, 15:11
od lelekdk
díky za pomoc, už mi to počítá tak jak to má počítat. Následný zápis byl pak poměrně jednoduchý.