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

Комплексное задание №4 Решение нелинейных уравнений

Цель работы:

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

  • Приобретение навыков объектно-ориентированного программирования

  • Приобретение навыков работы со списками

  • Приобретение навыков работы в среде визуального программирования

Постановка задачи.

Имеется некоторая функция F(x), заданная аналитически или таблично. Известно, что на отрезке [a,b] функция имеет единственный корень. Требуется

  • Создать объектно-ориентированное представление задачи нахождения корня уравнения F(x)=0 на отрезке [a,b].

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

  • Создать интерфейсный модуль для ввода данных в диалоговом режиме и графической визуализации результатов

  • Провести исследование сходимости и быстродействия методов.

Требование к программе.

Программа должна на отрезке [a,b] находить корень уравнения F(x)=0, причем функция F(x) может быть заданна как аналитически, так и представлена в виде таблицы. Работа выполняется индивидуально в среде визуального программирования Delphi. При выполнении задания допускается использование только программных модулей и компонент, разработанных самим студентом, стандартных компонент, предоставляемых средой визуального программирования Delphi, а также модулей uCommon и uVector библиотеки Simulate1.

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

Решение нелинейных уравнений

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

Метод деления отрезка пополам (метод бисекции) состоит в следующем

Допустим, что нам удалось найти отрезок [a,b], в котором расположено искомое значение корня c=x, т.е. a<c<b. В качестве начального приближения корня с0 принимаем середину этого отрезка, т.е. c0=0.5*(a+b). Далее исследуем значения функции F(x) на концах отрезклв [a,c0] и [c0,b]. Тот отрезок, на концах которого F(x) принимает значения разных знаков и содержит искомый корень, поэтому его принимаем в качестве нового отрезка. Вторую половину отрезка [a,b], на которой знак F(x) не меняется, отбрасываем. В качестве следующего приближения корня принимается середина нового отрезка и т.д. Итерационный процесс продолжается до тех пор, пока значение функции F(x) после n-й итерации не станет меньшим по модулю некоторого заданного малого числа e.

Метод хорд

Пусть найден отрезок [a,b], на котором функция F(x) меняет знак. В данном методе процесс итераций состоит в том, что в качестве приближения к корню уравнения принимаются значения c0,c1,…. точек пересечения хорды с осью абсцисс.

Уравнение хорды AB имеет вид

Уравнение для точки пересечения ее с осью абсцисс (x=c0, y=0) имеет вид

Далее, сравнивая знаки величин F(a) и F(c0) делается вывод о том, на каком интервале находится корень уравнения. Другой отрезок отбрасывается. Следующая итерация состоит в определении нового приближения корня как точки пересечения хорды, построенной на базе оставшегося отрезка, с осью абсцисс. Итерационный процесс продолжается до тех пор, пока значение функции F(x) после n-й итерации не станет меньшим по модулю некоторого заданного малого числа e.

Метод Ньютона

Его отличие от метода хорд состоит в том, что на k-й итерации вместо хорды проводится касательная к кривой y=F(x) при x=ck и ищется точка пересечения касательной с осью абсцисс. При этом не обязательно задавать отрезок [a,b], содержащий корень уравнения, а достаточно лишь найти некоторое начальное приближение корня x=c0. Уравнение касательной, проведенной к кривой y=F(x) в точке M0 с координатами c0 и F(c0), имеет вид

отсюда можно найти следующее приближение корня c1 как абсциссу точки пересечения касательной с осью x (y=0):

Аналогично могут быть найдены и следующие приближения как точки пересечения с осью абсцисс касательных, проведенных в точках M1, M2 и т.д. Формула для n+1-го приближения имеет вид

при этом необходимо, чтобы F’(cn) не равнялась нулю. Итерационный процесс продолжается до тех пор, пока значение функции F(x) после n-й итерации не станет меньшим по модулю некоторого заданного малого числа e или

Комбинированный метод

Заключается в том, что на сначала применяется всегда сходящийся метод (например, бисекции или хорд), а после некоторого числа итераций – быстро сходящийся метод Ньютона.

Объектно-ориентированное представление задачи нахождения корня уравнения

