close

Вход

Забыли?

вход по аккаунту

?

lab02

код для вставкиСкачать
Министерство Образования Республики Беларусь
Полоцкий Государственный университет
факультет информационных технологий
Отчёт по лабораторной работе №3
по дисциплине "Численные методы в инженерных расчётах"
метод прогонки
ВыполнилГончарик Ю.В.
Группа 11ИТ-1
ПроверилаМурашкевич О.Н.
Полоцк 2013
Цель.
Программно реализовать метод прогонки для решения систем линейных алгебраических уравнений с трёхдиагональными матрицами.
Ход работы.
Разработка будет происходить в среде программирования Pelles C. Матрицы будем читать из файлов (вернее коэффициенты при неизвестных, и значения, которые принимают эти уравнения, заданные матрично). Пусть матрица A - коэффициентов, B - значений. Полученные значения неизвестных сверим с теми значениями, которые получим при решении той же системы в MathCAD.
Для нахождения неизвестных проделываем два основных шага:
прямая прогонка;
обратная прогонка.
При прямой прогонке находят коэффициенты Аi, Вi. Происходит это следующим образом:
Где c,a,b - коэффициенты; f - значения в правой части.
Программно это можно реализовать так:
double km = A[0][0];
ai[0] = -A[0][1]/km;
bi[0] = B[0]/km;
for(int i = 1; i < n; i++)
{
km = A[i][i] + A[i][i-1]*ai[i-1];
ai[i] = -A[i][i+1]/km;
bi[i] = (B[i]-A[i][i-1]*bi[i-1])/km;
}
Следующим шагом найдём неизвестные x. Считаются они по формуле:
anxn-1+bnxn =fn
хn-1 = А n-1х n+В n-1,
что и отразим в коде программы:
X[n-1] = bi[n-1];
for(int i = n-2; i >= 0; i--)
X[i] = ai[i]*X[i+1] + bi[i];
Полный листинг программы приведён ниже:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int r = 0;
char str[100], s;
int main(int argc, char *argv[])
{
FILE *file;
char in[10], out[10];
printf("A: ");
gets(in);
printf("\n");
printf("B: ");
gets(out);
printf("\n");
file = fopen(in, "r");
while(!feof(file))
{
fgets(str,100,file);
r++;
}
fclose(file);
int n = r - 1; //размерность
double A[n][n]; //матрица коэффициентов
double B[n]; //значений
double ai[n],bi[n],X[n];
int i = 0;
file = fopen(in,"r"); while(!feof(file))
{
for(int i = 0; !feof(file); i++)
for(int j = 0; !feof(file); j++)
{
fscanf(file, "%lf", &A[i][j]);
}
}
file = fopen(out, "r");
while(!feof(file))
{
for(int i=0; !feof(file); i++)
fscanf(file, "%lf", &B[i]);
}
printf("\n"); //вывод
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%0.2lf\t", A[i][j]);
printf("\n");
} printf("\n");
for(int j = 0; j < n; j++)
printf("%0.2lf\t", B[j]);
printf("\n");
printf("\n");
//прямой ход
double km = A[0][0];
ai[0] = -A[0][1]/km;
bi[0] = B[0]/km;
for(int i = 1; i < n; i++)
{
km = A[i][i] + A[i][i-1]*ai[i-1];
ai[i] = -A[i][i+1]/km;
bi[i] = (B[i]-A[i][i-1]*bi[i-1])/km;
}
//обратный ход X[n-1] = bi[n-1];
for(int i = n-2; i >= 0; i--)
X[i] = ai[i]*X[i+1] + bi[i];
for(int j = 0; j < n; j++)
printf("%0.3lf\t", X[j]);
printf("\n");
printf("\n");
return 0;
}
Результаты тестирования
Имеем систему:
Решение в MatchCAD выглядит следующим образом:
В разработанной программе решения ничем не отличаются:
Рис.1 Метод прогонки
Вывод.
В ходе выполнения данной работы был изучен метод прогонки для решения систем линейных уравнений, коэффициенты которых составляют трёхдиагональную матрицу. Было разработанное программное средство, реализующее этот метод. Проведена проверка результатов от программы и от пакета MathCAD, которые оказались идентичны.
Документ
Категория
Рефераты
Просмотров
8
Размер файла
58 Кб
Теги
lab02
1/--страниц
Пожаловаться на содержимое документа