Разработка программного комплекса решения математической задачи численными методами

Характеристика особенностей алгоритма решения системы линейных независимых уравнений методом Крамера. Характеристика структуры программы. Анализ основных этапов вызова и загрузки. Рассмотрение технических программных средств, используемых при вводе.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 07.11.2013
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АСУ

Курсовая работа №1

Программирование на ЯВУ

«Разработка программного комплекса решения математической задачи численными методами»

Липецк 2012

1. Описание программы

1.1 Общие сведения

Программа: «Решение системы линейных уравнений методом Крамера»

Название программы: «MetodKramer.exe»

Программное обеспечение, необходимое для функционирования программы:

Операционная среда Windows 95/98/Me/2k/XP/Vista/7

Средаразработки: Microsoft Visual Studio 2008

Программа написана на языке MicrosoftVisualC++ 2008

1.2 Функциональное назначение

Настоящая программа предназначена для решения системы линейных уравнений, записанной в виде матрицы коэффициентов, стоящих при соответствующих переменных. Используется метод решения системы линейных уравнений методом Крамера.

1.2.1 Классы решаемых задач

Нахождение решения системы линейных уравнений методом Крамера.

1.2.2 Функциональные ограничения

Программа корректно работает только для системы линейных линейно независимых уравнений. Количество уравнений не может быть большим 13.

1.3 Описание логической структуры

1.3.1 Алгоритм используемого метода

Алгоритм программы основан на алгоритме решения системы линейных линейно независимых уравнений методом Крамера

Метод Крамера состоит в том, что последовательно находится главный определитель системы и n вспомогательных определителей i , которые получаются из определителя заменой i-го столбца столбцом свободных членов.

- Главный определитель, составленный из коэффициентов системы

Для системы n линейных уравнений с n неизвестными с определителем матрицы системы Д, отличным от нуля, решение записывается в виде

i-ый столбец матрицы системы заменяется столбцом свободных членов.

Если главный определитель системы Д и все вспомогательные определители Дi = 0, то система имеет бесчисленное множество решений.

Если главный определитель системы Д = 0, а хотя бы один вспомогательный определитель отличен от нуля, то система решений не имеет.

1.3.2 Структура программы

Сразу после загрузки главного окна программа ожидает введения исходных данных. В дальнейшем происходят события, зависящие от действий пользователя. Если пользователь ввел корректные исходные данные, то программа выполняется. Иначе, если пользователь ввел недопустимый символ в поле программы, ввел текстовые данные, то выдается диагностическое сообщение для каждого поля, в котором допущена ошибка ввода с указанием номера поля.

1.4 Вызов и загрузка

Для вызова программы необходимо запустить файл Kramer.exe из текущей папки программы.

1.5 Входные данные

Коэффициенты при переменных в уравнениях. Данные быть введены в виде десятичной дроби со знаком или без (для отделения дробной части используется знак «,»), а также в виде целого числа, которое в ходе программы преобразуется в вещественное.

1.6 Выходные данные

Коэффициенты при соответствующих переменных, а также погрешность на эти коэффициенты, которые могут быть выведены в виде десятичной дроби со знаком (выводится только знак «-», если он есть, знак «+» опускается), а также в виде целого числа.

2. Описание Применения

2.1 Назначение программы

Программа предназначена для решения системы линейных уравнений, записанной в виде матрицы коэффициентов, стоящих при соответствующих переменных. Используется метод решения системы линейных уравнений методом Крамера.

2.2 Условия применения

2.2.1 Условия применения

Минимальные требования:

- Процессор IntelPentium II.

- Наличие не менее 16Mб ОЗУ.

- Наличие не менее 1Мб свободного дискового пространства.

- SVGA - графический адаптер.

- Минимальный набор периферийного оборудования.

2.2.2 Функциональные ограничения

Программа корректно работает только для системы линейных линейно независимых уравнений без свободных переменных, т.е. количество различных переменных в уравнениях должно быть не больше числа самих уравнений. Количество уравнений не может быть большим 13.

2.3 Описание задачи

Процесс разработки интерактивной прикладной программы, осуществляет решение определенной системы линейных линейно независимых уравнений методом Крамера.

Определение: линейным уравнением называется линейная комбинация вида:

C1x1 + C2x2 + … + Cnxn = b;

где Ci - некоторые коэффициенты при переменных;

xi - переменные первой степени;

b - свободный член.

Определение: линейно независимой системой уравнений называется система уравнений, в которой какое-либо уравнение не может быть линейной комбинацией других уравнений этой же системы.

Определение: определенной системой уравнений называется система уравнений, имеющая строго одно решение.

