Автор работы: Пользователь скрыл имя, 30 Ноября 2013 в 13:35, курсовая работа
В настоящее время не существует методов, которые в одинаковой мере были бы хороши для всех систем ЛАУ. Почти все методы являются ориентированными и учитывают тем или иным образом специальные свойства матриц систем ЛАУ.
В курсовом проекте я рассматриваю метод скорейшего спуска. Этот метод не входит в число методов, которые широко используются и часто встречаются в литературе. Он реже используется в практике вычислений, но тем не менее содержит глубокие идеи и входит в основы теории вычислительной алгебры.
Введение………………………………………………………...2
1. Метод градиента (метод скорейшего спуска) для случая системы нелинейных уравнений……………………….……….3
2. Метод скорейшего спуска для случая системы линейных уравнений…………………………………………………………..11
3. Свойства приближений метода скорейшего спуска……17
Заключение……….………….…………………………………25
Список использованной литературы…………
(4*)
при всех i=1, 2, ... n.
Теперь из (3*) в силу (4*) получим
Лемма доказана.
Введем в рассмотрение понятие функции ошибки, определив ее формулой
G(x)=(Ae,e) (5*)
Где e=х*-х – вектор ошибки, х*-точное решение системы Ах=f.
Имеет место
Лемма 2.
Последовательность значений функции ошибки G(x(0)), G(x(1)),..., G(x(p)). Где х(р) определяются формулами (5*) , стремится к 0 при р стремящемся к бесконечности.
Доказательство:
В силу формул (5) имеем
значит,
(6*)
где
Оценим снизу величину qp.
Пусть
-собственные значения матрицы А, и u1, u2, ..., un –принадлежащие им собственные векторы, ортогональные друг к другу и нормированные так, что (ui,ui)=1 при i=1, 2, ..., n.
Все li >0 , т.к. А - положительно определенная матрица.
Пусть
Разложим вектор rp по собственным векторам матрицы А:
rp=c1u1+c2u2+...+cnun (7*)
так как под rp мы понимаем ненулевой вектор невязок системы, то в разложении (7*) не все с равны 0. имеем
Следовательно
Теперь для qp получим
В силу формулы (1*) отсюда следует
Значит
Далее получим
или
(8*)
Коэффициент <1, поэтому из (8*) следует, что
при .
Лемма доказана.
Теорема
Последовательные приближения х0, х1, х2…, построенные по методу скорейшего спуска, сходятся к решению системы Ax=f со скоростью геометрической прогрессии.
Доказательство
Из Леммы 2 следует, что
при
А это означает, что
при ,так как матрица А – положительноопределенная. Определим теперь скорость сходимости. Имеем
(9*)
где e(p) =x(*)-x(p).
Из (8*) и (9*) следует оценка
Означающая, что стремится к нулю со скоростью геометрической прогрессии. Теорема доказана.3
Заключение.
В курсовом проекте был рассмотрен метод скорейшего спуска для нахождения корней линейных и нелинейных алгебраических уравнений. В ходе работы, мы на примерах убедились, что этот метод позволяет находить приближенные корни систем с достаточной точностью и за конечное число шагов. Отсюда можно сделать вывод, что метод можно применять для эффективного решения реальных задач.
список использованной литературы.
3.Симонович Сергей
Виталиевич, Евсеев Георгий Александрович,
“Занимательное
Приложение 1.
Описание программы.
Программа написана на языке С++ и скомпилирована в среде Turbo C++ 3.0 для DOS.
Ввод данных осуществляется из файла. Результаты вычислений выводятся на экран
и в файл. При написании
программы использован
Приложение 2.
Листинг программы.
******************************
Решение систем линейных алгебраических уравнений методом скорейшего спуска.
******************************
#include <math.h>
#include <conio.h>
#include "matrix6.cpp"
double norma(TMatrix<double> &x)
{
double res=0;
int m=x.getSizeRow(), n=x.getSizeCol();
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
{
res+=x(i,j)*x(i,j);
}
}
return sqrt(res);
}
//решение СЛАУ методом наискорейшего спуска
TMatrix<double> linearSolveFastDescent(
TMatrix<double> &b,//правая часть
double sigma, //погрешность
long max_step) //максю кол-во шагов
{
int n=a.getSizeRow();
TMatrix<double> x(b), a_tr(a.getTranspose()), r(n,1), s(n,1);
for(long k=0; k<max_step; k++)
{
r=b-a*x;
s=a_tr*r;
x+=(r%r)/(s%s)*s;
if(norma(r)<sigma)
{
break;
}
}
cout<<"число шагов: "<<k<<endl;
if(k==max_step)
{
cout<<"заданная точность не достигнута "<<endl;
}
return x;
}
void main(void)
{
char ch;
TMatrix<double> a_b;
double sigma=.0000001;
long max_step=10000;
cout.setf(ios::showpoint);
for(;;)
{
clrscr();
cout<<"Решение СЛАУ"<<endl
<<"Метод скорейшего спуска "<<endl<<endl
<<"1 - ввести данные из файла"<<endl
<<"2 - ввести погрешность<<endl
<<"3 - ввести максимальное кол-во шагов<<endl
<<"4 - решить СЛАУ"<<endl<<endl
<<"Esc - выход"<<endl<<endl<<endl;
do
{
ch=getch();
}
while(ch!='1' && ch!='2' && ch!='3' && ch!='4' && ch!=27);
switch(ch)
{
case '1':
{
clrscr();
char str[20];
cout<<"введите имя файла:"<<endl;
cin>>str;
ifstream in_file(str);
if(in_file)
{
int n;
in_file>>n;
a_b.setSize(n,n+1);
a_b.readArray(in_file);
a_b.writeArray(cout);
}
else
{
cout<< не могу открыть файл\"”<<str<<"\""<<endl;
}
getch();
break;
}
case '2':
{
clrscr();
cout<<"введите погрешность"<<sigma<<"): ";
cin>>sigma;
break;
}
case '3':
{
clrscr();
cout<<"введите максимальное количество шагов"<<max_step<<"): ";
cin>>max_step;
break;
}
case '4':
{
TMatrix<double> x;
clrscr();
cout<<"Решение СЛАУ“"<<endl;
cout<<"Расширенная матрица системы"<<endl;
a_b.writeArray(cout);
cout<<"Погрешность: "<<sigma<<endl;
cout<<"Максимальное кол-во шагов: "<<max_step<<endl;
int n=a_b.getSizeRow();
TMatrix<double> a(a_b.getPart(1,1,n,n)), b(a_b.getCol(n+1));
x=linearSolveFastDescent(a,b,
cout<<"решение: "<<endl;
x.writeArray(cout);
ofstream out_file("result.txt");
if(out_file)
{
out_file<<"Решение СЛАУ“"<<endl;
out_file<<"Расширенная матрица системы:"<<endl;
a_b.writeArray(out_file);
out_file<<"Погрешность: "<<sigma<<endl;
out_file<<"Максимальное количество шагов: "<<max_step<<endl;
out_file<<"Решение: "<<endl;
x.writeArray(out_file);
}
else
{
cout<<"не могу создать файл\"result.txt\""<<endl;
}
getch();
break;
}
case 27:
{
return;
}
} }
}
Приложение 3.
******************************
Шаблон класса "Матрица"
******************************
#ifndef MATRIX6_CPP
#define MATRIX6_CPP
#include <assert.h>
#include <iostream.h>
template<class TYPE>
class TMatrix
{
friend TMatrix operator+ (TYPE, TMatrix &); //сложение со скаляром
friend TMatrix operator- (TYPE, TMatrix &); //вычитание со скаляром
friend TMatrix operator* (TYPE, TMatrix &); //умножение на скаляр
friend istream& operator>> (istream &, TMatrix &); //ввод матрицы
friend ostream& operator<< (ostream &, TMatrix &); //вывод матрицы
public:
TMatrix (); //конструктор по умолчанию
TMatrix (TMatrix &); //конструктор копирования
TMatrix (int, int); //конструктор с заданием
//размера
~TMatrix (); //деструктор
void init (TYPE c); //инициализация числом
void initStat (TYPE *p, int, int);//инициализ. статич.
//массивом
void initDynam (TYPE **p, int, int);//инициализ. динамич.
//массивом
void setSize (int, int); //установка размера
int getSizeRow (); //кол-во строк
int getSizeCol (); //кол-во столбцов
TYPE & operator() (int, int); //элемент матрицы
TYPE & operator[] (int); //элемент
//матрицы-вектора
TMatrix & operator= (TMatrix &); //присваивание
TMatrix getRow (int); //строка
TMatrix getCol (int); //столбец
void setRow (int, TMatrix &); //задать строку
void setCol (int, TMatrix &); //задать столбец
TMatrix getPart (int, int, int, int); //получить часть
void setPart (int, int, TMatrix &); //задать часть
void swapRow (int, int); //обмен строк
void swapCol (int, int); //обмен столбцов
TMatrix operator+ (TMatrix &); //сложение матриц
TMatrix operator- (TMatrix &); //вычитание матриц
TMatrix operator* (TMatrix &); //умножение матриц
TMatrix operator^ (TMatrix &); //умножение матриц
//(перемножение
//соответствующих
//элементов)
TMatrix & operator+= (TMatrix &); //присваивания
TMatrix & operator-= (TMatrix &);
TMatrix & operator*= (TMatrix &);
TMatrix & operator^= (TMatrix &);
TMatrix getTranspose (); //транспонирование
TMatrix & setSingle (int n); //сделать единичной
TMatrix operator+ (TYPE); //операции со скалярами
TMatrix operator- (TYPE);
TMatrix operator* (TYPE);
TMatrix operator/ (TYPE);
TMatrix & operator+= (TYPE);
TMatrix & operator-= (TYPE);
TMatrix & operator*= (TYPE);
TMatrix & operator/= (TYPE);
TMatrix operator- ();
TYPE operator% (TMatrix &); //скалярное умножение для
//матриц-векторов
int readSize (istream &); //чтение размеров
int readArray (istream &); //чтение массива
int writeSize (ostream &); //запись размеров
int writeArray (ostream &); //запись массива
private:
TYPE **
array;
int
sizeRow;
int sizeCol; //кол-во столбцов
void error (int); //сообщение об ошибке
};
template<class TYPE>
TMatrix<TYPE>::TMatrix()
{
array=NULL;
sizeRow=0;
sizeCol=0;
}
template<class TYPE>
TMatrix<TYPE>::TMatrix(
{
array=NULL;
sizeRow=0;
sizeCol=0;
if(m.sizeRow>0 && m.sizeCol>0)
{
sizeRow=m.sizeRow;
sizeCol=m.sizeCol;