Sdscompany.ru

Компьютерный журнал
27 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Метод гаусса java

МОДЫ Grand Theft Auto V

Крупнейший сборник модов для Grand Theft Auto V и GTA San Andreas

Решение слау методом гаусса java

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

import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;

public class Solution i)
>

// Делим на коэффициент при i-ой неизвестной
currentVariableValues[i] /= matrix[i][i];
>

// Посчитаем текущую погрешность относительно предыдущей итерации
double error = 0.0;

выложите, пожалуйста, конкретный пример(что, куда и как вводится) с решением.

Ввод/вывод в программе осуществляется с экрана и на экран консоли. Пусть, например, требуется решить СЛАУ следующего вида:

x + y + z = 5,
x + 2*y + 2*z = -3,
x + 2*y + 3*z = 6.

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

3
1 1 1 5
1 2 2 -3
1 2 3 6
0.0001

В качестве результата программа выведет приближенные значения неизвестных
12.999906137602311 -16.9999061329457 8.999968709429696
которые лишь незначительно отличаются от точного решения данной системы
x = 13,
y = -17,
z = 9.

Случайно нет реализации на JavaScript?

Реализация на javascript отличалась бы только вводом, ну и мелкими моментами.

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

Обо всем по порядку

Начнем с простого. Пусть задана система линейных уравнений третьего порядка:

$$display$$left x_1 + a_ x_2 + a_ x_3 = b_1, a_ x_1 + a_ x_2 + a_ x_3 = b_2, a_ x_1 + a_ x_2 + a_ x_3 = b_3. end right.$$display$$

Метод Гаусса заключается в последовательном «уничтожении» слагаемых, находящихся ниже главной диагонали. На первом этапе первое уравнение умножается на $inline$ dfrac > > $inline$ и вычитается из второго (и аналогично умножается на $inline$ dfrac > > $inline$ и вычитается из третьего). То есть, после этого преобразования, получаем следующее:

$$display$$left x_1 + a_ x_2 + a_ x_3 = b_1, a_ ’x_2 + a_ ’x_3 = b_2′, a_ ’x_2 + a_ ’x_3 = b_3′. end right.$$display$$

Теперь второе уравнение умножается на $inline$ dfrac ‘> ‘> $inline$ и вычитается из третьего:

$$display$$left x_1 + a_ x_2 + a_ x_3 = b_1, a_ ’x_2 + a_ ’x_3 = b_2′, a_ »x_3 = b_3». end right.$$display$$

Получили довольно простую систему, из которой легко находится $inline$x_3$inline$, затем $inline$x_2$inline$ и $inline$x_1$inline$.

Внимательный читатель обязательно заметит: а что, если диагональные элементы равны нулю? Что же делать, если, например, $inline$a_ = 0$inline$? Неужели знаменитый метод Гаусса на этом заканчивается?

Ничего страшного! Давайте найдем $inline$max|a_ |$inline$ и поменяем местами $inline$j$inline$-ую и первую строку (не ограничивая общности, предположим, что $inline$max |a_ | = a_ $inline$). Заметим, что случая, когда все $inline$a_ =0$inline$ быть не может, так как в этом случае определитель матрицы коэффициентов обращается в ноль и решить систему не предоставляется возможным. Итак, после перестановки 3-го уравнение на первую строку, выполняем действия, описанные ранее.

Поиском максимального по модулю элемента можно заниматься на каждой итерации, то есть на $inline$k$inline$-ой итерации искать $inline$max |a_ |$inline$, затем менять $inline$j$inline$-ую и $inline$k$inline$-ую строчки. Алгоритм, в которм осуществляется поиск максимального элемента в столбце, называется методом Гаусса с выбором главного элемента в столбце.

Есть и другой способ. Можно на $inline$k$inline$-ой итерации искать $inline$max |a_ |$inline$, затем менять уже не строчки, а столбцы. Но при этом важно запоминать индексы меняющихся столбцов в какой-нибудь массив $inline$alpha$inline$ (чтобы потом восстановить точный порядок переменных).