Метод Крамера состоит в том, что последовательно находится главный определитель системы и n вспомогательных определителей i , которые получаются из определителя заменой i-го столбца столбцом свободных членов.

- Главный определитель, составленный из коэффициентов системы

Для системы n линейных уравнений с n неизвестными с определителем матрицы системы Д, отличным от нуля, решение записывается в виде

i-ый столбец матрицы системы заменяется столбцом свободных членов.

Если главный определитель системы Д и все вспомогательные определители Дi = 0, то система имеет бесчисленное множество решений.

Если главный определитель системы Д = 0, а хотя бы один вспомогательный определитель отличен от нуля, то система решений не имеет.

2.4 Входные данные

Коэффициенты при переменных в уравнениях. Данные быть введены в виде десятичной дроби со знаком или без (для отделения дробной части используется знак «,»), а также в виде целого числа, которое в ходе программы преобразуется в вещественное.

2.5 Выходные данные

Коэффициенты при соответствующих переменных, а также погрешность на эти коэффициенты, которые могут быть выведены в виде десятичной дроби со знаком (выводится только знак «-», если он есть, знак «+» опускается), а также в виде целого числа.

3. Руководство программиста

3.1 Назначение и условия применения программы

3.1.1 Назначение программы

Программа предназначена для нахождения решения системы линейных уравнений, задаваемых коэффициентами при соответствующих переменных. Программа имеет некоторые ограничения, которые необходимо учитывать пользователю при вводе тех или иных параметров. В любом случае параметры проверяются перед расчетом.

3.1.2 Условия применения программы

- Процессор IntelPentium II.

- Наличие не менее 16Mб ОЗУ.

- Наличие не менее 1Мб свободного дискового пространства.

- SVGA - графический адаптер.

- Минимальный набор периферийного оборудования.

3.2 Характеристики программы

Для выполнения программы требуется сравнительно небольшой промежуток времени.

В программе присутствует проверка введенных данных, что позволяет предотвратить возможные ошибки и оповестить об этом пользователя о необходимости их корректировки.

Возможность вывода хода решения

3.3 Вызов и загрузка

Для начала работы программы необходимо запустить файл Kramer.exe

Входные точки:

кнопка «Ввести данные»

кнопка «Решить систему»

кнопка «Справка»

3.4 Данные

3.4.1 Входные данные

- число уравнений в системе, целое число

- коэффициенты при соответствующих переменных в соответствующих

уравнениях, числа вещественные

3.4.2 Выходные данные

- решение в виде коэффициентов при соответствующих переменных,

числа вещественные;

- погрешность в виде степени десяти, может использоваться:

1) число вещественное в коде стандарта IBNPC для формата типа double;

2) символьная информация в коде ASCI

3.5 Сообщения

Сообщения, возникают на экране во время выполнения данной программы в случае пяти возможных ошибок:

Пользователь не ввел число уравнений в системе:

«Ничего не введено!»

2) Пользователь ввел нецелое число уравнений в системе или число больше 13:

«Должно быть целое положительное число не больше 13!»

3) Пользователь не ввел в какую-либо ячейку коэффициент при переменной:

«Остались незаполненные поля»

Пользователь ввел нечисловые данные

«Введено нечисловое значение»

Главный определитель системы равен 0:

«Главный определитель равен 0! Система не имеет единственного решения»

Файл со справкой отсутствует в одной папке с программой:

«Файл справки не найден»

алгоритм крамер линейный уравнение

4. Описание контрольного предмета

4.1 Назначение программы

Программа предназначена для решения системы линейных уравнений методом Крамера. Программа имеет некоторые ограничения, которые необходимо учитывать пользователю при вводе тех или иных параметров. В любом случае параметры проверяются перед расчетом.

4.2 Целью проведения испытаний

Проверить правильность нахождения решения системы линейных уравнений методом Крамера.

4.3 Требования, подлежащие проверке

- Правильность нахождения решения системы линейных уравнений;

- Верность выдаваемых сообщений об ошибке или предупредительных сообщений при наличии данных, некорректно введенных пользователем.

4.4 Технические программные средства, используемые при вводе

Технические средства: компьютер типа IBMPC, монитор, мышь и клавиатура.

Программные средства: операционная система Microsoft WindowsXPProfessional и тестируемая программа.

4.5 Порядок проведения тестирования

- Вести значения, соответствующие проверяемым требованиям;

- Отследить результаты работы программы;

- Сравнить полученные значения с ожидаемыми результатами.

4.6 Используемые методы тестирования

4.6.1 Проверка правильности решения системы линейных уравнений

1) Введем число уравнений в системе, равное 3

