private void button2_Click(object sender, EventArgs e) { int Length; try { Length = Convert.ToInt32(textBox1.Text); } catch { return; } if ((Length > 30 || Length < 1)) { LogOutput("Wrong size"); return; } if (!MatrixExist) { LogOutput("You need to precompute inverte matrix"); return; } double[,] x = new double[Length, 1]; double[,] u = new double[Length, 1]; double[,] v = new double[Length, 1]; double[,] z = new double[Length, 1]; double[,] y = new double[Length, 1]; double[,] b = new double[Length, 1]; double[,] A = new double[Length, Length]; try { for (int i = 0; i < Length; i++) { x[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length].Value)); } } catch { LogOutput("Initial x vector is wrong;"); return; } try { for (int i = 0; i < Length; i++) { b[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 1].Value)); } } catch { LogOutput("B vector is wrong"); return; } try { for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { A[i, j] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value)); } } } catch { LogOutput("A matrix is wrong"); return; } try { for (int i = 0; i < Length; i++) { u[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 2].Value)); } } catch { LogOutput("U vector is wrong"); return; } try { for (int i = 0; i < Length; i++) { v[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 3].Value)); } } catch { LogOutput("V vector is wrong"); return; } DateTime Now = DateTime.Now; var UV = Matrixes.Multiply(u, Matrixes.GetTransp(v, Length, 1)); for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { NewMatrix[i, j] = A[i, j] - UV[i, j]; } } z = Matrixes.GetTransp(Matrixes.Multiply(Matrixes.GetTransp(v, Length, 1), InverseMatrix), 1, Length); y = Matrixes.Multiply(InverseMatrix, u); double alfa = 1d / (1 - Matrixes.Multiply(Matrixes.GetTransp(v, Length, 1), y)[0, 0]); double beta = Matrixes.Multiply(Matrixes.GetTransp(z, Length, 1), b)[0, 0]; for (int i = 0; i < Length; i++) { x[i, 0] = x[i, 0] + alfa * beta * y[i, 0]; } for (int i = 0; i < Length; i++) { dataGridView2.Rows[i].Cells[Length].Value = x[i, 0]; } LogOutput("Time of work =" + (DateTime.Now - Now).TotalMilliseconds / 1000 + "s"); }
private void button2_Click(object sender, EventArgs e) { int Length; try { Length = Convert.ToInt32(textBox1.Text); } catch { return; } if ((Length > 30 || Length < 1)) { LogOutput("Wrong size"); return; } double epsiolon; try { epsiolon = Convert.ToDouble(textBox3.Text); } catch { LogOutput("Wrong accuracy"); return; } if (epsiolon < 0) { LogOutput("Wrong size"); return; } double[,] x = new double[Length, 1]; double[,] r = new double[Length, 1]; double[,] b = new double[Length, 1]; double[,] A = new double[Length, Length]; try { for (int i = 0; i < Length; i++) { x[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 1].Value)); } } catch { LogOutput("Initial x vector is wrong; 0 values are taken instead"); for (int i = 0; i < Length; i++) { x[i, 0] = 0; } } try { for (int i = 0; i < Length; i++) { b[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length].Value)); } } catch { LogOutput("B vector is wrong"); return; } try { for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { A[i, j] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value)); } } } catch { LogOutput("A matrix is wrong"); return; } DateTime Now = DateTime.Now; var temp = Matrixes.Multiply(A, x); for (int i = 0; i < Length; i++) { r[i, 0] = b[i, 0] - temp[i, 0]; } double tau=0; double tempDouble = 0; temp = Matrixes.Multiply(A, r); for (int i = 0; i < Length; i++) { tau += r[i, 0] * r[i, 0]; } temp = Matrixes.Multiply(A, r); for (int i = 0; i < Length; i++) { tempDouble += temp[i, 0] * r[i, 0]; } tau /= -tempDouble; for (int i = 0; i < Length; i++) { x[i,0] = x[i,0] - tau * r[i,0]; } temp = Matrixes.Multiply(A, x); for (int i = 0; i < Length; i++) { r[i, 0] = b[i, 0] - temp[i, 0]; } while (!Less(epsiolon, r)) { tau = 0; tempDouble = 0; temp = Matrixes.Multiply(A, r); for (int i = 0; i < Length; i++) { tau += r[i, 0] * r[i, 0]; } temp = Matrixes.Multiply(A, r); for (int i = 0; i < Length; i++) { tempDouble += temp[i, 0] * r[i, 0]; } tau /= -tempDouble; for (int i = 0; i < Length; i++) { x[i, 0] = x[i, 0] - tau * r[i, 0]; } temp = Matrixes.Multiply(A, x); for (int i = 0; i < Length; i++) { r[i, 0] = b[i, 0] - temp[i, 0]; } } for (int i = 0; i < Length; i++) { dataGridView1.Rows[i].Cells[Length + 2].Value = x[i, 0]; } LogOutput("Time of work =" + (DateTime.Now - Now).TotalMilliseconds / 1000 + "s"); }
private void button1_Click(object sender, EventArgs e) { int Length; try { Length = Convert.ToInt32(textBox1.Text); } catch { return; } if ((Length > 30 || Length < 1)) { LogOutput("Wrong size"); return; } double[,] x = new double[Length, 1]; double[,] u = new double[Length, 1]; double[,] v = new double[Length, 1]; double[,] b = new double[Length, 1]; double[,] A = new double[Length, Length]; try { for (int i = 0; i < Length; i++) { x[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length].Value)); } } catch { LogOutput("Initial x vector is wrong;"); return; } try { for (int i = 0; i < Length; i++) { b[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 1].Value)); } } catch { LogOutput("B vector is wrong"); return; } try { for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { A[i, j] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value)); } } } catch { LogOutput("A matrix is wrong"); return; } try { for (int i = 0; i < Length; i++) { u[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 2].Value)); } } catch { LogOutput("U vector is wrong"); return; } try { for (int i = 0; i < Length; i++) { v[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 3].Value)); } } catch { LogOutput("V vector is wrong"); return; } DateTime Now = DateTime.Now; InverseMatrix = Matrixes.GetReverse(A, Length); var res = Matrixes.Multiply(InverseMatrix, b); for (int i = 0; i < Length; i++) { dataGridView1.Rows[i].Cells[Length].Value = res[i, 0]; } var UV = Matrixes.Multiply(u, Matrixes.GetTransp(v, Length, 1)); MatrixExist = true; dataGridView2.Columns.Clear(); dataGridView2.Rows.Clear(); for (int i = 0; i < Length; i++) { dataGridView2.Columns.Add(new DataGridViewTextBoxColumn()); } dataGridView2.Columns.Add(new DataGridViewTextBoxColumn()); dataGridView2.Columns.Add(new DataGridViewTextBoxColumn()); for (int i = 0; i < Length; i++) { dataGridView2.Rows.Add(); } NewMatrix = new double[3, 3]; for (int i = 0; i < Length; i++) { for (int j = 0; j < Length; j++) { dataGridView2.Rows[i].Cells[j].Value = (NewMatrix[i, j] = A[i, j] - UV[i, j]); } dataGridView2.Rows[i].Cells[Length + 1].Value = b[i, 0]; } LogOutput("Time of work =" + (DateTime.Now - Now).TotalMilliseconds / 1000 + "s"); MatrixExist = true; }