Решение уравнения 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)
- {
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д