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

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

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

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

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

textual
Листинг программы
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Numerics;
  4.  
  5. namespace WindowsFormsApplication9
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         public Form1()
  10.         {
  11.             InitializeComponent();
  12.             AcceptButton = button2;
  13.         }
  14.        
  15.  
  16.         private void button2_Click_1(object sender, EventArgs e)
  17.         {
  18.             double a, b, c, d, ee, p, q, r, b1, c1, d1, p1, q1, Q, del;
  19.             a = Convert.ToDouble(textBox1.Text);
  20.             b = Convert.ToDouble(textBox5.Text);
  21.             c = Convert.ToDouble(textBox6.Text);
  22.             d= Convert.ToDouble(textBox7.Text);
  23.             ee= Convert.ToDouble(textBox8.Text);
  24.             b = b / a;
  25.             c = c / a;
  26.             d = d / a;
  27.             ee = ee / a;
  28.             a = 1;
  29.  
  30.             //              MessageBox.Show("X1=" + res1 + "\n X2=" + res2 + "\n X3=" + res3 + "\n X4=" + res4, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
  31.             p = (8 * c - 3 * Math.Pow(b, 2)) / 8;
  32.             q=(8*d+Math.Pow(b,3)-4*b*c)/8;
  33.             r = (16 * Math.Pow(b, 2) * c - 64 * b * d - 3 * Math.Pow(b, 4) + 256 * ee) / 256;
  34.             b1 = 2 * p;
  35.             c1 = Math.Pow(p, 2) - 4 * r;
  36.             d1 = -Math.Pow(q, 2);
  37.             p1 = (3 * c1 - Math.Pow(b1, 2)) / 3;
  38.             q1 = (2 * Math.Pow(b1, 3) - 9 * b1 * c1 + 27 * d1) / 27;
  39.             Q = Math.Pow(p1 / 3, 3) + Math.Pow(q1 / 2, 2);
  40.             Complex QQ, U, V, e1, e2, x1, x2, x3, y1, y2, y3, y4, pp1=0, pp2=0, pp3=0, pp4=0;
  41.             Complex z1, z2, z3, j;
  42.    //         double x11, x22, x33;
  43.             j=Complex.ImaginaryOne;
  44.             if (Q < 0)
  45.             {
  46.                 double x11, x22, x33;
  47.                 e1 = new Complex(-0.5, Math.Sqrt(3) / 2);
  48.                 e2 = Complex.Conjugate(e1);
  49.                 QQ = Complex.Sqrt(Q);
  50.                 del = q1 / 2;
  51.                 U = Complex.Pow(QQ - del, 1 / 3.0);
  52.                 V = Complex.Conjugate(U);
  53.                 z1 = U + V;
  54.                 z2 = e1 * U + e2 * V;
  55.                 z3 = e2 * U + e1 * V;
  56.                 x11 = z1.Real - b1 / 3;
  57.                 x22 = z2.Real - b1 / 3;
  58.                 x33 = z3.Real - b1 / 3;
  59.                 x1 = Complex.Sqrt(x11);
  60.                 x2 = Complex.Sqrt(x22);
  61.                 x3 = Complex.Sqrt(x33);
  62.                 if ((x1 * x2 * x3).Real < 0 | q < 0) { x1 = -x1; }
  63.                 if ((x1 * x2 * x3).Real > 0 | q > 0) { x1 = -x1; }
  64.                 y1 = 0.5 * (x1 + x2 + x3);
  65.                 y2 = 0.5 * (x1 - x2 - x3);
  66.                 y3 = 0.5 * (-x1 + x2 - x3);
  67.                 y4 = 0.5 * (-x1 - x2 + x3);
  68.                 pp1 = y1 - b / 4;
  69.                 pp2 = y2 - b / 4;
  70.                 pp3 = y3 - b / 4;
  71.                 pp4 = y4 - b / 4;
  72.             }
  73.             if (Q > 0)
  74.             {
  75.                 Complex x11, x22, x33;
  76.                 U = -q1 / 2;
  77.                 V = Complex.Sqrt(Q);
  78.                 z1 = Complex.Pow(((U) + V), 1/3.0) + Complex.Pow((U - V), 1 / 3.0);
  79.                 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));
  80.                 z3 = Complex.Conjugate(z2);
  81.                 x11 = z1 - b1 / 3;
  82.                 x22 = z2 - b1 / 3;
  83.                 x33 = z3 - b1 / 3;
  84.                 x1 = Complex.Sqrt(x11);
  85.                 x2 = Complex.Sqrt(x22);
  86.                 x3 = Complex.Sqrt(x33);
  87.                 if ((x1 * x2 * x3).Real < 0 | q < 0) { x1 = -x1; }
  88.                 if ((x1 * x2 * x3).Real > 0 | q>0) { x1 = -x1; }
  89.                 y1 = 0.5 * (x1 + x2 + x3);
  90.                 y2 = 0.5 * (x1 - x2 - x3);
  91.                 y3 = 0.5 * (-x1 + x2 - x3);
  92.                 y4 = 0.5 * (-x1 - x2 + x3);
  93.                 pp1 = y1 - b / 4;
  94.                 pp2 = y2 - b / 4;
  95.                 pp3 = y3 - b / 4;
  96.                 pp4 = y4 - b / 4;
  97.             }
  98.             if (Q==0)
  99.             {
  100.                 double x11, x22, x33;  
  101.               z1 = -Math.Pow(-(q / 2), 1 / 3.0);
  102.               z2 = 2 * Math.Pow(-(q / 2), 1 / 3.0);
  103.               x11 = z1.Real - b1 / 3;
  104.               x22 = z2.Real - b1 / 3;
  105.               x33 = 0;
  106.               x1 = Complex.Sqrt(x11);
  107.               x2 = Complex.Sqrt(x22);
  108.               x3 = Complex.Sqrt(x33);
  109.               if ((x1 * x2 * x3).Real < 0 | q < 0) { x1 = -x1; }
  110.               if ((x1 * x2 * x3).Real > 0 | q > 0) { x1 = -x1; }
  111.               y1 = 0.5 * (x1 + x2 + x3);
  112.               y2 = 0.5 * (x1 - x2 - x3);
  113.               y3 = 0.5 * (-x1 + x2 - x3);
  114.               y4 = 0.5 * (-x1 - x2 + x3);
  115.               pp1 = y1 - b / 4;
  116.               pp2 = y2 - b / 4;
  117.               pp3 = y3 - b / 4;
  118.               pp4 = y4 - b / 4;
  119.             }
  120.             textBox2.Text = Convert.ToString(Math.Round(pp1.Real,5)) + "+i("+ Convert.ToString(Math.Round(pp1.Imaginary, 5)) +")";
  121.             textBox3.Text = Convert.ToString(Math.Round(pp2.Real, 5)) + "+i(" + Convert.ToString(Math.Round(pp2.Imaginary, 5)) + ")";
  122.             textBox4.Text = Convert.ToString(Math.Round(pp3.Real, 5)) + "+i(" + Convert.ToString(Math.Round(pp3.Imaginary, 5)) + ")";
  123.             textBox9.Text = Convert.ToString(Math.Round(pp4.Real, 5)) + "+i(" + Convert.ToString(Math.Round(pp4.Imaginary, 5)) + ")";
  124.            }
  125.  
  126.         private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
  127.         {
  128.             char ch = e.KeyChar;
  129.  
  130.             if (!Char.IsDigit(ch))
  131.             {
  132.                 e.Handled = true;
  133.             }
  134.             if (e.KeyChar == ',')
  135.                 e.Handled = false;
  136.             if (e.KeyChar == '-')
  137.                 e.Handled = false;
  138.             if (e.KeyChar == (char)Keys.Back)
  139.                 e.Handled = false;
  140.         }
  141.  
  142.         private void Form1_Load(object sender, EventArgs e)
  143.         {
  144.  
  145.         }
  146.     }
  147. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут