Тригонометрическая формула Виета

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Тригонометрическая формула Виета — один из способов решения кубического уравнения

Первым решение этого уравнения нашел Никколо Тарталья, Джероламо Кардано опубликовал его решение в 1545 году под своим именем (см. формула Кардано). Однако формула Виета более удобна для практического применения:

Формула[править | править вики-текст]

  • Вычисляем
  • Вычисляем
  • Если , то вычисляем и имеем три действительных корня:
  • Если , то заменяем тригонометрические функции гиперболическими. Здесь возможны следующие случаи в зависимости от знака :
    • :
      (действительный корень)
      (пара комплексных корней)
    • :
      (действительный корень)
      (пара комплексных корней)
    • :
    (действительный корень)
    (пара комплексных корней)
  • Если , то уравнение вырождено и имеет меньше 3 различных решений (второй корень кратности 2):

Вывод формулы[править | править вики-текст]

  • Исходный многочлен имеет вид .
  • Подстановкой приводим многочлен к виду , где и .
  • Ищем решение уравнения в виде , получаем уравнение .
  • Заметим что в случае при это уравнение приобретает вид .
  • Используя тригонометрическое тождество приходим к уравнению вида .
  • Решение этого уравнения имеет вид , где пробегает значения 1, 2, 3.
  • Подставляя полученные значения в выражение для переменной , получаем ответ

Программа на языке C, находящая корни кубического многочлена в случае трёх действительных корней[править | править вики-текст]

#include <stdio.h>
#include <math.h>

int main(void)
{
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);

    // x*x*x + a*x*x + b*x + c == 0.0

    double p = b - a * a / 3.0;
    double q = 2.0 * a * a * a / 27.0 - a * b / 3.0 + c;
    double A = sqrt(- 4.0 * p / 3.0);

    double c3phi = - 4.0 * q / (A * A * A);

    double phi = acos(c3phi) / 3.0;

    double root1 = A * cos(phi) - a / 3.0;
    double root2 = A * cos(phi + 2 * M_PI / 3.0) - a / 3.0;
    double root3 = A * cos(phi - 2 * M_PI / 3.0) - a / 3.0;

    printf("%lf\n%lf\n%lf\n",root1,root2,root3);

    return 0;
}