Пример простого кода, реализующего данный алгоритм:

Почему Гаусс?

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

$$display$$ Delta = begin a_ & a_ & a_ a_ & a_ & a_ a_ & a_ & a_ end , Delta_1 = begin b_1 & a_ & a_ b_2 & a_ & a_ b_3 & a_ & a_ end , $$display$$

$$display$$ Delta_2 = begin a_ & b_1 & a_ a_ & b_2 & a_ a_ & b_3 & a_ end , Delta_3 = begin a_ & a_ & b_1 a_ & a_ & b_2 a_ & a_ & b_3 end , $$display$$

Но вспомним — что такое определитель?

По определению, определитель матрицы $inline$A = (a_ )$inline$ есть сумма

Статья посвящена реализации алгоритма Гаусса для решения системы линейных алгебраических уравнений на языке Java.

Теоретические сведения

Рассмотрим математическую теорию. Система линейных уравнений может иметь одно решение, бесконечно много решений или же быть несовместной (не иметь решений). Не все методы решения СЛАУ могут справится с вторым случаем, когда система имеет бесконечно много решений. Например, метод Крамера и матричный метод не применимы, но метод Гаусса вполне можно использовать.

Алгоритм можно условно разделить на два этапа:

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

Реализация

Начнем с постановки задачи:

  • нам нужно создать программу, реализующую систему линейных уравнений в виде некоторой структуры данных, используя приемы обобщенного программирования. Система должна содержать коэффициенты производного типа от класса Number (т.е. Float, Integer, Double и т.д.)
  • Запрограммировать алгоритм, который получив на вход структуру данных системы образует нули ниже главной диагонали
Читать еще:  Java lang illegalstateexception already tesselating

Начнем с написания интерфейса, который должно реализовывать каждое уравнение:

Здесь все должно быть ясно, N некоторый наследник Number‘а, T — некоторый тип, реализующий данный интерфейс (рекурсивные дженерики). Метод addEquation(T item) позволяет прибавить каждый элемент уравнения item к каждому своему элементу. Остальные методы работают аналогично.

Теперь рассмотрим класс системы уравнений. Как видно в листинге ниже, он дженеризирован так же, как и интерфейс Gauss и содержит методы для удобного доступа к приватному списку содержащих в себе уравнений.

Теперь можно приступать к реализации «частного случая» структуры уравнения. Создадим класс MyEquation, реализующий наш интерфейс. Пусть наследником Number‘а будет сверхточный класс Float (на практике лучше брать Double). Обратите внимание, что в методе addEquation(MyEquation item) используется объект класса ListIterator, позволяющий изменять элементы перебираемого списка.

Теперь имеем полноценную структуру данных, реализующую систему уравнений. Составим алгоритм который будет принимать некоторый объект, реализующий интерфейс Gauss, затем вызывая нужные методы приведет матрицу к нужному виду.

Алгоритм простой, найти нужный коэффициент, домножить на него i-ю строку (i=0..n-1), и прибавить ее к j-й строке (j=i..n). Заметьте, алгоритм не знает как именно реализуются методы findCoefficient, mul и addEquation, это придает коду бОльшую гибкость, т.к. при потребности изменить способы манипуляции уравнениями (строками), будут изменены только реализации трех вышеупомянутых методов, а главный алгоритм останется нетронутым.

Почти все. Осталось запустить это все в методе main:

Запустим это чудо, что бы проверить корректность работы…

Это все. Исходники можно скачать на github’е.

Вывод

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

Программа решения СЛАУ по методу Гаусса

Введение

Метод Гаусса

Блок – схема метода Гаусса

Программа решения СЛАУ по методу Гаусса

var a: array [1..20,1..21] of real;

x: array [1..20] of real;

write(‘ Введи число неизвестных n=’); readln(n);

for j:=1 to n+1 do

if j=n+1 then writeln;

writeln(‘ Коэффициенты системы уравнений ‘);

for j:=1 to n+1 do

