Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Seidel
- {
- int n;
- double[] Xk, Xk1, B, D, X0; // X0 - начальное приближение
- double[,] A, C;
- double eps;
- public Seidel(double[,] A, double[] B)
- {
- n = B.Length;
- this.A = A;
- this.B = B;
- eps = 0.001;
- C = new double[n, n];
- Xk = new double[n];
- Xk1 = new double[n];
- D = new double[n];
- X0 = new double[n]; //{ 2, 2, -2, 2, 1 };
- for (int i = 0; i < n; i++)
- {
- for(int j = 0; j < n; j++)
- {
- if (i != j)
- {
- C[i, j] = -A[i, j] / A[i, i];
- }
- }
- D[i] = B[i] / A[i, i];
- Xk[i] = X0[i]; // Начальное приближение всех значений равно нулю
- Xk1[i] = X0[i];
- }
- }
- public void solve()
- {
- do
- {
- iterate(Xk, Xk1);
- }
- while (!converge(Xk1, Xk));
- print(Xk);
- }
- bool converge(double[] Xk, double[] Xk1)
- {
- double norm = 0;
- for (int i = 0; i < n; i++)
- {
- norm += (Xk1[i] - Xk[i]) * (Xk1[i] - Xk[i]);
- }
- if (Math.Sqrt(norm) >= eps)
- return false;
- return true;
- }
- void iterate(double[] Xk, double[] Xk1)
- {
- for (int i = 0; i < n; i++)
- {
- Xk[i] = Xk1[i];
- }
- for (int i = 0; i < n; i++)
- {
- double var = 0;
- for (int j = 0; j < i; j++)
- var += A[i, j] * Xk1[j];
- for (int j = i + 1; j < n; j++)
- var += A[i, j] * Xk[j];
- Xk1[i] = (B[i] - var) / A[i, i];
- }
- }
- public void print(double[,] matrix)
- {
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- Console.Write("{0,7:f3} ", matrix[i, j]);
- }
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- public void print(double[] vector)
- {
- for (int i = 0; i < n; i++)
- {
- Console.WriteLine("{0,7:f3} ", vector[i]);
- }
- Console.WriteLine();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement