|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(******************************************************************************) (**) ОТДЕЛ ПроSV+; (****************************************************************************** * НАЗНАЧЕНИЕ: * решение систем линейных уравнений (A*x=b) методом SV-разложения * * ПРИМЕЧАНИЯ: * Система уравнений записана в файле "ПроМатр2.дан". * В этом файле 1-я строка содержит размер матрицы A * (число строк и столбцов), в следующих строках записанны значения элементов * матрицы A, потом на отдельной строке размер матрицы свободных членов B * (число векторов b и их размер), а далее значения элементов матрицы B, * в которой строки являются векторами b. * * Прямоугольная матрица A (N на M, с N >= M) раскладывается на три * сомножителя (A=U*S*V'), где U (N на M) состоит из столбцов - собственных * векторов, S (M на M) - диагональная матрица с элементами >= 0 (собственные * значения) и V (M на M) ортогональная матрица. Близкие к 0 (отклонение * задается пользователем) собственные значения обнуляются. Решение * ищется в виде x = V*Diag(1/S(i))*U'*b, для S(i) # 0. * Редактируя таким способом собственные значения S, можно успешно * применять этод метод для решения систем уравнений с вырожденными * и псевдо-вырожденными матрицами. * Если матрица A вырождена, то возможно два случая: * 1) Если система недоопределена, то метод возвращает вектор x с минимальной * нормой. * 2) Если система несовместна, то метод возвращает такой вектор x, для * которого A*x является наилучшим приближением к b (по норме). ******************************************************************************) ИСПОЛЬЗУЕТ Вект ИЗ "...\Отделы\Числа\", Матр ИЗ "...\Отделы\Числа\", МатрВВ ИЗ "...\Отделы\Числа\", Читать ИЗ "...\Отделы\Обмен\", Вывод ИЗ "...\Отделы\Обмен\"; (******************************************************************************) ЗАДАЧА Голова; ПОСТ ДОПУСК=1.D-8; (* собственные значения обнуляются, если они более чем * в ДОПУСК раз меньше наибольшего собственного значения *) ПЕР n:ЦЕЛ; (* размер вектора свободных членов *) nv:ЦЕЛ; (* число векторов свободных членов *) A:Матр.Доступ; (* матрица системы *) s:Вект.Доступ; (* собственные значения *) v:Матр.Доступ; (* ортогональная матрица *) B:Матр.Доступ; (* вектора свободных членов *) X:Матр.Доступ; (* вектора решения *) i:ЦЕЛ; п:Читать.Поток; УКАЗ п:=МатрВВ.ОткрытьПоток("ПроМатр2.дан"); A:=МатрВВ.ЧитатьМатр(п); B:=МатрВВ.ЧитатьМатр(п); Читать.Закрыть(п); nv:=РАЗМЕР(B^,0); n:=РАЗМЕР(B^,1); СОЗДАТЬ(s,n); СОЗДАТЬ(v,n,n); СОЗДАТЬ(X,nv,n); Вывод.Цепь("^Исходная матрица:^"); МатрВВ.ВыводМатр("%10.5f",A^); Вывод.Цепь("^Вектора свободных членов:^"); ОТ i:=0 ДО nv-1 ВЫП МатрВВ.ВыводВект("%10.5f",B[i]) КОН; (* После выполнения РазложитьНаSV матрица U оказывается на месте матрицы A *) ЕСЛИ Матр.РазложитьНаSV(A^,s^,v^) = 0 ТО (* обнуляем незначимые сингулярные значения *) Матр.ОбнулитьS(s^,ДОПУСК); (* решаем систему для каждого вектора свободных членов b *) Вывод.Цепь("^Вектора решения:^"); ОТ i:=0 ДО nv-1 ВЫП Матр.РешитьИзSV(A^,s^,v^,B[i],X[i]); МатрВВ.ВыводВект("%10.5f",X[i]) КОН ИНАЧЕ Вывод.Цепь("^Нет схождения!^") КОН КОН Голова; (******************************************************************************) УКАЗ Голова КОН ПроSV. |
|