Ввод количества уравнений в системе (рис. 1)

Введем коэффициенты:

1 6 2 0

4 7 8 10

1 2 3 5

Ввод коэффициентов системы (рис. 2)

Ожидаемое значение:

x1 = -1,76

x2 = -0,59

x3 = 2,65

Рассчитаем:

Полученное решение (рис. 3)

4.6.2 Проверка поведения программы при заведомо неправильных входных данных

Пользователь не ввел число уравнений в системе:

Пользователь не ввел число уравнений в системе (рис. 4)

2) Пользователь ввел нецелое число уравнений в системе или число больше 13:

Введено нецелое число уравнений в системе (рис.5)

3) Пользователь не ввел в какую-либо ячейку коэффициент при переменной: Введены не все коэффициенты (рис.6)

Пользователь ввел нечисловые данные

Введено нечисловое значение (рис.7)

Главный определитель системы равен 0:

Главный определитель равен 0 (рис.8)

5. Текст программы

#include<iostream>

#include<string.h>

usingnamespace std;

constint MAX_SIZE = 20;

void initialize(float&, float *, float *, float *);

void allocate_floats(int&, float *&, float *&, float *&);

void initialize_dynamic_memory(float *, int);

void get_matrices(float [][MAX_SIZE], float *, int);

void calculate_variable_matrix(float&, float *, float *, float [][MAX_SIZE], float *, int);

void print_results(float *, float *, int, float);

void return_memory(float *, float *, float *);

void calculate_determinant(float&, float [][MAX_SIZE], int);

void calculate_modified_determinant(float *, float [][MAX_SIZE], float [], int);

void calculate_variables(float *, float *, float, int);

void print_determinants(float *, int, float);

void print_variables(float *, int, float);

void copy_matrix(float[][MAX_SIZE], float [][MAX_SIZE], int);

bool swap_rows(float [][MAX_SIZE], int, int);

int main()

{ setlocale (LC_ALL, "rus");

int size;

float coefficient[MAX_SIZE][MAX_SIZE], *variable, *constant, *determinant_modified, determinant_original;

char quit[1];

char yes[] = "y";

do

{

//initialize(determinant_original, variable, constant, determinant_modified);

allocate_floats(size, variable, constant, determinant_modified);

initialize_dynamic_memory(determinant_modified, size);

get_matrices(coefficient, constant, size);

calculate_variable_matrix(determinant_original, determinant_modified, variable, coefficient, constant, size);

print_results(variable, determinant_modified, size, determinant_original);

return_memory(variable, constant, determinant_modified);

cout <<"Вычислить еще матрицу (y/n)? ";

cin >> quit;

} while (strcmp(quit, yes) == 0);

return 0;

}

void initialize(float&i_determinant_original, float *i_variable, float *i_constant, float *i_determinant_modified)

{

i_determinant_original = 1;

i_variable = NULL;

i_constant = NULL;

i_determinant_modified = NULL;

return;

}

void allocate_floats(int&af_size, float *&af_variable, float *&af_constant, float *&af_determinant_modified)

{

cout <<"Vvedite razmernost matrix А: ";

cin >> af_size;

while ((af_size < 1) || (af_size > 20))

{

cout <<"Допыстимая размерность от 2 до 20."<< endl;

cout <<"Попробуйте еще раз n: ";

cin >> af_size;

}

af_variable = newfloat[af_size];

af_constant = newfloat[af_size];

af_determinant_modified = newfloat[af_size];

return;

}

void initialize_dynamic_memory(float *idm_determinant_modified, int idm_size)

{

int i;

for (i = 0; i < idm_size; i ++)

idm_determinant_modified[i] = 1;

return;

}

void get_matrices(float gm_coefficient[][MAX_SIZE], float *gm_constant, int gm_size)

{

int i, j;

cout << endl;

cout <<"Vvedite matrix koephicientov (A)."<< endl;

for (i = 0; i < gm_size; i ++)

{

cout <<"Ряд "<< i + 1 <<": ";

for (j = 0; j < gm_size; j ++)

cin >> gm_coefficient[i][j];

}

cout << endl;

cout <<"Введите матрицу свободных членов (b)."<< endl;

for (i = 0; i < gm_size; i ++)

{

cout <<"Ряд "<< i + 1 <<": ";

cin >> gm_constant[i];

}

return;

}

void calculate_variable_matrix(float&cvm_determinant_original, float *cvm_determinant_modified, float *cvm_variable, float cvm_coefficient[][MAX_SIZE], float *cvm_constant, int cvm_size)

