Równanie sześcienne


Tematy pokrewne

Algorytm

Równanie sześcienne posiada następującą postać:

 

ax3 + bx2 + cx + d = 0,  a ≠ 0

 

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:

  1. h > 0 - tylko jeden pierwiastek rzeczywisty (pozostałe dwa są zespolone - liczbami zespolonymi nie zajmujemy się w liceum).
  2. f = 0, g = 0 - pierwiastek potrójny.
  3. W pozostałym przypadku mamy trzy pierwiastki rzeczywiste.

Jeden pierwiastek rzeczywisty

Jeśli h > 0, pierwiastek wyliczamy ze wzoru:

 

Pierwiastek potrójny

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:

 

Trzy pierwiastki rzeczywiste

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:

 

x1 = 2jm + p

x2 = -j(m + n) + p

x3 = -j(m - n) + p

 

Przykład:

Dla przykładu obliczymy pierwiastki trzech równań sześciennych:

 

x3 - 5x2 + 8x - 6 = 0

 

a = 1,  b = -5,  c = 8,  d = -6

 

Ponieważ h > 0, zatem równanie posiada tylko jeden pierwiastek rzeczywisty:

 

 

 

x3 - 6x2 + 12x - 8 = 0

 

a = 1,  b = -6,  c = 12,  d = -8

 

Ponieważ współczynniki f i g są równe 0, równanie posiada pierwiastek potrójny:

 

 

 

x3 - 6x2 + 11x - 6 = 0

 

a = 1,  b = -6,  c = 11,  d = -6


 

Ponieważ h < 0, zachodzi przypadek trzech pierwiastków rzeczywistych. Najpierw obliczamy współczynniki pomocnicze:

 






 

Teraz obliczamy kolejne niewiadome:

 



 

Dane wejściowe

a,b,c,d - współczynniki równania ax3 + bx2 + cx + d = 0. a,b,c,d R

Dane wyjściowe

x1, x2, x3 - poszukiwane pierwiastki oraz informacja o ich liczbie i typie: jeden pierwiastek rzeczywisty, pierwiastek potrójny i trzy pierwiastki rzeczywiste.

Zmienne pomocnicze i funkcje

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

 

Lista kroków

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 f, g i h:
            
K04: Jeśli | f | < ε  ∧  | g | < ε, to idź do K09
K05: Jeśli hε, to idź do K11
K06: Oblicz współczynniki pomocnicze i, j, k, m, n i p:

       

       

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

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.

 

Efekt uruchomienia programu
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...

 

Free 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.
Code::Blocks
// 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;
}
FreeBASIC
' 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>

 

Tutaj możesz przetestować działanie prezentowanego skryptu:

Demonstracja rozwiązywania równania sześciennego

ax3 + bx2 + cx + d = 0

(C)2006 mgr Jerzy Wałaszek I LO w Tarnowie


Wpisz do pól edycyjnych kolejne współczynniki równania

a = b = c = d =
...


List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.