Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek
|
W naszym serwisie jest nowszy artykuł o obliczaniu pierwiastków funkcji: "Metody numeryczne".
SPIS TREŚCI |
Podrozdziały |
Równanie sześcienne posiada następującą postać:
Algorytm znajdowania pierwiastków takiego równania jest dużo bardziej skomplikowany niż dla równania kwadratowego.
Wyznaczamy trzy współczynniki f, g i h wg wzorów:
W zależności od wartości wyliczonych współczynników rozróżniamy trzy przypadki:
Jeśli h > 0,
pierwiastek wyliczamy ze wzoru:
W przypadku f = 0 i g = 0 równanie posiada pierwiastek potrójny (tzn. trzy pierwiastki o tej samej wartości). Wartość pierwiastka wyznaczamy ze wzoru:
W tym przypadku wyznaczamy kolejne współczynniki pomocnicze i, j, k, m, n i p:
Gdy współczynniki pomocnicze są obliczone, pierwiastki równania otrzymujemy ze wzorów:
Przykład:
Dla przykładu obliczymy pierwiastki trzech równań sześciennych:
Równanie 1:
Ponieważ h > 0, zatem równanie posiada tylko jeden pierwiastek rzeczywisty:
Równanie 2:
Ponieważ współczynniki f i g są równe 0, równanie posiada pierwiastek potrójny:
Równanie 3:
Ponieważ h < 0, zachodzi przypadek trzech pierwiastków rzeczywistych. Najpierw obliczamy współczynniki pomocnicze:
Teraz obliczamy kolejne niewiadome:
a,b,c,d | – | współczynniki równania ax3 + bx2 + cx + d = 0. a,b,c,d ∈ R |
x1, x2, x3 | – | poszukiwane pierwiastki oraz informacja o ich liczbie i typie: jeden pierwiastek rzeczywisty, pierwiastek potrójny i trzy pierwiastki rzeczywiste. |
i,j,k,m,n,p | – współczynniki pomocnicze i, j, k, m, n, p ∈ R |
ε | – określa dokładność porównania z zerem. ε = 0.0000000001 |
Ponieważ algorytm jest dosyć rozbudowany obliczeniowo, zrezygnowaliśmy z publikowania jego schematu blokowego, który w sumie jest prosty, lecz rozległy. Podajemy jedynie listę kroków. Wyjaśnienie wykonywanych operacji znajdzie czytelnik na początku tego rozdziału.
K01: | Czytaj a, b, c, d |
K02: | Jeśli
| a
| < ε, to pisz "To nie jest równanie sześcienne" i zakończ |
K03: | Oblicz współczynniki pomocnicze:![]() |
K04: | Jeśli
| f
| < ε ∧
|
g | < ε, to idź do kroku K09 |
K05: | Jeśli h
≥
ε, to idź do kroku K11 |
K06: | Oblicz współczynniki pomocnicze:![]() |
K07: | Oblicz pierwiastki:![]() |
K08: | Pisz "Trzy pierwiastki rzeczywiste",
x1, x2,
x3 i zakończ |
K09: | Oblicz pierwiastki:![]() |
K10: | Pisz "Pierwiastek potrójny",
x1,
x2, x3 i zakończ |
K11: | Oblicz pierwiastek:![]() |
K12: | Pisz "Jeden pierwiastek rzeczywisty",
x1 i zakończ |
Programy wczytują wartości współczynników a, b, c i d a następnie wyznaczają, o ile jest to możliwe, pierwiastki równania sześciennego o wprowadzonych współczynnikach.
C++// Program rozwiązuje równanie sześcienne //--------------------------------------- // (C)2006 mgr J.Wałaszek I LO w Tarnowie #include <iostream> #include <iomanip> #include <cmath> #include <cstdlib> using namespace std; const double EPS = 0.0000000001; // dokładność porównania z zerem // funkcja wylicza pierwiastek 3 stopnia //-------------------------------------- inline double qrt(double x) { return fabs(x) < EPS ? 0 : (x > 0 ? exp(log(x)/3) : -exp(log(-x)/3)); } //----------------------------------------------------- // Program główny //----------------------------------------------------- int main() { double a,b,c,d,f,g,h,i,j,k,m,n,p,x1,x2,x3; cout << setprecision(5) // 5 cyfr po przecinku << fixed; // format stałoprzecinkowy cout << "Demonstracja rozwiazywania rownania szesciennego:\n" "ax^3 + bx^2 + cx + d = 0\n" "-------------------------------------------------\n" "(C)2006 mgr Jerzy Walaszek I LO w Tarnowie\n\n" "Podaj kolejno wspolczynniki a, b, c i d:\n\n"; cout << "a = "; cin >> a; cout << "b = "; cin >> b; cout << "c = "; cin >> c; cout << "d = "; cin >> d; cout << "\n-------------------------------------------------\n\n" "WYNIKI:\n\n"; if(fabs(a) < EPS) cout << "To nie jest rownanie szescienne\n"; else { // Obliczamy współczynniki pomocnicze f,g i h f = (c - b*b/3/a)/a; g = ((2*b*b/9/a - c)/a*b/3 + d)/a; h = g*g/4 + f*f*f/27; // Sprawdzamy kolejne warunki if((fabs(f) < EPS) && (fabs(g) < EPS)) { // Pierwiastek potrójny x1 = x2 = x3 = - qrt(d/a); cout << "Pierwiastek potrojny:\n" "\nx1 = " << setw(12) << x1 << "\nx2 = " << setw(12) << x2 << "\nx3 = " << setw(12) << x3 << endl; } else if(h >= EPS) { // Jeden pierwiastek rzeczywisty x1 = qrt(-g/2 + sqrt(h)) + qrt(-g/2 - sqrt(h)) - b/3/a; cout << "Jeden pierwiastek rzeczywisty:\n\n" "x1 = " << setw(12) << x1 << endl; } else { // Trzy pierwiastki rzeczywiste i = sqrt(g*g/4 - h); j = qrt(i); k = acos(-g/2/i); m = cos(k/3); n = sqrt(3)*sin(k/3); p = -b/3/a; x1 = 2*j*m + p; x2 = -j*(m + n) + p; x3 = -j*(m - n) + p; cout << "Trzy pierwiastki rzeczywiste:\n" "\nx1 = " << setw(12) << x1 << "\nx2 = " << setw(12) << x2 << "\nx3 = " << setw(12) << x3 << endl; } } cout << "\n------------------------------------------------\n\n"; system("pause"); return 0; } |
Pascal// Program rozwiązuje równanie sześcienne //--------------------------------------- // (C)2006 mgr J.Wałaszek I LO w Tarnowie program mzfk2; uses math; const EPS = 0.0000000001; // dokładność porównania z zerem // funkcja wylicza pierwiastek 3 stopnia //-------------------------------------- function qrt(x : real) : double; begin if abs(x) < EPS then Result := 0 else Result := sign(x)*exp(ln(abs(x))/3); end; //----------------------------------------------------- // Program główny //----------------------------------------------------- var a,b,c,d,f,g,h,i,j,k,m,n,p,x1,x2,x3 : double; begin writeln('Demonstracja rozwiazywania rownania szesciennego:'); writeln('ax^3 + bx^2 + cx + d = 0'); writeln('-------------------------------------------------'); writeln('(C)2006 mgr Jerzy Walaszek I LO w Tarnowie'); writeln; writeln('Podaj kolejno wspolczynniki a, b, c i d:'); writeln; write('a = '); readln(a); write('b = '); readln(b); write('c = '); readln(c); write('d = '); readln(d); writeln; writeln('-------------------------------------------------'); writeln; writeln('WYNIKI:'); writeln; if abs(a) < EPS then writeln('To nie jest rownanie szescienne') else begin // Obliczamy współczynniki pomocnicze f,g i h f := (c - b*b/3/a)/a; g := ((2*b*b/9/a - c)/a*b/3 + d)/a; h := g*g/4 + f*f*f/27; // Sprawdzamy kolejne warunki if (abs(f) < EPS) and (abs(g) < EPS) then begin // Pierwiastek potrójny x1 := - qrt(d/a); x2 := x1; x3 := x1; writeln('Pierwiastek potrojny:'); writeln; writeln('x1 = ',x1:12:5); writeln('x2 = ',x2:12:5); writeln('x3 = ',x3:12:5); end else if h >= EPS then begin // Jeden pierwiastek rzeczywisty x1 := qrt(-g/2 + sqrt(h)) + qrt(-g/2 - sqrt(h)) - b/3/a; writeln('Jeden pierwiastek rzeczywisty:'); writeln; writeln('x1 = ',x1:12:5); end else begin // Trzy pierwiastki rzeczywiste i := sqrt(g*g/4 - h); j := qrt(i); k := arccos(-g/2/i); m := cos(k/3); n := sqrt(3)*sin(k/3); p := -b/3/a; x1 := 2*j*m + p; x2 := -j*(m + n) + p; x3 := -j*(m - n) + p; writeln('Trzy pierwiastki rzeczywiste:'); writeln; writeln('x1 = ',x1:12:5); writeln('x2 = ',x2:12:5); writeln('x3 = ',x3:12:5); end; end; writeln; writeln('-------------------------------------------------'); writeln('Koniec. Nacisnij klawisz Enter...'); readln; end. |
Basic' Program rozwiązuje równanie sześcienne '--------------------------------------- ' (C)2006 mgr J.Wałaszek I LO w Tarnowie Declare Function qrt(x As Double) As Double Const EPS As Double = 0.0000000001 ' dokładność porównania z zerem '----------------------------------------------------- ' Program główny '----------------------------------------------------- Dim As double a, b, c, d, f, g, h, i, j, k, m, n, p, x1, x2, x3 Print "Demonstracja rozwiazywania rownania szesciennego:" Print "ax^3 + bx^2 + cx + d = 0" Print "-------------------------------------------------" Print "(C)2006 mgr Jerzy Walaszek I LO w Tarnowie" Print Print "Podaj kolejno wspolczynniki a,b,c i d:" Print Input "a = ", a Input "b = ", b Input "c = ", c Input "d = ", d Print Print "-------------------------------------------------" Print Print "WYNIKI:" Print If Abs(a) < EPS Then print "To nie jest rownanie szescienne" Else ' Obliczamy współczynniki pomocnicze f, g i h f = (c - b * b / 3 / a) / a g = ((2 * b * b / 9 / a - c) / a * b / 3 + d) / a h = g * g / 4 + f * f * f / 27 ' Sprawdzamy kolejne warunki If (Abs(f) < EPS) And (Abs(g) < EPS) Then ' Pierwiastek potrójny x1 = -qrt(d / a) x2 = x1 x3 = x1 print "Pierwiastek potrojny:" Print print Using "x1 = ######.#####"; x1 print Using "x2 = ######.#####"; x2 print Using "x3 = ######.#####"; x3 ElseIf h >= EPS Then ' Jeden pierwiastek rzeczywisty x1 = qrt(-g / 2 + Sqr(h)) + qrt(-g / 2 - Sqr(h)) - b / 3 / a print "Jeden pierwiastek rzeczywisty:" Print print Using "x1 = ######.#####"; x1 Else ' Trzy pierwiastki rzeczywiste i = Sqr(g * g / 4 - h) j = qrt(i) k = ACos(-g / 2 / i) m = Cos(k / 3) n = Sqr(3) * Sin(k / 3) p = -b / 3 / a x1 = 2 * j * m + p x2 = -j * (m + n) + p x3 = -j * (m - n) + p Print "Trzy pierwiastki rzeczywiste:" Print print Using "x1 = ######.#####"; x1 print Using "x2 = ######.#####"; x2 print Using "x3 = ######.#####"; x3 End If End If Print Print "-------------------------------------------------" Print Print "Koniec. Nacisnij klawisz Enter..." Sleep End ' funkcja wylicza pierwiastek 3 stopnia '-------------------------------------- Function qrt(x As Double) As Double If Abs(x) < EPS Then qrt = 0 Else qrt = Sgn(x) * Exp(Log(Abs(x)) / 3) End If End Function |
JavaScript<html> <head> </head> <body> <div align="center"> <form style="BORDER-RIGHT: #ff9933 1px outset; PADDING-RIGHT: 4px; BORDER-TOP: #ff9933 1px outset; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: #ff9933 1px outset; PADDING-TOP: 1px; BORDER-BOTTOM: #ff9933 1px outset; BACKGROUND-COLOR: #ffcc66" name="frmbincode"> <h3 style="TEXT-ALIGN: center"> Demonstracja rozwiązywania równania sześciennego </h3> <p style="TEXT-ALIGN: center"> <i>ax<sup>3</sup> + bx<sup>2</sup> + cx + d = 0</i> </p> <p style="TEXT-ALIGN: center"> (C)2006 mgr Jerzy Wałaszek I LO w Tarnowie </p> <hr> <p style="text-align: center"> Wpisz do pól edycyjnych kolejne współczynniki równania </p> <div align="center"> <table border="0" id="table144" cellpadding="8" style="border-collapse: collapse"> <tr> <td> a = <input type="text" name="wsp_a" size="10" value="1" style="text-align: right"> </td> <td> b = <input type="text" name="wsp_b" size="10" value="-6" style="text-align: right"> </td> <td> c = <input type="text" name="wsp_c" size="10" value="11" style="text-align: right"> </td> <td> d = <input type="text" name="wsp_d" size="10" value="-6" style="text-align: right"> </td> <td> <input type="button" value="Rozwiąż" name="B1" onclick="main()"> </td> </tr> </table> </div> <div id="out" align=center>...</div> </form> <script language=javascript> // Program rozwiązuje równanie sześcienne //--------------------------------------- // (C)2006 mgr J.Wałaszek I LO w Tarnowie var EPS = 0.0000000001; // dokładność porównania z zerem // funkcja wylicza pierwiastek 3 stopnia //-------------------------------------- function qrt(x) { return Math.abs(x) < EPS ? 0 : (x > 0 ? Math.exp(Math.log(x)/3) : -Math.exp(Math.log(-x)/3)); } //----------------------------------------------------- // Program główny //----------------------------------------------------- function main() { var a,b,c,d,f,g,h,i,j,k,m,n,p,x1,x2,x3,t; a = parseFloat(document.frmbincode.wsp_a.value); b = parseFloat(document.frmbincode.wsp_b.value); c = parseFloat(document.frmbincode.wsp_c.value); d = parseFloat(document.frmbincode.wsp_d.value); if(isNaN(a) || isNaN(b) || isNaN(c) || isNaN(d)) t = "<font color=red><b>Nieprawidłowe współczynniki!</b></font>"; else if(Math.abs(a) < EPS) t = "<font color=red><b>To nie jest równanie sześcienne</b></font>"; else { // Obliczamy współczynniki pomocnicze f,g i h f = (c - b*b/3/a)/a; g = ((2*b*b/9/a - c)/a*b/3 + d)/a; h = g*g/4 + f*f*f/27; // Sprawdzamy kolejne warunki if((Math.abs(f) < EPS) && (Math.abs(g) < EPS)) { // Pierwiastek potrójny x1 = x2 = x3 = - qrt(d/a); t = "Pierwiastek potrojny:<BR><BR>" + "x<sub>1</sub> = " + x1 + "<BR>" + "x<sub>2</sub> = " + x2 + "<BR>" + "x<sub>3</sub> = " + x3; } else if(h >= EPS) { // Jeden pierwiastek rzeczywisty x1 = qrt(-g/2 + Math.sqrt(h)) + qrt(-g/2 - Math.sqrt(h)) - b/3/a; t = "Jeden pierwiastek rzeczywisty:<BR><BR>" + "x<sub>1</sub> = " + x1; } else { // Trzy pierwiastki rzeczywiste i = Math.sqrt(g*g/4 - h); j = qrt(i); k = Math.acos(-g/2/i); m = Math.cos(k/3); n = Math.sqrt(3)*Math.sin(k/3); p = -b/3/a; x1 = 2*j*m + p; x2 = -j*(m + n) + p; x3 = -j*(m - n) + p; t = "Trzy pierwiastki rzeczywiste:<BR><BR>" + "x<sub>1</sub> = " + x1 + "<BR>" + "x<sub>2</sub> = " + x2 + "<BR>" + "x<sub>3</sub> = " + x3; } } document.getElementById("out").innerHTML = t; } </script> </div> </body> </html> |
Wynik: |
Demonstracja rozwiązywania
równania sześciennego: ax^3 + bx^2 + cx + d = 0 ------------------------------------------------- (C)2006 mgr Jerzy Wałaszek I LO w Tarnowie Podaj kolejno współczynniki a,b,c i d: a = 1 b = -6 c = 11 d = -6 ------------------------------------------------- WYNIKI: Trzy pierwiastki rzeczywiste: x1 = 3,00000 x2 = 1,00000 x3 = 2,00000 ------------------------------------------------- Koniec. Naciśnij klawisz Enter... |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.