Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public partial class Form1 : Form
- {
- public class Matrix
- {
- int w = 0;
- int h = 0;
- double[,] v;
- public Matrix(int width, int height, double[,] a)
- {
- w = width; h = height;
- v = new double[h, w];
- for (int i = 0; i < h; i++)
- for (int j = 0; j < w; j++)
- v[i, j] = a[i, j];
- }
- public Matrix(Matrix m)
- {
- w = m.w; h = m.h;
- v = new double[h, w];
- for (int i = 0; i < h; i++)
- for (int j = 0; j < w; j++)
- v[i, j] = m.v[i, j];
- }
- static public Matrix operator +(Matrix a, Matrix b)
- {
- if ((a.w == b.w) && (a.h == b.h))
- {
- Matrix t = new Matrix(a);
- for (int i = 0; i < a.h; i++)
- for (int j = 0; j < a.w; j++)
- t.v[i, j] += b.v[i, j];
- return t;
- }
- else
- {
- return new Matrix(0, 0, new double[0, 0]);
- }
- }
- static public Matrix operator -(Matrix a, Matrix b)
- {
- if ((a.w == b.w) && (a.h == b.h))
- {
- Matrix t = new Matrix(a);
- for (int i = 0; i < a.h; i++)
- for (int j = 0; j < a.w; j++)
- t.v[i, j] -= b.v[i, j];
- return t;
- }
- else
- {
- return new Matrix(0, 0, new double[0, 0]);
- }
- }
- static public Matrix operator *(Matrix a, double d)
- {
- Matrix t = new Matrix(a);
- for (int i = 0; i < a.h; i++)
- for (int j = 0; j < a.w; j++)
- t.v[i, j] *= d;
- return t;
- }
- static public Matrix operator *(double d, Matrix a)
- {
- Matrix t = new Matrix(a);
- for (int i = 0; i < a.h; i++)
- for (int j = 0; j < a.w; j++)
- t.v[i, j] *= d;
- return t;
- }
- static public Matrix operator *(Matrix a, Matrix b)
- {
- if ((a.w == b.h))
- {
- Matrix t = new Matrix(b.w, a.h, new double[a.h, b.w]);
- for (int i = 0; i < a.h; i++)
- for (int j = 0; j < b.w; j++)
- {
- double u = 0;
- for (int k = 0; k < a.w; k++)
- u += a.v[i, k] * b.v[k, j];
- t.v[i, j] = u;
- }
- return t;
- }
- else
- {
- return new Matrix(0, 0, new double[0, 0]);
- }
- }
- public Matrix T()
- {
- Matrix t = new Matrix(h, w, new double[w, h]);
- for (int i = 0; i < h; i++)
- for (int j = 0; j < w; j++)
- t.v[j, i] = v[i, j];
- return t;
- }
- public string print(Matrix a = null)
- {
- string s = "";
- int l = 0;
- for (int i = 0; i < h; i++)
- {
- s += '(';
- for (int j = 0; j < w; j++)
- {
- s += (Convert.ToDecimal(Math.Round(v[i, j], 15))).ToString();
- for (int k = 1; k <= (26 - (Convert.ToDecimal(Math.Round(v[i, j], 15))).ToString().Length); k++)
- {
- s += " ";
- l = k;
- }
- }
- s = s.Remove(s.Length - l * 2);
- s += ')';
- for (int k = 1; k <= l; k++)
- s += " ";
- if (a != null)
- {
- s += '\t';
- s += '(';
- for (int j = 0; j < a.w; j++)
- {
- s += (Convert.ToDecimal(Math.Round(a.v[i, j], 7))).ToString();
- for (int k = 1; k <= (18 - (Convert.ToDecimal(Math.Round(a.v[i, j], 7))).ToString().Length); k++)
- {
- s += " ";
- l = k;
- }
- }
- s = s.Remove(s.Length - l * 2);
- s += ')';
- }
- s += '\n';
- }
- return s;
- }
- public double N1()
- {
- double d = 0;
- for (int j = 0; j < w; j++)
- d += Math.Abs(v[0, j]);
- for (int i = 1; i < h; i++)
- {
- double s = 0;
- for (int j = 0; j < w; j++)
- s += Math.Abs(v[i, j]);
- if (s > d) d = s;
- }
- return d;
- }
- public double N2()
- {
- double d = 0;
- if (w == 1)
- {
- for (int i = 0; i < h; i++)
- d += v[i, 0] * v[i, 0];
- }
- else if (h == 1)
- {
- for (int j = 0; j < w; j++)
- d += v[0, j] * v[0, j];
- }
- return Math.Sqrt(d);
- }
- public double N8()
- {
- double d = 0;
- for (int i = 0; i < h; i++)
- d += Math.Abs(v[i, 0]);
- for (int j = 1; j < w; j++)
- {
- double s = 0;
- for (int i = 0; i < h; i++)
- s += Math.Abs(v[i, j]);
- if (s > d) d = s;
- }
- return d;
- }
- public void Gauss(Matrix b)
- {
- Matrix A = new Matrix(3, 3, v);
- Matrix An = new Matrix(3, 3, v);
- Matrix bo = new Matrix(1, 3, b.v);
- (Application.OpenForms[0] as Form1).richTextBox2.Text += "Метод Гаусса:" + '\n' + "Прямой ход:" + '\n';
- for (int i = 0; i < h; i++)
- {
- for (int j = i; j < w; j++)
- {
- v[i, j] = v[i, j] / An.v[i, i];
- if (j == i) b.v[i, 0] = b.v[i, 0] / An.v[i, i];
- (Application.OpenForms[0] as Form1).richTextBox2.Text +=
- print(b) + '\n';
- for (int k = i + 1; k < h; k++)
- {
- v[k, j] = v[k, j] - An.v[k, i] * v[i, j];
- if (i == j) b.v[k, 0] = b.v[k, 0] - An.v[k, i] * b.v[i, 0];
- (Application.OpenForms[0] as Form1).richTextBox2.Text += print(b) + '\n';
- }
- }
- An = new Matrix(3, 3, v);
- }
- (Application.OpenForms[0] as Form1).richTextBox2.Text += "Обратный ход:" + '\n';
- double[,] vector = new double[3, 1];
- double s = 0;
- for (int i = 2; i >= 0; i--)
- {
- for (int j = i + 1; j <= 2; j++)
- s += v[i, j] * vector[j, 0];
- vector[i, 0] = b.v[i, 0] - s;
- s = 0;
- }
- Matrix Ans = new Matrix(1, 3, vector);
- (Application.OpenForms[0] as Form1).richTextBox2.Text += Ans.print() + '\n';
- (Application.OpenForms[0] as Form1).richTextBox2.Text += "Вектор невязки:" + '\n';
- double[,] mist = new double[3, 1];
- Matrix R = new Matrix(1, 3, mist);
- R = A * Ans - bo;
- (Application.OpenForms[0] as Form1).richTextBox2.Text += R.print() + '\n';
- }
- public void GaussColumn(Matrix b)
- {
- double max = v[0, 0];
- double zb = b.v[0, 0];
- double[,] zm = new double[1, w];
- Matrix z = new Matrix(w, 1, zm);
- for (int i = 0; i < w; i++)
- z.v[0, i] = v[0, i];
- int m = 0;
- (Application.OpenForms[0] as Form1).richTextBox3.Text += "Метод Гаусса с выбором по столбцу:" + '\n';
- for (int j = 0; j < h - 1; j++)
- {
- max = v[j, j];
- for (int i = j; i < w; i++)
- {
- if (v[i, j] > max)
- {
- max = v[i, j];
- m = i;
- }
- }
- for (int k = 0; k < w; k++)
- z.v[0, k] = v[m, k];
- zb = b.v[m, 0];
- for (int k = 0; k < w; k++)
- v[m, k] = v[j, k];
- b.v[m, 0] = b.v[j, 0];
- for (int k = 0; k < w; k++)
- v[j, k] = z.v[0, k];
- b.v[j, 0] = zb;
- (Application.OpenForms[0] as Form1).richTextBox3.Text += print(b) + '\n';
- }
- Matrix A = new Matrix(3, 3, v);
- Matrix An = new Matrix(3, 3, v);
- Matrix bo = new Matrix(1, 3, b.v);
- (Application.OpenForms[0] as Form1).richTextBox3.Text += "Прямой ход:" + '\n';
- for (int i = 0; i < h; i++)
- {
- for (int j = i; j < w; j++)
- {
- v[i, j] = v[i, j] / An.v[i, i];
- if (j == i) b.v[i, 0] = b.v[i, 0] / An.v[i, i];
- (Application.OpenForms[0] as Form1).richTextBox3.Text += print(b) + '\n';
- for (int k = i + 1; k < h; k++)
- {
- v[k, j] = v[k, j] - An.v[k, i] * v[i, j];
- if (i == j) b.v[k, 0] = b.v[k, 0] - An.v[k, i] * b.v[i, 0];
- (Application.OpenForms[0] as Form1).richTextBox3.Text += print(b) + '\n';
- }
- }
- An = new Matrix(3, 3, v);
- }
- (Application.OpenForms[0] as Form1).richTextBox3.Text += "Обратный ход:" + '\n';
- double[,] vector = new double[3, 1];
- double s = 0;
- for (int i = 2; i >= 0; i--)
- {
- for (int j = i + 1; j <= 2; j++)
- s += v[i, j] * vector[j, 0];
- vector[i, 0] = b.v[i, 0] - s;
- s = 0;
- }
- Matrix Ans = new Matrix(1, 3, vector);
- (Application.OpenForms[0] as Form1).richTextBox3.Text += Ans.print() + '\n';
- (Application.OpenForms[0] as Form1).richTextBox3.Text += "Вектор невязки:" + '\n';
- double[,] mist = new double[3, 1];
- Matrix R = new Matrix(1, 3, mist);
- R = A * Ans - bo;
- (Application.OpenForms[0] as Form1).richTextBox3.Text += R.print() + '\n';
- }
- public void det()
- {
- Matrix A = new Matrix(3, 3, v);
- Matrix An = new Matrix(3, 3, v);
- double d = 1;
- string s = "";
- (Application.OpenForms[0] as Form1).richTextBox4.Text += "Определитель:" + '\n' + "Приведем к виду верхнетреугольной матрицы с помощью метода Гаусса:" + '\n';
- for (int n = 0; n < h; n++)
- {
- for (int i = n; i < h; i++)
- {
- for (int j = n; j < w; j++)
- {
- v[i, j] = v[i, j] / An.v[i, n];
- }
- (Application.OpenForms[0] as Form1).richTextBox4.Text += print() + '\n';
- d *= An.v[i, n];
- if ((Convert.ToDecimal(Math.Round(An.v[i, n], 10))).ToString()[0] == '-') s += '(' + (Convert.ToDecimal(Math.Round(An.v[i, n], 10))).ToString() + ')' + " * ";
- else s += (Convert.ToDecimal(Math.Round(An.v[i, n], 10))).ToString() + " * ";
- }
- An = new Matrix(3, 3, v);
- for (int j = 0; j < w; j++)
- {
- for (int k = n + 1; k < h; k++)
- {
- v[k, j] = v[k, j] - v[n, j];
- }
- }
- An = new
- Matrix(3, 3, v);
- (Application.OpenForms[0] as Form1).richTextBox4.Text += print() + '\n';
- }
- s = s.Remove(s.Length - 2);
- (Application.OpenForms[0] as Form1).richTextBox4.Text += "det A = " + s + "= " + (Convert.ToDecimal(Math.Round(d, 10))).ToString() + '\n';
- }
- public void AE()
- {
- double[,] e = new double[3, 3];
- e[0, 0] = 1; e[0, 1] = 0; e[0, 2] = 0;
- e[1, 0] = 0; e[1, 1] = 1; e[1, 2] = 0;
- e[2, 0] = 0; e[2, 1] = 0; e[2, 2] = 1;
- double[,] e1 = new double[3, 1];
- Matrix b = new Matrix(3, 3, e);
- Matrix E = new Matrix(3, 3, e);
- Matrix newA = new Matrix(3, 3, v);
- Matrix A = new Matrix(3, 3, v);
- Matrix Az = new Matrix(3, 3, v);
- Matrix An = new Matrix(3, 3, v);
- (Application.OpenForms[0] as Form1).richTextBox5.Text += "Нахождение обратной матрицы с помощью метода Гаусса:" + '\n' + "Прямой ход:" + '\n';
- (Application.OpenForms[0] as Form1).richTextBox5.Text += Az.print(b) + '\n';
- for (int i = 0; i < h; i++)
- {
- for (int j = i; j < w; j++)
- {
- Az.v[i, j] = Az.v[i, j] / An.v[i, i];
- for (int l = j - i; l < j + 1; l++)
- {
- if (i != 1 || j != 2 || l!=1)
- b.v[i, l] = b.v[i, l] / An.v[i, i];
- }
- (Application.OpenForms[0] as Form1).richTextBox5.Text += Az.print(b) + '\n';
- for (int k = i + 1; k < h; k++)
- {
- Az.v[k, j] = Az.v[k, j] - An.v[k, i] * Az.v[i, j];
- for (int l = j - i; l < j + 1; l++)
- {
- if (i != 1 || j != 2 || l != 1)
- b.v[k, l] = b.v[k, l] - An.v[k, i] * b.v[i, l];
- }
- (Application.OpenForms[0] as Form1).richTextBox5.Text += Az.print(b) + '\n';
- }
- }
- An = new Matrix(3, 3, Az.v);
- }
- (Application.OpenForms[0] as Form1).richTextBox5.Text += "Обратный ход:" + '\n';
- double[,] Ao = new double[3, 3];
- for (int q = 0; q < b.w; q++)
- {
- double s = 0;
- for (int i = 2; i >= 0; i--)
- {
- for (int j = i + 1; j <= 2; j++)
- s += Az.v[i, j] * Ao[j, q];
- Ao[i, q] = b.v[i, q] - s;
- s = 0;
- }
- Matrix Ans = new Matrix(3, 3, Ao);
- (Application.OpenForms[0] as Form1).richTextBox5.Text += Ans.print() + '\n';
- for (int l = 0; l < 3; l++)
- {
- newA.v[l, q] = Ans.v[l, q];
- }
- }
- An = new Matrix(3, 3, A.v);
- Az = new Matrix(3, 3, A.v);
- (Application.OpenForms[0] as Form1).richTextBox5.Text += "Обратная матрица:" + '\n' + newA.print() + '\n';
- }
- public void AnswerWithAE(Matrix q)
- {
- double[,] e = new double[3, 3];
- e[0, 0] = 1; e[0, 1] = 0; e[0, 2] = 0;
- e[1, 0] = 0; e[1, 1] = 1; e[1, 2] = 0;
- e[2, 0] = 0; e[2, 1] = 0; e[2, 2] = 1;
- double[,] e1 = new double[3, 1];
- Matrix b = new Matrix(1, 3, e1);
- Matrix bo = new Matrix(1, 3, q.v);
- Matrix E = new Matrix(3, 3, e);
- Matrix newA = new Matrix(3, 3, v);
- Matrix A = new Matrix(3, 3, v);
- Matrix Az = new Matrix(3, 3, v);
- Matrix An = new Matrix(3, 3, v);
- (Application.OpenForms[0] as Form1).richTextBox6.Text += "Нахождение решения с помощью обратной матрицы:" + '\n' + "Вычисляем обратную матрицу (подробнее см. предыдушую вкладку):" + '\n';
- for (int c = 0; c < 3; c++)
- {
- for (int l = 0; l < 3; l++)
- {
- b.v[l, 0] = e[c, l];
- }
- for (int i = 0; i < h; i++)
- {
- for (int j = i; j < w; j++)
- {
- Az.v[i, j] = Az.v[i, j] / An.v[i, i];
- if (j == i) b.v[i, 0] = b.v[i, 0] / An.v[i, i];
- for (int k = i + 1; k < h; k++)
- {
- Az.v[k, j] = Az.v[k, j] - An.v[k, i] * Az.v[i, j];
- if (i == j) b.v[k, 0] = b.v[k, 0] - An.v[k, i] * b.v[i, 0];
- }
- }
- An = new Matrix(3, 3, Az.v);
- }
- double[,] vector = new double[3, 1];
- double s = 0;
- for (int i = 2; i >= 0; i--)
- {
- for (int j = i + 1; j <= 2; j++)
- s += Az.v[i, j] * vector[j, 0];
- vector[i, 0] = b.v[i, 0] - s;
- s = 0;
- }
- Matrix Ans = new Matrix(1, 3, vector);
- for (int l = 0; l < 3; l++)
- {
- newA.v[l, c] = Ans.v[l, 0];
- }
- An = new Matrix(3, 3, A.v);
- Az = new Matrix(3, 3, A.v);
- }
- (Application.OpenForms[0] as Form1).richTextBox6.Text += "Обратная матрица:" + '\n' + newA.print() + '\n';
- (Application.OpenForms[0] as Form1).richTextBox6.Text += "Тогда, решение можно найти по формуле A^(-1)*b:" + '\n' + (newA *
- q).print() + '\n';
- (Application.OpenForms[0] as Form1).richTextBox6.Text += "Вектор невязки:" + '\n';
- double[,] mist = new double[3, 1];
- Matrix R = new Matrix(1, 3, mist);
- R = A * (newA * q) - bo;
- (Application.OpenForms[0] as Form1).richTextBox6.Text += R.print() + '\n';
- }
- public void cond()
- {
- double[,] e = new double[3, 3];
- e[0, 0] = 1; e[0, 1] = 0; e[0, 2] = 0;
- e[1, 0] = 0; e[1, 1] = 1; e[1, 2] = 0;
- e[2, 0] = 0; e[2, 1] = 0; e[2, 2] = 1;
- double[,] e1 = new double[3, 1];
- Matrix b = new Matrix(1, 3, e1);
- Matrix E = new Matrix(3, 3, e);
- Matrix newA = new Matrix(3, 3, v);
- Matrix A = new Matrix(3, 3, v);
- Matrix Az = new Matrix(3, 3, v);
- Matrix An = new Matrix(3, 3, v);
- (Application.OpenForms[0] as Form1).richTextBox7.Text += "Нахождение числа обусловленности:" + '\n' + "Вычисляем обратную матрицу (подробнее см. предыдушие вкладки):" + '\n';
- for (int c = 0; c < 3; c++)
- {
- for (int l = 0; l < 3; l++)
- {
- b.v[l, 0] = e[c, l];
- }
- for (int i = 0; i < h; i++)
- {
- for (int j = i; j < w; j++)
- {
- Az.v[i, j] = Az.v[i, j] / An.v[i, i];
- if (j == i) b.v[i, 0] = b.v[i, 0] / An.v[i, i];
- for (int k = i + 1; k < h; k++)
- {
- Az.v[k, j] = Az.v[k, j] - An.v[k, i] * Az.v[i, j];
- if (i == j) b.v[k, 0] = b.v[k, 0] - An.v[k, i] * b.v[i, 0];
- }
- }
- An = new Matrix(3, 3, Az.v);
- }
- double[,] vector = new double[3, 1];
- double s = 0;
- for (int i = 2; i >= 0; i--)
- {
- for (int j = i + 1; j <= 2; j++)
- s += Az.v[i, j] * vector[j, 0];
- vector[i, 0] = b.v[i, 0] - s;
- s = 0;
- }
- Matrix Ans = new Matrix(1, 3, vector);
- for (int l = 0; l < 3; l++)
- {
- newA.v[l, c] = Ans.v[l, 0];
- }
- An = new Matrix(3, 3, A.v);
- Az = new Matrix(3, 3, A.v);
- }
- (Application.OpenForms[0] as Form1).richTextBox7.Text += "Обратная матрица:" + '\n' + newA.print() + '\n';
- (Application.OpenForms[0] as Form1).richTextBox7.Text += "Тогда, для октаэдрической нормы число обусловленности будет равно:" + (A.N1() * newA.N1()).ToString() + '\n';
- (Application.OpenForms[0] as Form1).richTextBox7.Text += "A для кубической нормы оно будет равно:" + (A.N8() * newA.N8()).ToString() + '\n';
- }
- }
- public Form1()
- {
- InitializeComponent();
- double[,] d = new double[2, 2];
- d[0, 0] = 1.00; d[0, 1] = 0.99;
- d[1, 0] = 0.99; d[1, 1] = 0.98;
- Matrix A = new Matrix(2, 2, d);
- d = new double[2, 2];
- d[0, 0] = -9800; d[0, 1] = 9900;
- d[1, 0] = 9900; d[1, 1] = -10000;
- Matrix iA = new Matrix(2, 2, d);
- d = new double[2, 1];
- d[0, 0] = 1.99;
- d[1, 0] = 1.97;
- Matrix B = new Matrix(1, 2, d);
- d = new double[2, 1];
- d[0, 0] = -0.000097;
- d[1, 0] = 0.000106;
- Matrix dB = new Matrix(1, 2, d);
- d = new double[2, 1];
- d[0, 0] = 1.00;
- d[1, 0] = 1.00;
- Matrix X = new Matrix(1, 2, d);
- d = new double[2, 1];
- d[0, 0] = 3.00;
- d[1, 0] = -1.0203;
- Matrix dX = new Matrix(1, 2, d);
- richTextBox1.Text = "Рассмотрим исходную систему Ax = b и систему с возмущенной правой частью Ax' = (b + Δb)." + '\n';
- richTextBox1.Text += "Где: А = " + '\n' + A.print() + '\n';
- richTextBox1.Text += "b = " + '\n' + B.print() + '\n';
- richTextBox1.Text += "Δb = " + '\n' + dB.print() + '\n';
- richTextBox1.Text += "Вектор x = " + '\n' + X.print() + '\n';
- richTextBox1.Text += "Вектор x' = " + '\n' + dX.print() + '\n';
- richTextBox1.Text += "Вектор невязки уравнения Ax = b:" + '\n' + (A * X - B).print() + '\n';
- richTextBox1.Text += "Вектор невязки уравнения Ax' = (b + Δb):" + '\n' + (A * dX - B - dB).print() + '\n';
- richTextBox1.Text += "Фактическая относительная погрешность (с использованием октаэдрической нормы):" + '\n' + ((dX - X).N1() / X.N1()).ToString() + '\n';
- richTextBox1.Text += "Фактическая относительная погрешность (с использованием кубической нормы):" + '\n' + ((dX - X).N8() / X.N8()).ToString() + '\n';
- richTextBox1.Text += "Число обусловленности (с использованием октаэдрической нормы):" + '\n' + (A.N1() * iA.N1()).ToString() + '\n';
- richTextBox1.Text += "Число обусловленности (с
- использованием кубической нормы):" + '\n' + (A.N8() * iA.N8()).ToString() + '\n';
- richTextBox1.Text += "Теоретическая относительная погрешность (с использованием октаэдрической нормы):" + '\n' + (A.N1() * iA.N1() * dB.N1() / B.N1()).ToString() + '\n';
- richTextBox1.Text += "Теоретическая относительная погрешность (с использованием кубической нормы):" + '\n' + (A.N8() * iA.N8() * dB.N8() / B.N8()).ToString() + '\n';
- }
- private void button1_Click(object sender, EventArgs e)
- {
- double[,] d = new double[3, 3];
- d[0, 0] = (double)numericUpDown1.Value; d[0, 1] = (double)numericUpDown6.Value; d[0, 2] = (double)numericUpDown9.Value;
- d[1, 0] = (double)numericUpDown2.Value; d[1, 1] = (double)numericUpDown5.Value; d[1, 2] = (double)numericUpDown8.Value;
- d[2, 0] = (double)numericUpDown3.Value; d[2, 1] = (double)numericUpDown4.Value; d[2, 2] = (double)numericUpDown7.Value;
- Matrix A = new Matrix(3, 3, d);
- double[,] db = new double[3, 1];
- db[0, 0] = (double)numericUpDown12.Value;
- db[1, 0] = (double)numericUpDown11.Value;
- db[2, 0] = (double)numericUpDown10.Value;
- Matrix b = new Matrix(1, 3, db);
- richTextBox2.Clear();
- richTextBox3.Clear();
- richTextBox4.Clear();
- richTextBox5.Clear();
- richTextBox6.Clear();
- richTextBox7.Clear();
- A.Gauss(b);
- A = new Matrix(3, 3, d);
- b = new Matrix(1, 3, db);
- A.GaussColumn(b);
- A = new Matrix(3, 3, d);
- A.det();
- A = new Matrix(3, 3, d);
- A.AE();
- A = new Matrix(3, 3, d);
- b = new Matrix(1, 3, db);
- A.AnswerWithAE(b);
- A = new Matrix(3, 3, d);
- A.cond();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement