Kirill parshenkov
Moscow
Whats's up bro?
My name is Kirill, i'm beginner beatmaker and rap artist. Make
using System;
class Program
{
// Напишем класс вектора из 3 координат
class Vector
{
public double a, b, c;
public Vector()
{
a = 5.1;
b = 5.1;
c = 2.9;
}
public Vector(double a, double b, double c)
{
this.a = a;
this.b = b;
this.c = c;
}
public static Vector operator +(Vector v1, Vector v2)
{
return new Vector { a = v1.a + v2.a, b = v1.b + v2.b, c = v1.c + v2.c };
}
public static Vector operator -(Vector v1, Vector v2)
{
return new Vector { a = v1.a - v2.a, b = v1.b - v2.b, c = v1.c - v2.c };
}
public static Vector operator *(double number, Vector v1)
{
return new Vector { a = v1.a * number, b = v1.b * number, c = v1.c * number };
}
// Перегружаем оператор <
// Принимает вектор и число, если каждая координата вектора, взятая по модулю, меньше числа -
// то возвращает true, иначе false
public static bool operator <(Vector v1, double number)
{
return Math.Abs(v1.a) < number && Math.Abs(v1.b) < number && Math.Abs(v1.c) < number;
}
// Перегружаем оператор >
// Принимает вектор и число, если каждая координата вектора, взятая по модулю, больше числа -
// то возвращает true, иначе false
public static bool operator >(Vector v1, double number)
{
return Math.Abs(v1.a) > number && Math.Abs(v1.b) > number && Math.Abs(v1.c) > number;
}
}
static Vector MultMatrixOnVector(Vector v1)
{
Vector NewVector = new Vector
{
a = A[0, 0] * v1.a + A[0, 1] * v1.b + A[0, 2] * v1.c,
b = A[1, 0] * v1.a + A[1, 1] * v1.b + A[1, 2] * v1.c,
c = A[2, 0] * v1.a + A[2, 1] * v1.b + A[2, 2] * v1.c
};
return NewVector;
}
static double ScalarMult(Vector v1, Vector v2)
{
return v1.a * v2.a + v1.b * v2.b + v1.c * v2.c;
}
// Матрица A
static double[,] A;
// Вектор b
static Vector b = new Vector();
static void Main(string[] args)
{
// Заносим в матрицу нужные данные
A = new double [3, 3]
{
{ 6, 0.6, 0.7 },
{ 0.6, 3, -0.3},
{ 0.7, -0.3, 4 }
};
// Переменная k будет отвечать за максимальное число шагов,
// чтобы программа не зациклилась, если будет расхождение
Console.Write("Введите максимальное число шагов для алгоритма: ");
int k = int.Parse(Console.ReadLine());
// Введем точность вычисления
double eps = 0.0001;
// Начальные данные для алгоритма
// Так как матрица A диагонально преобладающая, то в качестве X0 берем bi / Aii
Vector Xk = new Vector(b.a / A[0, 0], b.b / A[1, 1], b.c / A[2, 2]);
Vector Rk = b - MultMatrixOnVector(Xk);
Vector Zk = new Vector(Rk.a, Rk.b, Rk.c);
// В цикле идем до тех пор, пока не достигнем нужной точности (Rk > eps),
// либо пока не истратим лимит шагов k
int i = 0;
for ( i = 0; Rk > eps && i < k; ++i)
{
double ak = ScalarMult(Rk, Rk) / ScalarMult(MultMatrixOnVector(Zk), Zk);
Xk = Xk + ak * Zk;
Vector Rk1 = new Vector(Rk.a, Rk.b, Rk.c);
Rk = Rk1 - ak * MultMatrixOnVector(Zk);
double bk = ScalarMult(Rk, Rk) / ScalarMult(Rk1, Rk1);
Zk = Rk + bk * Zk;
}
// Выводим на экран ответ
Console.WriteLine("\nX1 = " + Xk.a + "\nX2 = " + Xk.b + "\nX3 = " + Xk.c);
// Выводим на экран ответ
Console.WriteLine("\nВектор невязки \nX= " + Math.Round(Rk.a, 14) + "\nY = " + Math.Round(Rk.b, 7) + "\nZ = " + Math.Round(Rk.c, 7));
}
}
DevilPrado ✪’s tracks
published on
published on
published on
published on
published on
published on
published on
published on
published on
published on