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