Решение систем линейных уравнений методом Холецкого - QBasic
Формулировка задачи:
Здравствуйте! Помогите пожалуйста с методом Холецкого. Мне нужно написать программу для решения систем линейных уравнений.
Вот моя система:
6.25x1 - x2 + 0.5x3 = 7.5
-x1 + 5x2 + 2.12x3 = -8.68
0.5x1 + 2.12x2 + 3.6x3 = -0.24
Программу я начала писать, но она пока только выдает две матрицы, а дальше я не знаю что делать. Я принцип поняла этого метода,но не знаю как в программе это написать.
http://info.alnam.ru/book_clm.php?id=46
Вот с этого сайта я взяла пример(начиная с параграфа 5.8). Там все формулы, и весь пример описан, помогите мне пожалуйста доделать программу.
Вот начало моей программы.
Решение задачи: «Решение систем линейных уравнений методом Холецкого»
textual
Листинг программы
CLS
m = 3
DIM a(1 TO m, 1 TO m)
DIM b(1 TO m)
DIM y(1 TO m)
DIM x(1 TO m)
DIM l(1 TO m, 1 TO m)
DATA 6.25, -1, 0.5
DATA -1, 5, 2.12
DATA 0.5, 2.12, 3.6
DATA 7.5, -8.68, -0.24
FOR i = 1 TO m
FOR j = 1 TO m
READ a(i, j)
PRINT USING "###.###"; a(i, j);
NEXT j: PRINT
NEXT i
FOR i = 1 TO m
READ b(i)
LOCATE i, 24
PRINT USING "###.###"; b(i)
NEXT i
FOR k = 1 TO m
s = a(k, k)
FOR j = 1 TO k - 1
s = s - l(k, j) ^ 2
NEXT j
l(k, k) = SQR(s)
IF k = m THEN EXIT FOR
FOR i = k + 1 TO 3
s = a(i, k)
FOR j = 1 TO 3
s = s - l(i, j) * l(k, j)
NEXT j
l(i, k) = s / l(k, k)
NEXT i
NEXT k
LOCATE 5, 1
FOR i = 1 TO m
FOR j = 1 TO m
PRINT USING "###.###"; l(i, j);
NEXT j: PRINT
NEXT i
FOR i = 1 TO m
s = b(i)
FOR j = 1 TO i - 1
s = s - l(i, j) * y(j)
NEXT j
y(i) = s / l(i, i)
NEXT i
FOR i = m TO 1 STEP -1
s = y(i)
FOR j = m TO i + 1 STEP -1
s = s - l(j, i) * x(j)
NEXT j
x(i) = s / l(i, i)
NEXT i
PRINT
FOR i = 1 TO 3
PRINT "x("; i; ")="; USING "###.###"; x(i)
NEXT i
END
Объяснение кода листинга программы
Код решает систему линейных уравнений методом Холецкого. Вот список действий, которые он выполняет:
- Задаёт значение переменной
m, которая определяет размер матрицы коэффициентовa. - Задаёт матрицу коэффициентов
aи вектор правой частиbс помощью циклаFORи функцииREAD. - Выводит матрицу коэффициентов
aи вектор правой частиbс помощью функцииPRINT. - Инициализирует диагональную матрицу
lединицами. - Начинает цикл решения от 1 до
m:- Вычисляет значение
sна текущей итерации, как сумму квадратов элементов строки в матрицеl. - Если текущая итерация меньше
m, то обновляет значениеsвычитая произведение элементов строки в матрицеlи соответствующих элементов из предыдущих итераций. - Если текущая итерация равна
m, то обновляет значениеsвычитая произведение элементов строки в матрицеlи соответствующих элементов из предыдущих итераций, и делит его на значениеl(k, k). - Если текущая итерация больше
m, то обновляет значениеsвычитая произведение элементов строки в матрицеlи соответствующих элементов из предыдущих итераций, и делит его на значениеl(k, k).
- Вычисляет значение
- Выводит диагональную матрицу
lс помощью циклаFORи функцииPRINT. - Начинает цикл, который присваивает каждому элементу вектора
yзначениеs, вычитая произведение элементов строки в матрицеlи соответствующих элементов из предыдущих итераций. - Начинает цикл, который присваивает каждому элементу вектора
xзначениеs, вычитая произведение элементов строки в матрицеlи соответствующих элементов из предыдущих итераций. - Выводит значения вектора
xс помощью циклаFORи функцииPRINT. - Код заканчивается.