if j=n+1 then writeln(‘ a(‘,i,’,’,j,’)=’, a[i,j]:8:3)

for k:=1 to n-1 do

for i:=k+1 to n do

for j:=k to n+1 do

if j=k then aik:=a[i,k];

writeln( ‘ Корни системы:’);

for k:=n-1 downto 1 do

Метод Гаусса с выбором главного элемента
(максимального по модулю элемента по столбцу)

var a: array [1..20,1..21] of real;

x: array [1..20] of real;

write(‘ Введи число неизвестных n=’); readln(n);

for j:=1 to n+1 do

if j=n+1 then writeln;

writeln(‘ Коэффициенты системы уравнений ‘);

for j:=1 to n+1 do

if j=n+1 then writeln(‘ a(‘,i,’,’,j,’)=’, a[i,j]:8:3)

for k:=1 to n-1 do

for i:=k+1 to n do

if abs(a[i,k]) > max then

for j:=k to n+1 do

writeln(‘Шаг прямого хода К=’, k);

writeln(‘ Коэффициенты системы после перестановки уравнений’);

for j:=1 to n+1 do

if j=n+1 then writeln(‘ a(‘,i,’,’,j,’)=’, a[i,j]:8:3)

for i:=k+1 to n do

for j:=k to n+1 do

if j=k then aik:=a[i,k];

writeln(‘ К-ты системы после ‘, k , ‘-го шага преобразования’);

for j:=1 to n+1 do

if j=n+1 then writeln(‘ a(‘,i,’,’,j,’)=’, a[i,j]:8:3)

Нахождение обратной матрицы с помощью метода Гаусса — Джордана | Набор 2

Учитывая Матрицу , задача состоит в том, чтобы найти обратную матрицу, используя метод Гаусса-Джордана.

Что такое матрица?

Матрица — это упорядоченный прямоугольный массив чисел.

Обратная матрица:

Дана квадратная матрица A, которая не является сингулярной (означает, что определитель A ненулевой); Тогда существует матрица которая называется обратной матрицы А.

Инверсия матрицы возможна только тогда, когда выполняются такие свойства:

  1. Матрица должна быть квадратной матрицей.
  2. Матрица должна быть неособой матрицей и,
  3. Существует матрица I, для которой

Как правило, обратная матрица A n X n может быть найдена с помощью этой простой формулы:

Методы нахождения обратной матрицы:

Найти обратную матрицу 2 × 2 — простая задача, но найти обратную матрицу большего размера (например, 3 × 3, 4 × 4 и т. Д.) — сложная задача, поэтому можно использовать следующие методы:

  1. Операция элементарного ряда (метод Гаусса-Жордана) (эффективный)
  2. Несовершеннолетние, кофакторы и адъюгатный метод (неэффективно)

Операция элементарного ряда (метод Гаусса — Иордана):

Метод Гаусса-Джордана — это вариант исключения по Гауссу, в котором выполняется операция сокращения строк, чтобы найти обратную матрицу.

Шаги, чтобы найти обратную матрицу, используя метод Гаусса-Джордана:

Чтобы найти обратную матрицу, необходимо выполнить следующие шаги:

  1. Сформируйте расширенную матрицу по единичной матрице.
  2. Выполните операцию сокращения строк на этой расширенной матрице, чтобы создать матричную форму с уменьшенным числом строк.
  3. Следующие операции строки выполняются на расширенной матрице, когда это необходимо:
    • Поменяйте местами любые два ряда.
    • Умножьте каждый элемент строки на ненулевое целое число.
    • Замените строку на сумму самого себя и постоянное значение, кратное другой строке матрицы.

Пример:

  • Дополненная матрица формируется как A: B

После применения метода исключения Гаусса-Джордана:

Ниже приведена программа на C ++ для нахождения обратной матрицы с использованием метода Гаусса-Джордана:

// C ++ программа для поиска обратной матрицы.

using namespace std;

// Функция для печати матрицы.

void PrintMatrix( float ar[][20], int n, int m)