{

if (cvm_size == 1)

{

cvm_determinant_original = cvm_coefficient[0][0];

cvm_determinant_modified[0] = cvm_constant[0];

}

else

{

calculate_determinant(cvm_determinant_original, cvm_coefficient, cvm_size);

calculate_modified_determinant(cvm_determinant_modified, cvm_coefficient, cvm_constant, cvm_size);

}

calculate_variables(cvm_variable, cvm_determinant_modified, cvm_determinant_original, cvm_size);

return;

}

void print_results(float *pr_variable, float *pr_determinant_modified, int pr_size, float pr_determinant_original)

{

print_determinants(pr_determinant_modified, pr_size, pr_determinant_original);

print_variables(pr_variable, pr_size, pr_determinant_original);

return;

}

void return_memory(float *rm_variable, float *rm_constant, float *rm_determinant_modified)

{

delete [] rm_variable;

delete [] rm_constant;

delete [] rm_determinant_modified;

return;

}

void calculate_determinant(float&cd_determinant, float cd_coefficient[][MAX_SIZE], int cd_size)

{

int i, j, k, l;

float temp_co, temp_mat[MAX_SIZE][MAX_SIZE];

copy_matrix(cd_coefficient, temp_mat, cd_size);

for (i = 0; i < cd_size; i ++)

{

if (temp_mat[i][i] == 0)

{

if (swap_rows(temp_mat, i, cd_size) == false)

{

cd_determinant = 0;

return;

}

else

cd_determinant *= -1;

}

if (temp_mat[i][i] != 1)

{

temp_co = temp_mat[i][i];

cd_determinant *= temp_mat[i][i];

for (j = i; j < cd_size; j ++)

temp_mat[i][j] = temp_mat[i][j] / temp_co;

}

for (k = i + 1; k < cd_size; k ++)

for (l = (cd_size - 1); l >= i; l --)

temp_mat[k][l] = temp_mat[k][l] - (temp_mat[k][i] * temp_mat[i][l]);

}

return;

}

void calculate_modified_determinant(float cmd_determinant_modified[], float cmd_coefficient[][MAX_SIZE], float *cmd_constant, int cmd_size)

{

int i, j;

float temp_mat[MAX_SIZE][MAX_SIZE];

for (i = 0; i < cmd_size; i ++)

{

copy_matrix(cmd_coefficient, temp_mat, cmd_size);

for (j = 0; j < cmd_size; j ++)

temp_mat[j][i] = cmd_constant[j];

calculate_determinant(cmd_determinant_modified[i], temp_mat, cmd_size);

}

return;

}

void calculate_variables(float *cv_variable, float *cv_determinant_modified, float cv_determinant_original, int cv_size)

{

int i;

for (i = 0; i < cv_size; i ++)

cv_variable[i] = cv_determinant_modified[i] / cv_determinant_original;

return;

}

void print_determinants(float *pd_determinant_modified, int pd_size, float pd_determinant_original)

{

int i;

cout << endl <<"Список всех определителей:"<< endl;

cout <<"Det(A) = "<< pd_determinant_original << endl;

for (i = 0; i < pd_size; i ++)

cout <<"Det(A"<< i + 1 <<") = "<< pd_determinant_modified[i] << endl;

return;

}

void print_variables(float *pv_variable, int pv_size, float pv_determinant_original)

{

int i;

cout << endl;

if (pv_determinant_original == 0)

cout <<"Правило Крамера не работает с вырожденными матрицами Det(A) = 0."<< endl;

else

{

cout <<"Результат:"<< endl;

for (i = 0; i < pv_size; i ++)

cout <<"x"<< i + 1 <<" = "<< pv_variable[i] << endl;

}

return;

}

void copy_matrix(float matrix1[][MAX_SIZE], float matrix2[][MAX_SIZE], int cm_size)

{ int i, j;

for (i = 0; i < cm_size; i ++)

for (j = 0; j < cm_size; j ++)

matrix2[i][j] = matrix1[i][j];

return;

} bool swap_rows(float matrix[][MAX_SIZE], int sr_i, int sr_size)

{

int initRow = sr_i, initCol = sr_i, i, j;

float temp;

for (i = initRow; i < sr_size; i ++)

if (matrix[i][initCol] != 0)

{

for (j = initCol; j < sr_size; j ++)

{

temp = matrix[initRow][j];

matrix[initRow][j] = matrix[i][j];

matrix[i][j] = temp;

}

returntrue;

}

returnfalse;

}

Библиографический список

1) Википедия - Свободная энциклопедия. Метод Крамера// http://ru.wikipedia.org/wiki/Метод_Крамера

2) Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004

3) Шилдт Г. Искусство программирования на C++. БХВ.2005

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.