- •Лабораторный практикум
- •Содержание
- •Комплексное задание №1 решение систем линейных уравнений
- •Комплексное задание №2 Аппроксимация функций
- •Комплексное задание №3 Вычисление определенных интегралов
- •Комплексное задание №4 Решение нелинейных уравнений
- •Комплексное задание №5 Решение систем дифференциальных уравнений
- •Литература
Комплексное задание №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] любым из рассмотренных методов в программе необходимо:
В классе, который осуществляет решение конкретной задачи описать процедуры вычисления конкретной функции 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;
……
……
Реализовать вычисление требуемой функции аналитически или по формулам аппроксимации, например
……
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;
……
Вычислить корень уравнения и представить результаты, например
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;
Интерфейсный модуль для ввода данных и графической визуализации результатов.
На данном этапе полагается, что студент в достаточной степени овладел возможностями визуализации исходных данных и результатов расчетов и может самостоятельно придумать и реализовать интерфейс своей программы. Остановимся лишь на основных требованиях к интерфейсному модулю
Модуль должен содержать стандартное меню, с помощью которого организуется возможности сохранения/считывания данных и управления процессом вычислений.
Должна быть обеспечена возможность редактирования табличной функции и значение величины e, на основании которой принимается решение о завершении численной процедуры.
Во всех компонентах интерфейсного модуля обязательно должна проводится проверка корректности ввода данных.
Должна быть обеспечена возможность выбора метода решения
Сама функция и результаты расчетов на каждой итерации (так называемая «траектория поиска») должны быть представлены графически.
На момент окончания решения пользователю предоставляется следующая информация: корректно ли завершена задача, значение корня уравнения и количество итераций, затраченное на его поиск
Исследование выбора метода решения на скорость сходимости
В заключении работы проводится исследование скорости сходимости различных методов, определяются их преимущества и недостатки, а также влияние комбинации методов на скорость сходимости. Показать на примере, что использование метода Ньютона существенно зависит от выбора начального приближения.
Полученные результаты оформляются в виде отчета, в котором представляются основные результаты работы, приводятся необходимые графики и делаются выводы по проделанной работе. Отчет готовится в виде электронного документа, подготовленного в редакторе MS Word, и предоставляется при защите работы.