for ( int i = 0; i

for ( int j = 0; j

// Функция для печати обратной матрицы

void PrintInverse( float ar[][20], int n, int m)

for ( int i = 0; i

for ( int j = n; j

printf ( «%.3f » , ar[i][j]);

// Функция для выполнения обратной операции над матрицей.

void InverseOfMatrix( float matrix[][20], int order)

// PrintMatrix функция для печати элемента

printf ( «=== Matrix ===n» );

PrintMatrix(matrix, order, order);

// Создаем расширенную матрицу

// Добавить идентификационную матрицу

// порядка в конце исходной матрицы.

for ( int i = 0; i

for ( int j = 0; j

// Добавить ‘1’ в диагональных местах

// матрица для создания идентичности matirx

// Меняем строку матрицы,

// смена ряда начнется с последнего ряда

for ( int i = order — 1; i > 0; i—) <

// Меняем местами каждый элемент двух строк

// if (matrix [i — 1] [0]

// // Перестановка строки, если выше

// temp = matrix [i] [j];

// matrix [i] [j] = matrix [i — 1] [j];

// matrix [i — 1] [j] = temp;

// Прямой обмен строк с помощью указателей экономит время

float * temp = matrix[i];

matrix[i] = matrix[i — 1];

matrix[i — 1] = temp;

// Печать матрицы после операций обмена.

printf ( «n=== Augmented Matrix ===n» );

PrintMatrix(matrix, order, order * 2);

// Заменить строку на сумму самого себя и

// константа, кратная другой строке матрицы

for ( int i = 0; i

for ( int j = 0; j

temp = matrix[j][i] / matrix[i][i];

for ( int k = 0; k

matrix[j][k] -= matrix[i][k] * temp;

// Умножаем каждую строку на ненулевое целое число.

// Делим элемент строки по диагональному элементу

for ( int i = 0; i

for ( int j = 0; j

matrix[i][j] = matrix[i][j] / temp;

// выводим результирующую обратную матрицу.

Решение системы линейных уравнений методом Гаусса

Дата добавления: 2014-05-02 ; просмотров: 4171 ; Нарушение авторских прав

Простейшие численные методы

Рассмотрим численные методы решения систем линейных алгебраических уравнений

,

где А – матрица m m, x = (x1, x2,…, xm) T – искомый вектор, f = (f1, f2,…, fm) T – заданный вектор. Предполагается, что определитель матрицы А отличен от нуля, так что решение x существует и единственно. Для большинства вычислительных задач характерным является большой порядок матрицы А. Систему (1) можно решать по крайней мере двумя способами: или по формулам Крамера, или методом Гаусса последовательного исключения неизвестных. При больших m первый способ, основанный на вычислении определителей, требует порядка m! Арифметических действий, а метод Гаусса – только О(m 3 ) действий. Поэтому метод Гаусса широко используется при численном решении задач линейной алгебры.

Методы численного решения системы линейных алгебраических уравнений делятся на две группы: прямые методы (Гаусса, Крамера) и итерационные методы. Итерационные методы состоят в том, что решение x системы находится как предел при n последовательных приближений x (n ) , где n – номер итерации. Обычно задается малое число и вычисления проводятся до тех пор, пока не будет выполнена оценка

.

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

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

Прямые методы не предполагают, что матрица А имеет какой-либо специальный вид и ее порядок не превышает 100.

Рассмотрим систему линейных алгебраических уравнений

, (1)

где А – матрица m m, x = (x1, x2,…, xm) T – искомый вектор, f = (f1, f2,…, fm) T – заданный вектор. Предполагается, что определитель матрицы А отличен от нуля, так что решение x существует и единственно.

Запишем систему (1) в развернутом виде

(2)

Метод Гаусса решения системы (2) состоит в последовательном исключении неизвестных x1, x2,…, xm из этой системы. Предположим, что a11<>0. Поделив первое уравнение на a11 получим

, (3)

.

Рассмотрим теперь оставшиеся уравнения системы (2):

. (4)

Умножим (3) на ai1 и вычтем полученное уравнение из i-го уравнения системы (4), i=2,…,m. В результате получим следующую систему уравнений:

. (6)

Матрица системы (5) имеет вид

.

Матрицы такой структуры принято обозначать так:

,

Где крестиками обозначены ненулевые элементы. В системе (5) неизвестное x1 содержится только в первом уравнении, поэтому в дальнейшем достаточно иметь дело с укороченной системой уравнений

, (7)

,

.

Тем самым мы осуществили первый шаг метода Гаусса. Если , то из системы (7) совершенно аналогично можно исключить неизвестное x2 и прийти к системе, эквивалентной (2) и имеющей матрицу следующей структуры:

.

При этом первое уравнение системы (5) остается без изменения.

Исключая таким же образом неизвестные x3,x4,…,xm, придем окончательно к системе уравнений вида

. (9)

Содержит нули всюду ниже главной диагонали. Матрицы такого вида называются верхними треугольными матрицами.

Получение системы (8) составляет прямой ход метода Гаусса. Обратный ход заключается в нахождении неизвестных x1,x2,…,xm из системы (8). Поскольку матрица имеет треугольный вид, можно последовательно, начиная с xm, найти все неизвестные. Общие формулы обратного хода имеют вид

. (10)

При реализации в программе прямого хода метода Гаусса нет необходимости действовать с переменными x1,x2,…,xm. Достаточно указать алгоритм, согласно которому исходная матрица А преобразуется к треугольному виду (9), и указать соответствующие преобразования правых частей системы. Получим эти общие формулы. Пусть реализованы первые k-1 шагов, т.е. уже исключены переменные x1,x2,…,xk-1. Тогда имеем систему

Рассмотрим k-е уравнение этой системы

,

И предположим, что . Поделив обе части этого уравнения на , получим

, (12)

.

.

Далее, умножим уравнение (12) на и вычтем полученное соотношение из i-го уравнения системы (11), где i=k+1,k+2,…,m. В результате последняя группа уравнений системы (11) примет вид

.

Таким образом, в прямом ходе метода Гаусса коэффициенты уравнений преобразуются по следующему правилу:

,

. (13)

.

Вычисление правых частей системы (8) осуществляются по формулам

(15)

. (16)

Коэффициенты cij и правые части yi, i=1,2. m, j=i+1,i+2,…, m, хранятся в памяти и используются при осуществлении обратного хода по формулам (10).

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

В листинге представлен метод Gauss(), который получает матрицу А и столбец свободных членов В, и реализует прямой и обратных ход метода Гаусса.

Листинг 15.1. Метод Гаусса

public static void Gauss(float[,] A, float[] B,

Модифицированный метод Гаусса

В данном случае помимо соблюдения требования akk ¹ 0 при реализации формул (6) накладываются дополнительные требования, чтобы ведущий (главный) элемент в текущем столбце в процессе преобразований исходной матрицы имел максимальное по модулю значение. Это также достигается перестановкой строк матрицы.

Пример. В качестве иллюстрации преимущества модифицированного метода Гаусса, рассмотрим систему третьего порядка:

(а)

Прямой ход метода Гаусса

Исключаем х1 из второго и третьего уравнений. Для этого первое уравнение умножаем на 0,3 и складываем со вторым, а затем умножаем первое уравнение на (–0,5) и складываем с третьим. В результате получаем

(б)

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

Умножая второе уравнение на 25, и складывая с третьим, получим

(в)

Обратный ход метода Гаусса

Выполняем вычисления, начиная с последнего уравнения в полученной системе:

Подставляя полученное решение [0; –1; 1] в исходную систему, убеждаемся в его истинности.

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

(г)

Прямой ход метода для системы (г) повторим по аналогичной технологии с исходной системой (а).

(д)

После исключения х2 третье уравнение примет вид (остальные – без изменения)

Выполняя обратный ход, получим

Очевидно, что полученные решения [0; –1; 1] и [–0,35; –1,4; 0,99993] различны. Причиной этого является малая величина ведущего элемента во втором уравнении преобразования в (д). Чтобы это исключить, переставим в (д) вторую и третью строки

º (ж)

Для данной системы после исключения х2 из третьего уравнения, оно примет следующий вид

В данном случае, выполняя обратный ход

мы получим решение системы (г) [0; –1; 1], которое в точности совпадает с решением исходной системы.

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

Рассмотрим блок-схему модифицированного метода Гаусса (рис. 2.1).

Рис. 2.1. Блок-схема модифицированного метода Гаусса

Проведем анализ предложенной схемы на примере системы n=3 (e=0,001)

(8)

; . (*)

Блок 1. Ввод исходных данных: n – порядок системы, A – матрица коэффициентов при неизвестных, b – вектор свободных членов.

Блок 2. I-й цикл прямого хода (для k, изменяющегося от 1 до предпоследнего значения, т.е. до n–1) обеспечивает исключение из главной диагонали матрицы А элемента akk=0 благодаря поиску максимального элемента akk в текущем столбце, осуществляемому в блоках 3¸6 с помощью цикла II.

Далее с помощью цикла III в блоках 7¸13 выполняется перестановка текущей строки и строки с максимальным элементом в k-ом столбце (ее номер р).

Затем реализуются расчеты по формулам (6) прямого хода Гаусса в блоках циклов IV и V.

Проведем поблочный анализ в среде рассмотренных циклов I¸V на примере (8).

Выход из цикла II и вход в цикл III

В данном случае на диагонали оказался максимальный элемент, поэтому перестановка 2-ой и 3-ей строк не выполняется.

Выход из цикла III и вход в цикл I в Блок 11

Свободный член b2 остается на своем месте.

Выход из цикла IV и вход в цикл V

Выход из цикла V и выход из цикла I.

Обратный ход метода Гаусса

В Блоках 19¸24 реализуются формулы (7).

В Блоке 19 из последнего уравнения находится значение xn (n = 3)

Вход в цикл VI (Блок 20), в котором значение переменной цикла k изменяется от n–1 до 1 с шагом (–1)

Вход в цикл VII (Блок 22)

Выход из цикла VII на Блок 24 в цикл VI:

Далее по аналогии

Выход из последнего цикла VII.

В Блоке 25 (цикл опущен) выполняется вывод на экран полученного решения СЛАУ – вектора т.е. xi, i=1, . n. В нашем случае (1; 0; 1).

Метод прогонки

Данный метод также является модификацией метода Гаусса для частного случая разреженных систем – систем с матрицей трехдиагонального типа (краевая задача ДУ).

Каноническая форма их записи

aixi–1 + bixi + cixi+1 = di; i= ; a1 = cn = 0, (9)

или в развернутом виде

При этом, как правило, все коэффициенты bi ¹ 0.

Метод реализуется в два этапа – прямой и обратный ходы.

Прямой ход. Каждое неизвестное xi выражается через xi+1

посредством прогоночных коэффициентов Ai и Bi. Определим алгоритм их вычисления.

Из первого уравнения системы (10) находим x1

.

. (12)

Из второго уравнения системы (10) определяем x2 через x3, подставляя найденное значение x1

; (12*)

, где е2= а2× А1+ b2 .

Ориентируясь на соотношения индексов при коэффициентах (12) и (12*) можно получить эти соотношения для общего случая

, где еi = аi × Аi–1+ bi (i=2,3, . n–1) . (13)

Обратный ход. Из последнего уравнения системы (10) с использованием (11) при i = n–1

. (14)

Далее посредством (11) и прогоночных коэффициентов (12), (13) последовательно вычисляем xn–1, xn–2, . x1.

При реализации метода прогонки нужно учитывать, что при условии

или хотя бы для одного bi имеет место строгое неравенство (15), деление на «0» исключается и система имеет единственное решение.

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

Схема алгоритма метода прогонки может иметь вид, представленный на рис. 2.2.

Ссылка на основную публикацию
Adblock
detector