- •Учреждение образования
- •Лабораторная работа №1 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод Гаусса
- •Решение:
- •Лабораторная работа №2
- •Изученные теоретические вопросы:
- •Лабораторная работа №3
- •Изученные теоретические вопросы:
- •Лабораторная работа №4
- •Изученные теоретические вопросы: Метод квадратного корня
- •Лабораторная работа №5
- •Изученные теоретические вопросы: Метод отражений
- •Лабораторная работа №6 Решить систему линейных алгебраических уравнений методом вращений.
- •Изученные теоретические вопросы:
- •Решение:
- •Лабораторная работа№7 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод ортогонализации
- •Лабораторная работа №8
- •Изученные теоретические вопросы: Метод сопряженных градиентов
- •Лабораторная работа № 9
- •Лабораторная работа № 10
- •Решение:
Лабораторная работа №2
Постановка задачи:
Решить систему линейных алгебраических уравнений по схеме Холецкого:
Изученные теоретические вопросы:
Схема Холецкого.
Если главные миноры матрицы отличны от нуля:
, , …,,
то матрица представима в виде
,
где и- соответственно нижняя и верхняя треугольные матрицы.
Разложение не может быть единственным. Если взять произвольную диагональную матрицу , с элементами, отличными от нуля, то вместе с равенствомсправедливо также равенство. Поэтому диагональные элементы одной из матрициможно задавать произвольными, отличными от нуля.
Зафиксируем элементы главной диагонали матрицы , положив,. В этом случае разложение имеет вид
Учитывая разложение, система принимает вид . Тогда вектор неизвестныхможно найти из цепочки матричных уравнений
,
Вектор находится из системы с нижней треугольной матрицей
по формулам ,,. Определив вектор, находим
вектор неизвестных из системы с верхней треугольной матрицей
Вычисление проводится по формулам, аналогичным формулам для обратного хода схемы единственного деления Гаусса
, ,.
Описанный метод решения систем линейных алгебраических уравнений называется схемой Холецкого.
Решение:
(здесь и далее, где необходимо, ввод данных описан в первой лабораторной)
void main(){
int n,i,j,k;
float a[10][10],b[10],q[10][10],u[10][10],x[10],y[10],sum=0;
printf("vvedite razmernost matrix\n");
scanf("%d",&n);
printf("vvedite matrix\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
printf("vvedite stilbec svobodnih chlenov\n");
for(i=0;i<n;i++)
scanf("%f",&b[i]);
for(i=0;i<n;i++)
q[i][i]=1;
for(j=0;j<n;j++)
u[0][j]=a[0][j];
for(j=1;j<n;j++)
q[j][0]=a[j][0]/u[0][0];
for(i=1;i<n;i++){
for(j=i;j<n;j++){
for(k=0;k<i;k++)
sum+=q[i][k]*u[k][j];
u[i][j]=a[i][j]-sum;
sum=0;
}
for(j=i+1;j<n;j++){
for(k=0;k<i;k++)
sum+=q[j][k]*u[k][i];
q[j][i]=(a[j][i]-sum)/u[i][i];
sum=0;
}
}
for(i=0;i<n;i++){
for(j=0;j<i;j++)
sum+=q[i][j]*y[j];
y[i]=b[i]-sum;
sum=0;
}
for(i=n-1;i>-1;i--){
for(j=n-1;j>i;j--)
sum+=u[i][j]*x[j];
x[i]=(y[i]-sum)/u[i][i];
sum=0;
}
printf("\nkorni uravnenia\n");
for(i=0;i<n;i++)
printf("%.2f\n",x[i]);
getch();
}
Введенные данные |
Полученный результат |
Проверка |
-8.30 0.17 -2.76 |
-2,7 1,5 -1.20 |
Лабораторная работа №3
Постановка задачи:
Решить систему линейных алгебраических уравнений методом прогонки
Изученные теоретические вопросы:
Для решения систем вида или, что то же самое,
(1)
используется метод прогонки, основанный на предположении, что искомые неизвестные связаны рекуррентным соотношением:
, где (2)
Используя это соотношение, выразим xi-1 и xi через xi+1 и подставим в уравнение (1):
,
где Fi — правая часть i-го уравнения. Это соотношение будет выполняться независимо от решения, если потребовать
Отсюда следует:
Из первого уравнения получим:
После нахождения прогоночных коэффициентов α и β, используя уравнение (2), получим решение системы. При этом,
Другим способом объяснения существа метода прогонки, более близким к терминологии конечно-разностных методов и объясняющим происхождение его названия, является следующий: преобразуем уравнение (1) к эквивалентному ему уравнению
(1')
c надиагональной матрицей
.
Вычисления проводятся в два этапа. На первом этапе вычисляются компоненты матрицы и вектора, начиная сдо
и
На втором этапе, для вычисляется решение:
Решение:
void main(){
int n;
float a[10],b[10],c[10],f[10],alpha[10],beta[10],x[10];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%f%f%f",&a[i],&b[i],&c[i]);
for(int i=0;i<n;i++)
scanf("%f",&f[i]);
alpha[0]=(-c[0])/b[0];
beta[0]=f[0]/b[0];
float znam;
for(int i=1;i<n-1;i++){
znam=a[i]*alpha[i-1]+b[i];
alpha[i]=(-c[i])/znam;
beta[i]=(f[i]-a[i]*beta[i-1])/znam;
}
x[n-1]=(f[n-1]-a[n-1]*beta[n-2])/(b[n-1]+a[n-1]*alpha[n-2]);
for(int i=n-2;i>=0;i--)
x[i]=alpha[i]*x[i+1]+beta[i];
printf("otvet\n");
for(int i=0;i<n;i++)
printf("%.2f\n",x[i]);
getch();
}
Результат:
Введенные данные |
Полученный результат |
Проверка |
0.40 0.40 0.80 2.00
|
0.00 0.00 0.00 2.00
|