
- •Учреждение образования
- •Лабораторная работа №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
|