Метод зейделя си шарп

Содержание
  1. Решение СЛАУ методом простой итерации, Методом Зейделя, Методом Релаксации — C#
  2. Код к задаче: «Решение СЛАУ методом простой итерации, Методом Зейделя, Методом Релаксации»
  3. Русские Блоги
  4. C # — итерационный метод Зейделя для решения уравнений
  5. Реализация итерационной формулы
  6. Разработка приложения для решения СЛАУ методом Зейделя
  7. Алгоритм решения систем линейных алгебраических уравнений методом Зейделя. Разработка консольного приложения, предназначенного для нахождения корней СЛАУ. Язык программирования C#. Интегрированная среда разработки, описание программы и тестирование.
  8. Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
  9. Содержание
  10. Введение
  11. Глава 1. Теоретическая часть
  12. 1.1 Теория метода
  13. 1.2 Вычислительная схема метода Зейделя
  14. 1.3 Сравнение прямых и итерационных методов
  15. Глава 2. Инструменты разработки консольного приложения
  16. 2.1 Интегрированная среда разработки Microsoft Visual Studio
  17. 2.2 Язык программирования C#2
  18. Глава 3. Описание программы
  19. Глава 4. Тестирование программы
  20. Заключение
  21. Библиографический список
  22. Приложения
  23. Введение
  24. Глава 1. Теоретическая часть
  25. 1.1 Теория метода
  26. 1.2 Вычислительная схема метода Зейделя

Решение СЛАУ методом простой итерации, Методом Зейделя, Методом Релаксации — C#

Всем доброго времени суток, помогите пожалуйста реализовать данные методы, а то у меня не получаеться даже понять полной сути данных методов, находил исходники на C++ и Pascal, но эти языки я плохо знаю! или выложите какую нибудь информацию как реализуются данные методы, Сделать это задание нужно очень срочно до конца недели. Помогите пожалуйста кто чем сможет)) Вот код метода простой итерации на C++, но мне нужно на C#.

#include #include #include using namespace std; int main() < // Считываем размер вводимой матрицы int size; cin >> size; // Будем хранить матрицу в векторе, состоящем из // векторов вещественных чисел vector > matrix; // Матрица будет иметь размер (size) x (size + 1), // c учетом столбца свободных членов matrix.resize (size); for (int i = 0; i < size; i++) < matrix[i].resize (size + 1); for (int j = 0; j < size + 1; j++) < cin >> matrix[i][j]; > > // Считываем необходимую точность решения long double eps; cin >> eps; // Введем вектор значений неизвестных на предыдущей итерации, // размер которого равен числу строк в матрице, т.е. size, // причем согласно методу изначально заполняем его нулями vector previousVariableValues (size, 0.0); // Будем выполнять итерационный процесс до тех пор, // пока не будет достигнута необходимая точность while (true) < // Введем вектор значений неизвестных на текущем шаге vector currentVariableValues (size); // Посчитаем значения неизвестных на текущей итерации // в соответствии с теоретическими формулами for (int i = 0; i < size; i++) < // Инициализируем i-ую неизвестную значением // свободного члена i-ой строки матрицы currentVariableValues[i] = matrix[i][size]; // Вычитаем сумму по всем отличным от i-ой неизвестным for (int j = 0; j < size; j++) < if (i != j) < currentVariableValues[i] -= matrix[i][j] * previousVariableValues[j]; >> // Делим на коэффициент при i-ой неизвестной currentVariableValues[i] /= matrix[i][i]; > // Посчитаем текущую погрешность относительно предыдущей итерации long double error = 0.0; for (int i = 0; i < size; i++) < error += abs (currentVariableValues[i] - previousVariableValues[i]); >// Если необходимая точность достигнута, то завершаем процесс if (error < eps) < break; >// Переходим к следующей итерации, так // что текущие значения неизвестных // становятся значениями на предыдущей итерации previousVariableValues = currentVariableValues; > // Выводим найденные значения неизвестных с 8 знаками точности for (int i = 0; i < size; i++) < printf ("%.8llf ", previousVariableValues[i]); >return 0; >

