Решение уравнения 4 степени - C#

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

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

Всем доброго времени суток. У меня есть задание - решить уравнение 4 степени вида x^4+a*x^3+b*x^2+c*x+d=0. Изначально преподавателем был предложен метод Феррари, но я не смог найти правильную математическую модель. Тогда было решено использовать какой-нибудь численный метод. В принципе, задача не очень сложная, если бы не одно "но" - корни комплексные, из чего вытекает куча неприятных последствий. В связи с этим очень прошу натолкнуть меня на какой-нибудь способ решения, возможно книжку или уже готовый код. Заранее огромное спасибо.

Решение задачи: «Решение уравнения 4 степени»

textual
Листинг программы
using System;
using System.Windows.Forms;
using System.Numerics;
 
namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AcceptButton = button2;
        }
       
 
        private void button2_Click_1(object sender, EventArgs e)
        {
            double a, b, c, d, ee, p, q, r, b1, c1, d1, p1, q1, Q, del;
            a = Convert.ToDouble(textBox1.Text);
            b = Convert.ToDouble(textBox5.Text);
            c = Convert.ToDouble(textBox6.Text);
            d= Convert.ToDouble(textBox7.Text);
            ee= Convert.ToDouble(textBox8.Text);
            b = b / a;
            c = c / a;
            d = d / a;
            ee = ee / a;
            a = 1;
 
            //              MessageBox.Show("X1=" + res1 + "\n X2=" + res2 + "\n X3=" + res3 + "\n X4=" + res4, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
            p = (8 * c - 3 * Math.Pow(b, 2)) / 8;
            q=(8*d+Math.Pow(b,3)-4*b*c)/8;
            r = (16 * Math.Pow(b, 2) * c - 64 * b * d - 3 * Math.Pow(b, 4) + 256 * ee) / 256;
            b1 = 2 * p;
            c1 = Math.Pow(p, 2) - 4 * r;
            d1 = -Math.Pow(q, 2);
            p1 = (3 * c1 - Math.Pow(b1, 2)) / 3;
            q1 = (2 * Math.Pow(b1, 3) - 9 * b1 * c1 + 27 * d1) / 27;
            Q = Math.Pow(p1 / 3, 3) + Math.Pow(q1 / 2, 2);
            Complex QQ, U, V, e1, e2, x1, x2, x3, y1, y2, y3, y4, pp1=0, pp2=0, pp3=0, pp4=0;
            Complex z1, z2, z3, j;
   //         double x11, x22, x33;
            j=Complex.ImaginaryOne;
            if (Q < 0)
            {
                double x11, x22, x33; 
                e1 = new Complex(-0.5, Math.Sqrt(3) / 2);
                e2 = Complex.Conjugate(e1);
                QQ = Complex.Sqrt(Q);
                del = q1 / 2;
                U = Complex.Pow(QQ - del, 1 / 3.0);
                V = Complex.Conjugate(U);
                z1 = U + V;
                z2 = e1 * U + e2 * V;
                z3 = e2 * U + e1 * V;
                x11 = z1.Real - b1 / 3;
                x22 = z2.Real - b1 / 3;
                x33 = z3.Real - b1 / 3;
                x1 = Complex.Sqrt(x11);
                x2 = Complex.Sqrt(x22);
                x3 = Complex.Sqrt(x33);
                if ((x1 * x2 * x3).Real < 0 | q < 0) { x1 = -x1; }
                if ((x1 * x2 * x3).Real > 0 | q > 0) { x1 = -x1; }
                y1 = 0.5 * (x1 + x2 + x3);
                y2 = 0.5 * (x1 - x2 - x3);
                y3 = 0.5 * (-x1 + x2 - x3);
                y4 = 0.5 * (-x1 - x2 + x3);
                pp1 = y1 - b / 4;
                pp2 = y2 - b / 4;
                pp3 = y3 - b / 4;
                pp4 = y4 - b / 4;
            }
            if (Q > 0)
            {
                Complex x11, x22, x33;
                U = -q1 / 2;
                V = Complex.Sqrt(Q);
                z1 = Complex.Pow(((U) + V), 1/3.0) + Complex.Pow((U - V), 1 / 3.0);
                z2 = -0.5 * (Complex.Pow((U + V), 1 / 3.0) + Complex.Pow((U - V), 1 / 3.0)) + j * Math.Sqrt(3) * 0.5 * (Complex.Pow((U + V), 0.3333333333333) - Complex.Pow((U - V), 0.3333333333333333));
                z3 = Complex.Conjugate(z2);
                x11 = z1 - b1 / 3;
                x22 = z2 - b1 / 3;
                x33 = z3 - b1 / 3;
                x1 = Complex.Sqrt(x11);
                x2 = Complex.Sqrt(x22);
                x3 = Complex.Sqrt(x33);
                if ((x1 * x2 * x3).Real < 0 | q < 0) { x1 = -x1; }
                if ((x1 * x2 * x3).Real > 0 | q>0) { x1 = -x1; }
                y1 = 0.5 * (x1 + x2 + x3);
                y2 = 0.5 * (x1 - x2 - x3);
                y3 = 0.5 * (-x1 + x2 - x3);
                y4 = 0.5 * (-x1 - x2 + x3);
                pp1 = y1 - b / 4;
                pp2 = y2 - b / 4;
                pp3 = y3 - b / 4;
                pp4 = y4 - b / 4;
            }
            if (Q==0)
            {
                double x11, x22, x33;  
              z1 = -Math.Pow(-(q / 2), 1 / 3.0);
              z2 = 2 * Math.Pow(-(q / 2), 1 / 3.0);
              x11 = z1.Real - b1 / 3;
              x22 = z2.Real - b1 / 3;
              x33 = 0;
              x1 = Complex.Sqrt(x11);
              x2 = Complex.Sqrt(x22);
              x3 = Complex.Sqrt(x33);
              if ((x1 * x2 * x3).Real < 0 | q < 0) { x1 = -x1; }
              if ((x1 * x2 * x3).Real > 0 | q > 0) { x1 = -x1; }
              y1 = 0.5 * (x1 + x2 + x3);
              y2 = 0.5 * (x1 - x2 - x3);
              y3 = 0.5 * (-x1 + x2 - x3);
              y4 = 0.5 * (-x1 - x2 + x3);
              pp1 = y1 - b / 4;
              pp2 = y2 - b / 4;
              pp3 = y3 - b / 4;
              pp4 = y4 - b / 4;
            }
            textBox2.Text = Convert.ToString(Math.Round(pp1.Real,5)) + "+i("+ Convert.ToString(Math.Round(pp1.Imaginary, 5)) +")";
            textBox3.Text = Convert.ToString(Math.Round(pp2.Real, 5)) + "+i(" + Convert.ToString(Math.Round(pp2.Imaginary, 5)) + ")";
            textBox4.Text = Convert.ToString(Math.Round(pp3.Real, 5)) + "+i(" + Convert.ToString(Math.Round(pp3.Imaginary, 5)) + ")";
            textBox9.Text = Convert.ToString(Math.Round(pp4.Real, 5)) + "+i(" + Convert.ToString(Math.Round(pp4.Imaginary, 5)) + ")";
           }
 
        private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ch = e.KeyChar;
 
            if (!Char.IsDigit(ch))
            {
                e.Handled = true;
            }
            if (e.KeyChar == ',')
                e.Handled = false;
            if (e.KeyChar == '-')
                e.Handled = false;
            if (e.KeyChar == (char)Keys.Back)
                e.Handled = false;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
    }
}

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


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

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

11   голосов , оценка 4 из 5