Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по программированию.doc
Скачиваний:
52
Добавлен:
01.04.2014
Размер:
883.2 Кб
Скачать

5. Выводы

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

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

равно .

Пусть для нахождения решения мы хотим воспользо­ваться теоремой Крамера, при этом детерминанты будем вычислять по их обычному определению, как сумму со знаками произведений элементов по одному из каждой строки и каждого столбца. Легко можно под­считать, что для нахождения решения нужно будет приблизительнопгп умножений и делений. Уже при п = 20 это число приблизительно равно 1021 и являете настолько большим, что становится ясной невозможность решать указанным путем на современных машинах систему даже двадцати уравнений.

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

6. Литература

1. Численные методы / Н. Н. Калиткин – М.: Наука, 1978. – 512 с.

2. Алгоритмы Вычислительной математики : Учебно-методическое пособие по курсу «Основы алгоритмизации и программирования»// А. К. Cиницын, А. А. Навроцкий. – Минск: БГУИР, 2007–80 с.

3. http://ru.wikipedia.org/wiki/СЛАУ

4. http://www.exponenta.ru/educat/systemat/hanova/equation/linear/linear2.asp

Приложение 1

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

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "math.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::buttonGoClick(TObject *Sender)

{

// Проверяем входные данные и присваиваем значения свойствам класса

if (checkInputValues()) {

initMatrix();

tabSheetAction->Show();

goAction();

tabSheetResult->Show();

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::buttonCloseClick(TObject *Sender)

{

if (MessageBox(Handle, "Таки уже уходите?", "Уходим?", MB_YESNO|MB_ICONQUESTION) == ID_YES) {

Close();

}

}

//---------------------------------------------------------------------------

bool TForm1::checkInputValues()

{

TCustomEdit *TDstElement;

bool bReturnState = true;

char sErrorMessage[255] = "";

if (!TryStrToInt(editValueN->Text, iValueN)) {

strcat(sErrorMessage, "Размерность только целое число!");

TDstElement = editValueN;

bReturnState = false;

} else if (iValueN < 1) {

strcat(sErrorMessage, "Размерность матрицы - положительное целое число больше ноля!");

TDstElement = editValueN;

bReturnState = false;

} else if (!TryStrToFloat(editValueQ->Text, dValueQ)) {

strcat(sErrorMessage, "Некорректный формат данных!");

TDstElement = editValueQ;

bReturnState = false;

} else if (!TryStrToFloat(editValueD->Text, dValueD)) {

strcat(sErrorMessage, "Некорректный формат данных!");

TDstElement = editValueD;

bReturnState = false;

} else if (!TryStrToFloat(editValueE->Text, dValueE)) {

strcat(sErrorMessage, "Некорректный формат данных!");

TDstElement = editValueE;

bReturnState = false;

} else if (dValueE < 0) {

strcat(sErrorMessage, "Заданная погрешность не может быть меньше нуля!");

TDstElement = editValueE;

bReturnState = false;

} else if (!TryStrToFloat(editMinW->Text, dMinW)) {

strcat(sErrorMessage, "Некорректный формат данных");

TDstElement = editMinW;

bReturnState = false;

} else if (!TryStrToFloat(editMaxW->Text, dMaxW)) {

strcat(sErrorMessage, "Некорректный формат данных");

TDstElement = editMaxW;

bReturnState = false;

} else if (!TryStrToFloat(editStepW->Text, dStepW)) {

strcat(sErrorMessage, "Некорректный формат данных");

TDstElement = editStepW;

bReturnState = false;

} else if (dMinW > dMaxW) {

strcat(sErrorMessage, "Минимальное значение параметра релаксации не может быть больше максимального!");

TDstElement = editMinW;

bReturnState = false;

} else if (dStepW <= 0) {

strcat(sErrorMessage, "Шаг изменения параметра релаксации не может быть отрицательным или нулевым!");

TDstElement = editStepW;

bReturnState = false;

}

if (!bReturnState) {

tabSheetStart->Show();

MessageBox(Handle, sErrorMessage, "Вы таки уверены?", MB_OK|MB_ICONERROR);

TDstElement->SetFocus();

return false;

} else {

memoLog->Lines->Add(TimeToStr(Time()) + ": Инициализация прошла успешно. Начинаю обработку.");

return true;

}

}

void TForm1::initMatrix()

{

pVectorX = new long double[iValueN];

pVectorX0 = new long double[iValueN];

pVectorB = new long double[iValueN];

pMatrixA = new long double *[iValueN];

for (int i = 0; i < iValueN; i++) {

pMatrixA[i] = new long double[iValueN];

}

gridMatrixA->ColCount = iValueN;

gridMatrixA->RowCount = iValueN;

gridVectorB->RowCount = iValueN;

gridVectorX->RowCount = iValueN + 3;

gridVectorX->ColCount = 2;

gridWork->RowCount = iValueN + 3;

gridWork->ColCount = 2;

for (int i = 0; i < iValueN; i++) {

gridVectorX->Cells[0][i] = "X" + IntToStr(i);

gridWork->Cells[0][i] = "X" + IntToStr(i);

}

gridVectorX->Cells[0][iValueN] = "щ(i)";

gridVectorX->Cells[0][iValueN + 1] = "е(i)";

gridVectorX->Cells[0][iValueN + 2] = "it";

gridWork->Cells[0][iValueN] = "щ(i)";

gridWork->Cells[0][iValueN + 1] = "е(i)";

gridWork->Cells[0][iValueN + 2] = "i";

for (int i = 0; i < iValueN; i++) {

if (i == 0 || i == iValueN - 1) {

pVectorB[i] = 0;

gridVectorB->Cells[0][i] = "0";

} else {

pVectorB[i] = dValueD;

gridVectorB->Cells[0][i] = FloatToStr(dValueD);

}

for (int j = 0; j < iValueN; j++) {

if (i == j) {

if (i == 0 || i == iValueN - 1) {

pMatrixA[i][j] = dValueQ;

gridMatrixA->Cells[i][j] = FloatToStr(dValueQ);

} else {

pMatrixA[i][j] = -2.0;

gridMatrixA->Cells[i][j] = FloatToStr(-2.0);

}

} else if (i == j - 1 || i == j + 1) {

pMatrixA[i][j] = 1.0;

gridMatrixA->Cells[i][j] = FloatToStr(1.0);

} else {

pMatrixA[i][j] = 0;

gridMatrixA->Cells[i][j] = "0";

}

}

}

memoLog->Lines->Add(TimeToStr(Time()) + ": Рабочие элементы заполнены. Начинаю считать.");

}

void TForm1::goAction()

{

memoLog->Lines->Add(

TimeToStr(Time()) + ": Значение параметра релаксации изменяется от " + FloatToStr(dMinW)

+ " до " + FloatToStr(dMaxW) + " с шагом " + FloatToStr(dStepW) + "."

);

for (double dCurW = dMinW; dCurW <= dMaxW; dCurW += dStepW) {

getIterationW(dCurW);

}

resultBox->Caption = TimeToStr(Time()) + ". После непродолжительных размышлений я прихожу к выводу,\nчто оптимальное значение параметра релаксации " + FloatToStr(dGoodW)

+ ".\nКоличество итераций в таком случае составит " + IntToStr(iMinIterations)

+ ".\nПогрешность: " + FloatToStr(dGoodE) + " < " + FloatToStr(dValueE) + ".";

}

int TForm1::getIterationW(long double dCurW)

{

int iCurIteration = 0;

long double dCurDe = 0;

memoLog->Lines->Add(

TimeToStr(Time()) + ": Устанавливаем значение параметра релаксации " + FloatToStr(dCurW) + "."

);

for (int i = 0; i < iValueN; i++) {

pVectorX[i] = 1;

pVectorX0[i] = 1;

}

do {

dCurDe = getIterationD(dCurW);

for (int i = 0; i < iValueN; i++) {

pVectorX0[i] = pVectorX[i];

}

iCurIteration++;

writeLogIterationD(iCurIteration, dCurW, dCurDe);

} while (iCurIteration < 150 && dCurDe > dValueE);

if (iMinIterations == 0) {

iMinIterations = iCurIteration;

dGoodW = dCurW;

dGoodE = dCurDe;

} else if (iCurIteration < iMinIterations) {

iMinIterations = iCurIteration;

dGoodW = dCurW;

dGoodE = dCurDe;

}

memoLog->Lines->Add(

TimeToStr(Time()) + ": Расчёт окончен. Выполненных итераций :" + IntToStr(iCurIteration) + "."

);

writeIterationResult(dCurW, iCurIteration, dCurDe);

return iCurIteration;

}

long double TForm1::getIterationD(long double dCurW)

{

long double dTempValue = 0;

long double dCurDe = 0, dLocalDe = 0;

for (int i = 0; i < iValueN; i++) {

dTempValue = pVectorB[i];

for (int j = 0; j < iValueN; j++) {

if (i != j) {

dTempValue = dTempValue - pMatrixA[i][j] * pVectorX0[j];

}

}

dTempValue = dTempValue / pMatrixA[i][i];

dTempValue = dTempValue * dCurW + (1 - dCurW) * pVectorX[i];

dLocalDe = fabsl(pVectorX[i] - dTempValue);

pVectorX[i] = dTempValue;

if (dLocalDe > dCurDe) {

dCurDe = dLocalDe;

}

}

return dLocalDe;

}

void TForm1::writeLogIterationD(int iCurIteration, long double dCurW, long double dCurDe)

{

for (int i = 0; i < iValueN; i++) {

gridWork->Cells[gridWork->ColCount - 1][i] = FloatToStr(pVectorX[i]);

}

gridWork->Cells[gridWork->ColCount - 1][iValueN] = FloatToStr(dCurW);

gridWork->Cells[gridWork->ColCount - 1][iValueN + 1] = FloatToStr(dCurDe);

gridWork->Cells[gridWork->ColCount - 1][iValueN + 2] = IntToStr(iCurIteration);

gridWork->ColCount++;

}

TForm1::writeIterationResult(long double dCurW, int iCurIteration, long double dCurDe)

{

for (int i = 0; i < iValueN; i++) {

gridVectorX->Cells[gridVectorX->ColCount - 1][i] = FloatToStr(pVectorX[i]);

}

gridVectorX->Cells[gridVectorX->ColCount - 1][iValueN] = FloatToStr(dCurW);

gridVectorX->Cells[gridVectorX->ColCount - 1][iValueN + 1] = FloatToStr(dCurDe);

gridVectorX->Cells[gridVectorX->ColCount - 1][iValueN + 2] = IntToStr(iCurIteration);

gridVectorX->ColCount++;

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

iMinIterations = 0;

dGoodW = 0;

}

//---------------------------------------------------------------------------

39

Соседние файлы в предмете Программирование