Код к задаче: «Решение СЛАУ методом простой итерации, Методом Зейделя, Методом Релаксации»

private void button1_Click(object sender, EventArgs e) < //====================================================================================== int n,X; int p = 0; int k = 0; n = Convert.ToInt32(textBox1.Text); int[,] matr = new int[n, n]; //Главная матрица int[] Vector = new int[n]; //Матрица Вектор 2 int[,] matr_X = new int[n, n]; //Матрица с диоганалями Главной Int64 otv1, otv2, otv3, x1=0,x2=0,x3=0; //========================================================================================= //Form2 form2 = new Form2(); //form2.Show(); richTextBox1.Text = null; richTextBox2.Text = null; Random rnd = new Random(); for (int i = 0; i < n; i++) < for (int j=0; j < n; j++) < matr[i, j] = rnd.Next(-100, 100); richTextBox1.Text +=" "+Convert.ToString(matr[i, j])+" "; >richTextBox1.Text += ("\n"); Vector[i] = rnd.Next(-100, 100); richTextBox2.Text += " " + Convert.ToString(Vector[i]) + " "; richTextBox2.Text += ("\n"); > for (int i = 0; i < n; i++) < for (int j = 0; j < n; j++) < if(ij) p+=matr[i,j]; if(matr[i,i] > //=================================================================================================== //перестановка строк for (int i = 0; i < 2; i--) < for (int j = 0; j < n; j++) < p = matr[i, j]; matr[i, j] = matr[i - 1, j]; //тут ошибка неможет присвоить p = matr[i-1,j]; >p = Vector[i-1]; > for (int i = 0; i < n; i++) < for (int j = 0; j < n; j++) < richTextBox3.Text += " " + Convert.ToString(Vector[i]) + " "; richTextBox3.Text += ("\n"); >> //=================================================================================================== //исключение строк for (int i = 0; i < n; i++) < int j = 1; while (k i) < k++; matr_X[i, k] = matr[i, j] / -matr[i, i]; j++; >else j++; matr_X[i, n] = Vector[i] / matr[i, i]; > for (int i = 1; i < n; i++) < for (int j = 1; j < n; j++) richTextBox4.Text += " " + Convert.ToString(matr_X[i,j]) + " "; richTextBox4.Text += ("\n"); >otv1 = matr_X[k, 1] * x2 + matr_X[k, 2] * x3 + matr_X[k, 3]; k++; otv1 = matr_X[k, 1] * x1 + matr_X[k, 2] * x3 + matr_X[k, 3]; k++; otv1 = matr_X[k, 1] * x1 + matr_X[k, 2] * x2 + matr_X[k, 3]; k++; label5.Text += " " + Convert.ToString(x1) + " "; label6.Text += " " + Convert.ToString(x2) + " "; label7.Text += " " + Convert.ToString(x3) + " "; >

Источник

Русские Блоги

C # — итерационный метод Зейделя для решения уравнений

Итерационный метод Гаусса-Зейделя — это решениеЛинейные уравненияОдин из распространенных итерационных методов, предположим, что система линейных уравнений имеет вид

Во многих случаях он сходится быстрее, чем простой итерационный метод. Разница между ним и простым итерационным методом заключается в вычислении

Когда матрица коэффициентов A строго диагонально доминирует или симметрично положительна, итерационный метод Гаусса-Зейделя должен сходиться.

