Решение уравнения 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)
{
}
}
}