Применение формулы Виета для решения кубических уравнений - C#

Узнай цену своей работы

Формулировка задачи:

Ребята, всем привет. И не знаю, что делать. Мне нужно написать программу, которая находит корни кубического уравнения, я находил методы решения. Вита, Кардано и т.д., но все-таки ближе всего как мне кажется метод Виета. Причем, почему-то на разных сайтах, метод "переделанный". Больше всего интересует то, что в онлайн калькуляторах просят ввести значения a, b, c, d. В методе Виета, само выражение выглядит так: , но в решении задания по этой формуле, применяются только значения a, b, c, куда делось d?: . Я где-то читал, что первое значение x^3, попросту равняется единице! Но мне нужно написать калькулятор, где требовалось бы задавать значения всем переменным (a, b, c, d), и тут я наткнулся на один сайт, где есть то, что мне нужно, точнее само выражение (чуть отличается, чем на Википедии, хоть это и тоже метод Виета), в нем первое значение не единица по умолчанию, а число, которое я задам в переменной, и присутствует элемент d, но снова в самой формуле, я не нашел его применения.

В общем нужна ваши догадки, аргументы и т.д. Буду очень благодарен за вашу помощь!

Коды, которые я писал, ориентируясь на эти сайты:

С Википедии:

static void Main(string[] args)
        {
            Console.Write("Введите А ");
            int a = Int32.Parse(Console.ReadLine());
            Console.Write("Введите В ");
            int b = Int32.Parse(Console.ReadLine());
            Console.Write("Введите C ");
            int c = Int32.Parse(Console.ReadLine());
            double Q = (Math.Pow(a, 2) - 3 * b) / 9;
            double R = (2 * Math.Pow(a, 3) - 9 * a * b + 27 * c) / 54;
            double S = Math.Pow(Q, 3) - Math.Pow(R, 2);
            double fi;
            double x1;
            double x2;
            double x3;
            //double x23;
            double i = Math.Sqrt(-1);
            double v1 = -2 * Math.Sign(R) * Math.Sqrt(Q) - a / 3;
            double v2 = Math.Sign(R) * Math.Sqrt(Q) - a / 3;
            {
                if (S > 0)
                {
                    fi = 1 / 3 * Math.Acos(R / Math.Sqrt(Math.Pow(Q, 3)));
                    x1 = -2 * Math.Sqrt(Q) * Math.Cos(fi) - a / 3;
                    x2 = -2 * Math.Sqrt(Q) * Math.Cos(fi + 2 / 3 * Math.PI) - a / 3;
                    x3 = -2 * Math.Sqrt(Q) * Math.Cos(fi - 2 / 3 * Math.PI) - a / 3;
                    Console.WriteLine(x1);
                    Console.WriteLine(x2);
                    Console.WriteLine(x3);
                }
                else
                {
                    if (Q > 0)
                    {
                        fi = 1 / 3 * Math.Log(Math.Abs(R) / Math.Sqrt(Math.Pow(Q, 3))) + Math.Sqrt(Math.Pow(Math.Abs(R) / Math.Sqrt(Math.Pow(Q, 3)), 2) - 1);
                        x1 = -2 * Math.Sign(R) * Math.Sqrt(Q) * 2 / (Math.Exp(fi) - Math.Exp(-fi)) - a / 3;
                        //x23 = Math.Sign(R) * Math.Sqrt(Q) * 2 / (Math.Exp(fi) - Math.Exp(-fi)) - a / 3 + -i * Math.Sqrt(3) * Math.Sqrt(Q) * 2 / (Math.Exp(fi) + Math.Exp(-fi));
                        Console.WriteLine("Действительный корень x1= " + x1);
                        //Console.WriteLine("Пара комплексных корней (x2,3)" + x23);
                    }
                    else
                    {
                        fi = 1 / 3 * Math.Log(Math.Abs(R) / Math.Sqrt(Math.Abs(Q)), 3);
                        x1 = -2 * Math.Sign(R) * Math.Sqrt(Math.Abs(Q)) * 2 / (Math.Exp(fi) + Math.Exp(-fi)) - a / 3;
                        //x23 = Math.Sign(R) * Math.Sqrt(Math.Abs(Q)) * 2 / (Math.Exp(fi) + Math.Exp(-fi)) - a / 3 + -i * Math.Sqrt(3) * Math.Sqrt(Math.Abs(Q)) * 2 / (Math.Exp(fi) - Math.Exp(-fi));
                        Console.WriteLine("Действительный корень x1=" + x1);
                        //Console.WriteLine("Пара комплексных корней (x2,3)" + x23);
                    }
                }
            }
 
            if (S == 0)
            {
                x1 = v1 = -2 * Math.Pow(Math.Sqrt(R), 3) - a / 3;
                x2 = v2 = Math.Pow(Math.Sqrt(R), 3) - a / 3;
                Console.WriteLine(x1);
                Console.WriteLine(x2);
            }
            //else
            //{ Console.Write("Система не имеет решений"); }
            Console.ReadKey();
        }

