Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Полоцкий государственный университет
Кафедра технологий программирования
Отчет
По лабораторной работе №3
по курсу «Численные методы в инженерных расчетах»
«LU-разложение»
Выполнила:
студент группы 10-ИТ-1
Бойченко А.В.
Проверила:
Мурашкевич О.Н.
Полоцк, 2012 г.
Цель: изучить метод LU-разложения.
В современных программах реализующих метод Гаусса на ЭВМ, вычисления разбивают на два основных этапа. Первый этап это вычисление LU-разложения матрицы A системы. Второй этап обработка матриц и вычисление решения. LU-разложение эффективно применять при частых вычислениях, связанных с матрицей А.
Суть LU-разложения. Рассмотрим метод Гаусса с позиции операций с матрицами. Пусть A1 матрица системы после исключения первого неизвестного
,
Введем новую матрицу
,
где
Очевидно, A1 = N1 A, B1 = N1B. Аналогично, после второго шага система приводится к виду:
После n - 1 шага получим
В итоге получаются матрица и вектор An-1=Nn-1…N2N1A, Bn-1=Nn-1…N2N1B. откуда
. При этом
,
После введения обозначений , , где
получим .
Это представление матрицы A называется LU-разложением (на произведение нижней и верхней треугольных матриц L и U). Прямой ход метода Гаусса можно рассматривать как один из вариантов представления матрицы в виде произведения двух треугольных матриц, или LU-разложения. Его можно провести и другими способами.
Возможность LU разложения обосновывается следующей теоремой.
Теорема. Если все главные миноры матрицы А отличны от нуля, то существует единственная нижняя треугольная матрица L вида и верхняя треугольная матрица U, такие, что .
В методе Гаусса приведение матрицы A к виду с верхней треугольной формой и решение системы Ly = B выполняется одновременно при прямом ходе. Затем обратным ходом решается система Ux = y , и находится вектор x.
Листинг программы:
#include <stdio.h>
int main(int argc, char *argv[])
{
double arr[100][100],b[100],L[100][100]={0},U[100][100]={0},prjam[100]={0};
double otvet[100];
int n;
FILE *f;
f=fopen(argv[1],"w");
printf("Enter size of matrix: \n");
scanf("%d",&n);
/*for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("enter element of matrix: %d %d \n",i,j);
scanf("%lf",&arr[i][j]);
}
}*/
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
arr[i][j]=rand()%100;
//fprintf(f,arr[i][j]);
}
for(int i=0;i<n;i++)
{
b[i]=rand()%100;
}
int tr=1;
int m=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
printf("%lf ",arr[i][j]);
}
for(int i=0;i<n;i++)
{
printf("%lf ",b[i]);
}
/*for(int i=0;i<n;i++)
{
printf("Enter element right Colum of system: %i \n",i);
scanf("%lf",&b[i]);
}*/
for(int stl=0;stl<n;stl++)
{ m=1;
tr=stl+1;
for(int str=tr;str<n;str++)
{
U[str][stl]=arr[str][stl]/arr[stl][stl];
for(int p=0;p<n;p++)
{
arr[str][p]=arr[str][p]-U[str][stl]*arr[str-m][p];
}
m++;
tr++;
}
}
prjam[0]=b[0];
double sum=0;
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
sum=sum+U[i][j]*prjam[j];
}
prjam[i]=b[i]-sum;
sum=0;
}
printf("Prjamoi Hod: \n");
for(int i=0;i<n;i++)
printf("%lf\n",prjam[i]);
otvet[n-1]=prjam[n-1]/arr[n-1][n-1];
for(int i=n-2;i>=0;i--)
{
for(int j=n-1;j>i;j--)
{
sum=sum+arr[i][j]*otvet[j];
}
otvet[i]=(prjam[i]-sum)/arr[i][i];
sum=0;
}
printf("Otvet!: \n");
for(int i=0;i<n;i++)
printf("%lf\n",otvet[i]);
getchar();
return 0;
}
Проверка: