Výpočet řešení kvadratické rovnice

Algoritmy Matematické Výpočet řešení kvadratické rovnice

Budeme řešit kvadratickou rovnici tvaru ax2+ bx + c = 0 v oboru reálných čísel pomocí diskriminantu.

Nejdříve zadáme z klávesnice koeficienty a (kvadratický člen),b (lineární člen), c (absolutní člen) a podmínkou ošetříme následující případy :

1) a = 0, b = 0, c = 0 (všechny koeficienty jsou nulové)

  • Řešením je každé reálné číslo.

 

2) a != 0 (kvadratický člen je různý od nuly)

Pokud se b nebo c rovná nule, kvadratická rovnice je neúplná, ale lze ji spočítat. Rovnice má jedno, dvě nebo žádné řešení. Počet řešení vypočítáme pomocí diskriminantu a zanedbáme, že by to šlo v případě nulových koeficientů b a c malinko rychleji (už takhle je tam těch podmínek dost :) Kdyby to někomu vadilo, není problém upravit)

d = b2– 4ac.

Pokud je d > 0, rovnice má 2 řešení :

  • x1 = (-b - sqrt(b2– 4ac)) / 2a
  • x2 = (-b +  sqrt(b2– 4ac)) / 2a

Pokud je d = 0, rovnice má jedno řešení :

  • x  = ( -b + sqrt(b2– 4ac)) / 2a

V případě d < 0:

  • Rovnice nemá v oboru reálných čísel řešení.

 

3) a = 0 (kvadratický člen je nulový)

Bez kvadratického členu se nejedná o kvadratickou rovnici. Může jít buď o rovnici lineární nebo to rovnice vůbec není.

3a) b != 0 (b je různé od nuly)

Jedná se o lineární rovnici a řešením je : x = -c / b

3b) b = 0 (b je nulové)

Není to rovnice, není třeba řešit.

 

 

Vývojový diagram

Vývojový diagram hledání řešení kvadratické rovnice

Zdrojový kód [PASCAL]

uses crt;
var a,b,c,x1,x2,d : real;
                          { vyznam promennych : a,b,c . . . koeficienty
                                                x1,x2 . . . koreny rovnice
                                                d . . . . . diskriminant     }

begin
 clrscr;
 { ************************** zadavani koeficientu ************************* }
 writeln('Zadejte prosim koeficienty kvadraticke rovnice: ');
 write('a : ');
 readln(a);
 write('b : ');
 readln(b);
 write('c : ');
 readln(c);
 { *********************** osetreni koeficientu a vypocet ********************* }
 if (a = 0) and (b = 0) and (c = 0) then begin
  writeln('Toto neni kvadraticka rovnice');
  write('Vsechna realna cisla jsou resenim.');
 end else
 if (a = 0) then begin
  if (b <> 0) then
   write('Rovnice je linearni: x = ',-c/b);
    else
     write('Toto neni rovnice!');
 end else
 begin
  d:=sqr(b) - (4 * a * c);
  if (d > 0) then begin
   x1:=(-b - sqrt(sqr(b) -4 * a * c)) / (2 * a);
   x2:=(-b + sqrt(sqr(b) -4 * a * c)) / (2 * a);
   writeln('Rovnice ma dve reseni : x1 = ',x1);
   writeln('                        x2 = ',x2);
  end else
  if (d = 0) then begin
   x1:=(-b - sqrt(sqr(b) -4 * a * c)) / (2 * a);
   writeln('Rovnice ma jedno reseni : x = ',x1);
  end else
  writeln('Rovnice nema reseni v oboru realnych cisel');
 end;
end.

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (3 hlasů) :
4.333334.333334.333334.33333 4.33333


 


Miniatura
Předchozí článek
Výpočet libovolné mocniny
Miniatura
Všechny články v sekci
Matematické algoritmy
Miniatura
Následující článek
Hornerovo schéma

 

 

Komentáře

Avatar
Riokai
Neregistrovaný
Avatar
Riokai:

Tak tohleto je opravdu hooodně složité :D ... Pokusím se o to v C# ... trošku mám problém s podmínkami řešení :D

 
Odpovědět 8.10.2010 11:29
Avatar
sdraco
Tým ITnetwork
Avatar
Odpovídá na Riokai
sdraco:

Ano, je to napsané tak, aby počítač počítal vždy jen to, co musí, čili trochu více podmínek, ale vyšší kvalita. Na druhou stranu to řeší jen v oboru reálných čísel, což je zase značné ulehčení. Nazval bych to průměrným příkladem, vždyť je to jen pár podmínek :)

Odpovědět 9.10.2010 21:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
zdeny
Neregistrovaný
Avatar
zdeny:

podle me je to spatne, pokud je D=0, pak je vzorec -b/2a, a dalsi cyhby tam sou! Funguje to spravne v programu?

 
Odpovědět 9.12.2010 13:04
Avatar
sdraco
Tým ITnetwork
Avatar
Odpovídá na zdeny
sdraco:

Ahoj, to co píšeš je pravda, ale není důvod, proč by nefungoval klasický vzorec pro x12, i když je zbytečně složitý.
Nepleteš si nulové d s nulovým a? :)

Odpovědět 9.12.2010 14:47
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
vendula
Neregistrovaný
Avatar
vendula:

Myslíš, že bych mohla použít Tvůj vývojový diagram ve svém textu? Je krásně dořešený a hodil by se mi pro studenty do C#.:)
Nerada bych ho kradla, i chtěla bych Tvé svolení.

 
Odpovědět 13.11.2012 11:01
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na vendula
David Čápka:

Pokud v textu uvedeš odkaz na http://www.devbook.cz a bude to pro studijní účely, není to problém.

Odpovědět 13.11.2012 19:41
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matthias
Neregistrovaný
Avatar
matthias:

Myslím, že řádek

if (d = 0) then begin
x1:=(-b - sqrt(sqr(b) -4 * a * c)) / (2 * a);
writeln('Rovnice ma jedno reseni : x = ',x1);

není možný, protože nelze dělit nulou. Myslím, že to hodí akorát run-time error 207

 
Odpovědět 18.11.2012 20:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na matthias
Kit:

A kde máš to dělení nulou?

Odpovědět 18.11.2012 20:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Nevím jestli nás učili v matice blbě, ale proč by nebyl výraz a2 + c rovnice?
EDIT: jo už to vidím :)

Editováno 19.11.2012 15:09
 
Odpovědět 19.11.2012 15:08
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na David Čápka
Zdeněk Pavlátka:
x1:=(-b - sqrt(sqr(b) -4 * a * c)) / (2 * a);

není důvod, proč by nefungoval klasický vzorec pro x12, i když je zbytečně složitý...

Ano, klasický vzorec pro x12 bude fungovat, ale zbytečně počítáš odmocninu z nuly... a ještě tu nulu (D) počítáš, ačkoli jsi ji chvíli před tím porovnával v podmínce (totéž platí u D > 0, D už máš, ale počítáš ho 2× znovu)
To úplně nesedí k tvému prvnímu komentáři:

Ano, je to napsané tak, aby počítač počítal vždy jen to, co musí...

Odpovědět 5. října 10:31
Kolik jazyků umíš, tolikrát jsi programátor.
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 10 zpráv z 10.