С Calc.ru:

static void Main(string[] args)
        {
            double a, b, c, fi, x1, x2, x3;
            Console.Write("Введите А ");
            a = Double.Parse(Console.ReadLine());
            Console.Write("Введите B ");
            b = Double.Parse(Console.ReadLine());
            Console.Write("Введите C ");
            c = Double.Parse(Console.ReadLine());
            double Q = (Math.Pow(a, 2)) / 9;
            double R = (2 * Math.Pow(a, 3) - 9 * a * b + 27 * c) / 54;
            double S = Math.Pow(Q, 3) - Math.Pow(R, 3);
            if (S > 0)
            {
                fi = (Math.Acos(R / Math.Pow(Q, 3 / 2))) / 3;
                x1 = -2 * Math.Pow(Q, 1 / 2) * Math.Cos(fi) - a / 3;
                x2 = -Math.Pow(Q, 1 / 2) * Math.Cos(fi + (2 * Math.PI) / 3);
                x3 = -Math.Pow(Q, 1 / 2) * Math.Cos(fi - (2 * Math.PI) / 3);
                Console.WriteLine("Уравнение имеет 3 вещественных корня:" + " x1= " + x1 + " x2= " + x2 + " x3= " + x3);
            }
            else if(S < 0) 
            {
                fi = (Math.Log((Math.Abs(R) / Math.Pow(Math.Abs(Q), 3 / 2) / 3) + Math.Pow((Math.Pow((Math.Abs(R) / Math.Pow(Math.Abs(Q), 3 / 2) / 3), 2) - 1), 1 / 2), Math.E)) / 3;
                x1 = -2 * Math.Sign(R) * Math.Pow(Math.Abs(Q), 1 / 2) * (Math.Exp((Math.Abs(R) / Math.Pow(Math.Abs(Q), 3 / 2) / 3)) + Math.Exp(-(Math.Abs(R) / Math.Pow(Math.Abs(Q), 3 / 2) / 3)) / 2) - a / 3;
                Console.WriteLine("Уравнение имеет 1 вещественный корень:" + " x1= " + x1);
            }
            else if (S == 0)
            {
                x1 = -2 * Math.Pow(R, 1 / 3) - a / 3;
                x2 = x3 = Math.Pow(R, 1 / 3) - a / 3;
                Console.WriteLine("Уравнение имеет 2 вещественных корня:" + " x1= " + x1 + " x2= " + x2);
            }
            Console.ReadKey();
        }

Решение задачи: «Применение формулы Виета для решения кубических уравнений»

textual
Листинг программы
            Console.Write("Введите А ");
            double firstCoef = Double.Parse(Console.ReadLine()); // здесь и ниже заменил double на int
            Console.Write("Введите В ");
            double a = Double.Parse(Console.ReadLine()) / firstCoef;
            Console.Write("Введите C ");
            double b = Double.Parse(Console.ReadLine()) / firstCoef;
            Console.Write("Введите D ");
            double c = Double.Parse(Console.ReadLine()) / firstCoef;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы