Программа для вычисления корней нелинейных уравнений итерационным методом

 

1. Анализ задачи


.1 Исследование предметной области


В практике научных и инженерных расчетов часто возникает необходимость решения уравнений вида f(x) = 0. Если функция представляет многочлен, то данное уравнение называется алгебраическим. Если находится под знаком транстендентной функции (показательной, логарифмической, тригонометрической и т.п.), уравнение называется транстендентным. Значение х, при котором выполняется условие f(x) = 0, называется корнем уравнения.

В общем случае функции f(x) = 0 не имеют аналитических формул для своих корней. Однако точное решение уравнения не является необходимым. Действительно, встречающиеся на практике уравнения часто содержат коэффициенты, величины которых имеют приближенные значения. В силу этого разработаны численные методы уравнений, которые позволяют определять приближенные значения корней с заданной степенью точности.

Процесс отыскания корня уравнения состоит из двух этапов:

) нахождение приближенного значения корня;

) уточнение приближенного значения до некоторой заданной степени точности.

Первый этап реализуется различными способами. Приближенное значение корня может быть известно, например, из физического смысла задачи. При выделении области, в пределах которой находятся вещественные корни уравнения, можно воспользоваться следующим обстоятельством. Если на концах некоторого отрезка значение непрерывной функции f(x) имеет разные знаки, то на этом отрезке уравнение f(x) = 0 имеет хотя бы один корень.

В инженерной практике распространен графический способ определения приближенных корней. В этом случае строится график функции y = f(x) , абсциссы точек пересечения которого с осью Ox дадут приближенные значения корней. Иногда удается подобрать более простое уравнение, корни которого находятся вблизи корней исходного уравнения. Существует также ряд специальных аналитических методов приближенного нахождения корней многочленов.

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

метод деления отрезка пополам;

метод последовательных приближений (метода итераций);

метод Ньютона (метод касательных).

Рассмотрим подробнее метод итераций, т.к. он и является предметом моей курсовой работы.


1.2 Метод последовательных приближений (метода итераций)


Уравнение f(x) = 0 можно представить в форме x = ?(x). Например, можно выделить x, а остальное перенести в правую часть. Можно также выполнить следующее преобразование: x = x + cf(x), где с - произвольная постоянная. x[0] задается начальным приближением, а последующие приближения определяются итерационной процедурой вида: x[n + 1] = ?(x[n]). Процесс продолжается до тех пор, пока относительная точность для двух последовательных приближений не станет меньше заданной погрешности.

2. Инструменты разработки


.1 Требования к аппаратным ресурсам


Данное программное обеспечение было разработано на компьютере на базе процессора Intel в операционной системе Windows 7. Предполагается, что приложение сможет запуститься на любом компьютере с более-менее современной комплектацией. Тестирование приложение проходило также в ОС Windows XP, сбоев в работе обнаружено не было.


2.2 Требования к программным средствам разработки


Для просмотра либо редактирования файлов проекта необходимо иметь установленное в системе программное обеспечение RAD Studio 2012 либо Delphi 2007. Среда Delphi была выбрана в силу того, что она является известной широкому кругу программистов и идеально подходит для обучения визуальному программированию.

3. Руководство пользователя


Разработанное мной приложение имеет достаточно простой, дружелюбный и интуитивно понятный интерфейс. При запуске файла Project1.exe на дисплее появляется главная форма приложения (Рисунок 1).


Рисунок 1 - Главная форма приложения


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

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

Кнопка закрыть, расположенная в нижнем правом углу, закрывает приложение.

4. Тестовые примеры


Для тестирования приложения было выбрано уравнение exp(x) + ln(x) - 10x = 0. Аналитическое рассмотрение данного уравнения показало, что оно имеет корень на интервале (0, 4). При х > 4 значение функции y = exp(x) + ln(x) - 10x значительно возрастает, и поэтому данные значения х мы рассматривать не будем. Приближенные вычисления показали, что корень данного уравнения х0 приблизительно равен 3,5. Перейдем к тестированию приложения, чтобы проверить данное приближенное значение и уточнить его до нужной нам точности.

5. Тестирование приложения


Запускаем наше приложение. В поле «Точность» вводим нужную нам точность вычислений (Рисунок 2).


Рисунок 2 - Ввод точности вычислений


Далее проверяем, что переключатель «Анимировать процесс» находится во включенном состоянии (Рисунок 3).


Рисунок 3 - Установка переключателя во включенное состояние

Подготовительная часть завершена, теперь можно запускать основную программу вычисления корня уравнения. Для этого нажимаем на кнопку «Решить».

Над графиком появляется компонент TLabel, который отображает текущее состояние вычислительного процесса. Первый этап вычисления - рисование графика исходной функции (Рисунок 4).


Рисунок 4 - Рисование графика исходной функции


Вторым этапом является нахождение приближенного значения корня уравнения (Рисунок 5).


Рисунок 5 - Поиск приближенного значения корня

Далее следует рисование графиков биссектрисы и вспомогательной функции, пересечение которых и будет являться корнем уравнения (Рисунок 6, 7).


Рисунок 6 - Построение биссектрисы


Рисунок 7 - Построение графика вспомогательной функции

Заключительным и самым главным этапом вычисления является итеративный процесс нахождения пересечения графиков биссектрисы и вспомогательной функции (Рисунок 8).