В данном разделе представлены только основные рекомендации по объектно-ориентированному представлению задачи, на основе которых студент должен построит свою программу.

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

Type

TEquationRoot =class( TObject )

Private

FGetValueEvent : TGetValueEvent;

FOutput : TNotifyEvent

Protected

FIteration,

FErrorCode : integer

Function FX( aArgument : Double ) : Double; virtual;

Public

Constructor Create;

Destructor Destroy; override;

Function Calculate( aLeft, aRight : Double ) : Double; virtual;

Procedure Stop; virtual;

Property OnGetValue : TGetValueEvent read FGetValueEvent

write FGetValueEvent;

Property OnOutput : TNotifyEvent read FOnOutput write FOnOutput;

Property Iteration : integer read FIteration;

Property ErrorCode : integer read FErrorCode;

End;

Свойство Iteration информирует о номере текущей итерации. Должно быть использовано для принудительного завершения процесса вычислений при отсутствии сходимости. По окончании вычислений код завершения сохраняется в свойстве ErrorCode (например 0, если решение найдено без ошибок, 1 – если обнаружено отсутствие сходимости после определенного числа итераций, 2 – если в методе Ньютона производная стала равна 0 и т.д.).

Свойство OnOutput предназначено для контроля за работой методов и представлением результатов во время вычислений.

Процедура FX скрыта директивой Protected и предназначена для вычисления значения функции F(x). В базовом классе в ней может вызываться событие OnGetValue на вычисление функции (аналогичный подход был предложен в. Комплексном задании №2):

Function TEquationRoot.FX( aArgument : Double ) : Double;

Begin

Result := 0;

If Assigned(OnGetValue) then OnGetValue( self, aArgument, result);

End;

Примерный интерфейс класса, реализующего нахождения корня уравнения на отрезке [aLeft,aRight] имеет вид

TERxxxxx = class( TIntegrator )

Private

Protected

Public

Function Calculate( aLeft, aRight : Double ) : Double; override;

End;

Где TERxxxxx соответсвующий класс.

Для того, чтобы вычислить значение корня уравнения на отрезке [a,b] любым из рассмотренных методов в программе необходимо:

  1. В классе, который осуществляет решение конкретной задачи описать процедуры вычисления конкретной функции F(x), например

Type

TMyClass=class( TObject )

Private

……

procedure AnalyticFunction( Sender:TObject;

aArgument:Double;

var aValue:Double);

procedure TableFunction( Sender:TObject;

aArgument:Double;

var aValue:Double);

……

Protected

……

Public

……

procedure Run;

……

End;

……

……

  1. Реализовать вычисление требуемой функции аналитически или по формулам аппроксимации, например

……

procedure TMyClass.AnalyticFunction( Sender:TObject;

aArgument:Double;

var aValue:Double);

begin

aValue := ………

end;

……

procedure TMyClass.TableFunction( Sender:TObject;

aArgument:Double;

var aValue:Double);

begin

aValue := ………

end;

……

  1. Вычислить корень уравнения и представить результаты, например

procedure TMyClass.Run;

var EquationRoot: TEquationRoot; af,tf : Double;

begin

EquationRoot := TERxxxxx.Create;

……

EquationRoot.OnGetValue := self.AnaliticFunction;

Af := EquationRoot.Calculate( … Указать границы отрезка… );

……

EquationRoot.OnGetValue := self.TableFunction;

Tf := EquationRoot.Calculate( … Указать границы отрезка … );

……

Integral.Free;

end;

Интерфейсный модуль для ввода данных и графической визуализации результатов.

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

  1. Модуль должен содержать стандартное меню, с помощью которого организуется возможности сохранения/считывания данных и управления процессом вычислений.

  2. Должна быть обеспечена возможность редактирования табличной функции и значение величины e, на основании которой принимается решение о завершении численной процедуры.

  3. Во всех компонентах интерфейсного модуля обязательно должна проводится проверка корректности ввода данных.

  4. Должна быть обеспечена возможность выбора метода решения

  5. Сама функция и результаты расчетов на каждой итерации (так называемая «траектория поиска») должны быть представлены графически.

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

Исследование выбора метода решения на скорость сходимости

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

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