Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Moy_otchyot2.docx
Скачиваний:
8
Добавлен:
25.03.2015
Размер:
269.22 Кб
Скачать

Лабораторная работа №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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]