Рисунок 8 - Поиск пересечения графиков


Когда точность найденного корня достигнет требуемой точности программа завершит свою работу и выведет результат в компонент TLabel, расположенный вверху окна приложения (Рисунок 9).


Рисунок 9 - Завершение вычислительного процесса


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

6. Применение программы


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

Приложение

программа последовательный приближение

// Модуль UnitEquation.pasUnitEquation;Chart, Series, Forms, Windows, StdCtrls, SysUtils, Graphics;= class: extended;: extended;: boolean;: TLabel;: TLineSeries;: TLineSeries;: TPointSeries;Func(x: extended): extended;Phi(x: extended): extended;DrawMainFunc;FindApproxTrunc: extended;DrawBisector;DrawFuncPhi;FindCrossing(approxTrunc: extended): extended;DrawVertical(x0: extended): extended;DrawHorizontal(x0: extended): extended;DrawTrunc;ChangeAxes(leftMin, leftMax, bottomMin, bottomMax: extended);Create(Chart: TChart; labelPodskazka: TLabel);FindResult: extended;Accuracy: extended read fAccuracy write fAccuracy;ToAnimate: boolean read fToAnimate write fToAnimate;Result: extended read fResult;;TEquation.Create(Chart: TChart; labelPodskazka: TLabel);:= TLineSeries.Create(Chart);.Pen.Width := 2;.AddSeries(fLineSeriesFx);:= TLineSeries.Create(Chart);.Pen.Width := 2;.AddSeries(fLineBisector);:= TPointSeries.Create(Chart);.AddSeries(fPoint);:= labelPodskazka;;TEquation.FindResult: extended;approxTrunc: extended;.Clear;.Clear;.Clear;.Caption := 'Рисуем график исходной функции';;.Caption := 'Находим приближенное значение корня';:= FindApproxTrunc;.Caption := 'Приближенное значение: x = ' + FloatToStr(approxTrunc);.ProcessMessages;(3000);.Clear;.Caption := 'Строим биссектрису';;

fLabelPodskazka.Caption := 'Рисуем график вспомогательной функции';;.Caption := 'Ищем пересечение с биссектрисой';

fResult := FindCrossing(approxTrunc);.Caption := 'Корень найден: x = ' + FloatToStrF( fResult,ffFixed, 4, 3);;;TEquation.DrawMainFunc;x: extended;.Clear;(-20, 25, -0.5, 4.5);:= 0.0001;x <= 4 dofToAnimate then.ProcessMessages;(1);;.AddXY(x, Func(x));:= x + 0.01;;;TEquation.FindApproxTrunc: extended;x: extended;:= 1;.Clear;.Color := clGreen;abs(Func(x)) > 3 dofToAnimate then.ProcessMessages;(500);;.Clear;.AddXY(x, Func(x));:= x + 0.5;;:= x - 0.5;;TEquation.DrawBisector;x: extended;.Clear;(1.5, 4.5, 1.5, 4.5);:= 2;x <= 4 dofToAnimate then.ProcessMessages;(8);;.AddXY(x, x);:= x + 0.01;;;TEquation.DrawFuncPhi;x: extended;:= 2;x <= 4 dofToAnimate then.ProcessMessages;(1);;.AddXY(x, Phi(x));:= x + 0.01;;;TEquation.FindCrossing(approxTrunc: extended): extended;newResult, oldResult: extended;:= approxTrunc;(approxTrunc);:= DrawHorizontal( approxTrunc );abs((newResult - oldResult)/oldResult) >= fAccuracy do:= newResult;(oldResult);:= DrawHorizontal(oldResult );;:= newResult;;TEquation.DrawVertical(x0: extended): extended;Line: TLineSeries;: extended;: extended;: extended;:= TLineSeries.Create(fLineSeriesFx.ParentChart);.Color := clBlack;.Pen.Width := 1;.ParentChart.AddSeries( Line );:= 2;:= Phi(x0);:= (bound - y )/50;y < bound + step/2 dofToAnimate then.ProcessMessages;;.AddXY(x0, y);:= y + step;;:= y - step;;TEquation.DrawHorizontal(x0: extended): extended;Line: TLineSeries;: extended;: extended;: boolean;: extended;:= TLineSeries.Create(fLineSeriesFx.ParentChart);.Color := clBlack;.Pen.Width := 1;.ParentChart.AddSeries( Line );:= Phi(x0) > x0;:= x0;:= Phi(x0);:= abs(( bound - x)/50);(x > bound - step/2 + 2*step*(integer(toRight))) xor toRight dofToAnimate then.ProcessMessages;;.AddXY(x, bound);:= x - step + 2*step*(integer(toRight));;:= x + step - 2*step*(integer(toRight));;TEquation.DrawTrunc;;TEquation.ChangeAxes(leftMin, leftMax, bottomMin, bottomMax: extended);.ParentChart.Axes.Left.Minimum := leftMin;.ParentChart.Axes.Left.Maximum := leftMax;.ParentChart.Axes.Bottom.Minimum := bottomMin;.ParentChart.Axes.Bottom.Maximum := bottomMax;;TEquation.Func(x: extended): extended;:= exp(x) + ln(x) - 10*x;;TEquation.Phi(x: extended): extended;:= x - 0.07*Func(x);;.



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

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