Реализация итерационной формулы

 public void Calcu6() < int count1 = 0, count2 = 0; while (true) < for (int i = 0; i < n; i++) < double sum1 = 0,sum2=0; for (int j = i+1; j for(int j=0;j x[i] = (a[i, n] - sum2-sum1) / a[i, i]; if (Math.Abs(x2[i] - x[i]) < e) count2++; >count1++; if (count1 > 10000) if (count2 == n) ", count2); break;> > >
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; пространство имен Gauss_Seidel итерация < class Seidel < int n; public int N < get < return n; >set < n = value; >> double[,] a; public double[,] A < get < return a; >set < a = value; >> double[] x; public double[] X < get < return x; >set < x = value; >> double e = 0.00001; public double E < get < return e; >set < e = value; >> private double[] x2; public double[] X2 < get < return x2; >set < x2 = value; >> public void Input() < Console.WriteLine ("Пожалуйста, введите заказ:"); n = Convert.ToInt32(Console.ReadLine()); a = new double[n, n + 1]; x = new double[n]; x2 = new double[N + 1]; for (int i = 0; i < N; i++) < x2[i]=x[i]; >Console.WriteLine ("Пожалуйста, введите коэффициент для каждой строки (через ',' или ''):"); for (int i = 0; i < n; i++) < string s = Console.ReadLine(); string[] ss = s.Split(' ', ','); for (int j = 0; j < n + 1; j++) < a[i, j] = Convert.ToDouble(ss[j]); >> > public void Calcu6() < int count1 = 0, count2 = 0; while (true) < for (int i = 0; i < n; i++) < double sum1 = 0,sum2=0; for (int j = i+1; j for(int j=0;j x[i] = (a[i, n] - sum2-sum1) / a[i, i]; if (Math.Abs(x2[i] - x[i]) < e) count2++; >count1++; if (count1 > 10000) if (count2 == n) ", count2); break;> > > public void Output() < Console.WriteLine ("Коэффициент уравнения:"); for (int i = 0; i < n; i++) < string s = null; for (int j = 0; j < n + 1; j++) < s += string.Format("", a[i, j]); > Console.WriteLine(s); > > public void OutputX() < Console.WriteLine ("\ nРешение группы уравнений:"); for (int i = 0; i < n; i++) < Console.WriteLine("x=", i + 1, x[i]); > > > class Program < static void Main(string[] args) < Seidel abc = new Seidel(); abc.Input(); abc.Output(); abc.Calcu6(); abc.OutputX(); >> > 

Источник

Разработка приложения для решения СЛАУ методом Зейделя

Алгоритм решения систем линейных алгебраических уравнений методом Зейделя. Разработка консольного приложения, предназначенного для нахождения корней СЛАУ. Язык программирования C#. Интегрированная среда разработки, описание программы и тестирование.

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://allbest.ru

Содержание

Введение

Глава 1. Теоретическая часть

1.1 Теория метода

1.2 Вычислительная схема метода Зейделя

1.3 Сравнение прямых и итерационных методов

Глава 2. Инструменты разработки консольного приложения

2.1 Интегрированная среда разработки Microsoft Visual Studio

2.2 Язык программирования C#2

Глава 3. Описание программы

Глава 4. Тестирование программы

Заключение

Библиографический список

Приложения

Введение

Решение систем линейных алгебраических уравнений — одна из основных задач вычислительной линейной алгебры. Хотя задача решения системы линейных уравнений сравнительно редко представляет самостоятельный интерес для приложений, от умения эффективно решать такие системы часто зависит сама возможность математического моделирования самых разнообразных процессов с применением ЭВМ. Значительная часть численных методов решения различных (в особенности — нелинейных) задач включает в себя решение систем линейных уравнений как элементарный шаг соответствующего алгоритма.

Одна из трудностей практического решения систем большой размерности связанна с ограниченностью оперативной памяти ЭВМ. Хотя объем оперативной памяти вновь создаваемых вычислительных машин растет очень быстро, тем не менее, еще быстрее возрастают потребности практики в решении задач все большей размерности. В значительной степени ограничения на размерность решаемых систем можно снять, если использовать для хранения матрицы внешние запоминающие устройства. Однако в этом случае многократно возрастают как затраты машинного времени, так и сложность соответствующих алгоритмов. Поэтому при создании вычислительных алгоритм в линейной алгебре большое внимание уделяют способам компактного размещения элементов матриц в памяти ЭВМ.

Приложения очень часто приводят к матрицам, в которых число ненулевых элементов много меньше общего числа элементов матрицы. Такие матрицы принято называть разреженными. Одним из основных источников разреженных матриц являются математические модели технических устройств, состоящих из большого числа элементов, связи между которыми локальны. Простейшие примеры таких устройств — сложные строительные конструкции и большие электрические цепи.

Известны примеры решенных в последние годы задач, где число неизвестных достигало сотен тысяч. Естественно, это было бы невозможно, если бы соответствующие матрицы не являлись разреженными (матрица системы из 100 тыс. уравнений в формате двойной точности заняла бы около 75 Гбайт).

В данной работе, для реализации программного кода, был выбран широко известный язык программирования — С# и среда разработки Microsoft Visual Studio.

Объектом работы является консольное приложение, проверяющее на сходимость последовательность, после чего находящую корни уравнений.

Предметом работы является консольное приложение.

Задачи данной работы заключаются в изучении возможности консольного приложения, изучении алгоритма решения систем линейных алгебраических уравнений методом Зейделя, разработки консольного приложения.

Целью данной работы является разработать консольное приложение, предназначенное для нахождения корней СЛАУ методом Зейделя.

Глава 1. Теоретическая часть

алгебраический уравнение программа зейдель

Система m линейных уравнений с n неизвестными имеет следующий вид:

Если число m уравнений равно числу n неизвестных, то такая система называется квадратной. В данной работе рассматривается решение квадратных систем. В матричном виде квадратная система линейных алгебраических уравнений выглядит следующим образом:

где А — матрица коэффициентов системы;

b — столбец свободных членов.

Для матрицы А существует невырожденная матрица С, если .

Тогда . Если матрица С является обратной для А, т.е. , тогда:

Для решения СЛАУ разработано множество методов. Прямые методы позволяют найти решение за определенное количество шагов. К ним относятся:

Итерационные методы дают возможность найти решение систем линейных алгебраических уравнений посредством уточнений начальных приближений многократным повторением одинаковых итераций. Число итераций зависит от заданной точности решения[10].

Наиболее распространенные итерационные методы:

1. Метод Якоби (метод простой итерации);

К решению систем линейных уравнений сводятся такие группы задач:

1. Задачи механики (статические, теплотехнические);

2. Задачи из геодезии, связанные с построением карт на основании данных геодезической съемки;

3. Задачи приближенного решения уравнений, имеющих большое распространение в высшей математике;

4. Системы линейных уравнений широко используются в области физики и смежных с ней наук: теории относительности, атомной физике, при составлении прогнозов погоды и т.д.

Указанные задачи не исчерпывают всех случаев использования систем линейных уравнений, но обнаруживают, насколько часто приходится сталкиваться при решении предстоящих задач математики и естествознания с необходимостью исследовать и наверняка либо приближенно решить систему линейных уравнений.

1.1 Теория метода

Способ Гаусса-Зейделя можно рассматривать как улучшенную версию метода Якоби.

Основная идея модификации состоит в том, что новые значения используются здесь сразу же по мере получения, в то время как в методе Якоби они не используются до следующей итерации.

Пусть дана квадратная система линейных алгебраических уравнений с n неизвестными, корни которой нужно найти с заданной точностью :

Для решения данной СЛАУ можно использовать метод Зейделя, в случае, если выполняется условие сходимости для матрицы А. Оно заключается в следующем: модули диагональных элементов строки или столбца матрицы должны быть больше суммы модулей недиагональных элементов той самой строки или столбца, т.е.:

Преобразуем матричное выражение к виду , разрешив n-ю строку относительно переменной :

Придадим начальные приближения , значения которых можно рассчитать как: . Посчитаем первые приближения, подставив в систему. Соответственно, на k-м шаге приближения будут рассчитываться как:

В общем виде расчетные формулы выглядят:

Из вычислительной математики известен факт, что для СЛАУ в виде , при условии сходимости матрицы, в процессе итераций получаемые приближения сходятся к корням уравнения при любом начальном приближении, т.е. , где i-й корень СЛАУ. Количество итераций зависит от необходимой точности. Если задана точность , то процесс уточнения неизвестных прекращают, когда выполняется условие критерия близости на k-м шаге:

1.2 Вычислительная схема метода Зейделя

Рассмотрим вычислительную схему метода Зейделя на примере системы уравнений:

2. Проверяется условие сходимости матрицы:

3. Вычисление начальных приближений:

, заданная точность не достигнута.

Дальнейшие итерации выполняются аналогично (таблица 1).

Результат вычислений методом Зейделя

Источник

Читайте также:  Env activate python windows
Оцените статью