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

Метод последовательных приближений. Требования к аппаратным ресурсам и программным средствам разработки. Руководство пользователя, тестовые примеры. Тестирование приложения: ввод вычислений, рисование графика функции. Особенности применения программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 27.08.2012
Размер файла 773,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

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

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

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

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

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

Первый этап реализуется различными способами. Приближенное значение корня может быть известно, например, из физического смысла задачи. При выделении области, в пределах которой находятся вещественные корни уравнения, можно воспользоваться следующим обстоятельством. Если на концах некоторого отрезка значение непрерывной функции 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. Инструменты разработки

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

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

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

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

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

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

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

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

В левом нижнем углу расположена панель, содержащая компоненты TCheckBox, TLabeledEdit, TButton.

TCheckBox с надписью «Анимировать процесс» определяет, будет ли замедлена прорисовка отдельных линий на графике. В поле 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.pas

unit UnitEquation;

interface

uses Chart, Series, Forms, Windows, StdCtrls, SysUtils, Graphics;

type

TEquation = class

private

fResult: extended;

fAccuracy: extended;

fToAnimate: boolean;

fLabelPodskazka: TLabel;

fLineSeriesFx: TLineSeries;

fLineBisector: TLineSeries;

fPoint: TPointSeries;

function Func(x: extended): extended;

function Phi(x: extended): extended;

procedure DrawMainFunc;

function FindApproxTrunc: extended;

procedure DrawBisector;

procedure DrawFuncPhi;

function FindCrossing(approxTrunc: extended): extended;

function DrawVertical(x0: extended): extended;

function DrawHorizontal(x0: extended): extended;

procedure DrawTrunc;

procedure ChangeAxes(leftMin, leftMax, bottomMin, bottomMax: extended);

public

constructor Create(Chart: TChart; labelPodskazka: TLabel);

function FindResult: extended;

property Accuracy: extended read fAccuracy write fAccuracy;

property ToAnimate: boolean read fToAnimate write fToAnimate;

property Result: extended read fResult;

end;

implementation

constructor TEquation.Create(Chart: TChart; labelPodskazka: TLabel);

begin

fLineSeriesFx := TLineSeries.Create(Chart);

fLineSeriesFx.Pen.Width := 2;

Chart.AddSeries(fLineSeriesFx);

fLineBisector := TLineSeries.Create(Chart);

fLineBisector.Pen.Width := 2;

Chart.AddSeries(fLineBisector);

fPoint := TPointSeries.Create(Chart);

Chart.AddSeries(fPoint);

fLabelPodskazka := labelPodskazka;

end;

function TEquation.FindResult: extended;

var approxTrunc: extended;

begin

fLineSeriesFx.Clear;

fLineBisector.Clear;

fPoint.Clear;

fLabelPodskazka.Caption := 'Рисуем график исходной функции';

DrawMainFunc;

fLabelPodskazka.Caption := 'Находим приближенное значение корня';

approxTrunc := FindApproxTrunc;

fLabelPodskazka.Caption := 'Приближенное значение: x = ' + FloatToStr(approxTrunc);

Application.ProcessMessages;

Sleep(3000);

fPoint.Clear;

fLabelPodskazka.Caption := 'Строим биссектрису';

DrawBisector;

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

DrawFuncPhi;

fLabelPodskazka.Caption := 'Ищем пересечение с биссектрисой';

fResult := FindCrossing(approxTrunc);

fLabelPodskazka.Caption := 'Корень найден: x = ' + FloatToStrF( fResult,ffFixed, 4, 3);

DrawTrunc;

end;

procedure TEquation.DrawMainFunc;

var x: extended;

begin

fLineSeriesFx.Clear;

ChangeAxes(-20, 25, -0.5, 4.5);

x := 0.0001;

while x <= 4 do

begin

if fToAnimate then

begin

Application.ProcessMessages;

Sleep(1);

end;

fLineSeriesFx.AddXY(x, Func(x));

x := x + 0.01;

end;

end;

function TEquation.FindApproxTrunc: extended;

var x: extended;

begin

x := 1;

fPoint.Clear;

fPoint.Color := clGreen;

while abs(Func(x)) > 3 do

begin

if fToAnimate then

begin

Application.ProcessMessages;

Sleep(500);

end;

fPoint.Clear;

fPoint.AddXY(x, Func(x));

x := x + 0.5;

end;

Result := x - 0.5;

end;

procedure TEquation.DrawBisector;

var x: extended;

begin

fLineSeriesFx.Clear;

ChangeAxes(1.5, 4.5, 1.5, 4.5);

x := 2;

while x <= 4 do

begin

if fToAnimate then

begin

Application.ProcessMessages;

Sleep(8);

end;

fLineSeriesFx.AddXY(x, x);

x := x + 0.01;

end;

end;

procedure TEquation.DrawFuncPhi;

var x: extended;

begin

x := 2;

while x <= 4 do

begin

if fToAnimate then

begin

Application.ProcessMessages;

Sleep(1);

end;

fLineBisector.AddXY(x, Phi(x));

x := x + 0.01;

end;

end;

function TEquation.FindCrossing(approxTrunc: extended): extended;

var newResult, oldResult: extended;

begin

oldResult := approxTrunc;

DrawVertical(approxTrunc);

newResult := DrawHorizontal( approxTrunc );

while abs((newResult - oldResult)/oldResult) >= fAccuracy do

begin

oldResult := newResult;

DrawVertical(oldResult);

newResult := DrawHorizontal(oldResult );

end;

Result := newResult;

end;

function TEquation.DrawVertical(x0: extended): extended;

var Line: TLineSeries;

y : extended;

bound : extended;

step: extended;

begin

Line := TLineSeries.Create(fLineSeriesFx.ParentChart);

Line.Color := clBlack;

Line.Pen.Width := 1;

fLineSeriesFx.ParentChart.AddSeries( Line );

y := 2;

bound := Phi(x0);

step := (bound - y )/50;

while y < bound + step/2 do

begin

if fToAnimate then

begin

Application.ProcessMessages;

end;

Line.AddXY(x0, y);

y := y + step;

end;

Result:= y - step;

end;

function TEquation.DrawHorizontal(x0: extended): extended;

var Line: TLineSeries;

x : extended;

bound : extended;

toRight: boolean;

step: extended;

begin

Line := TLineSeries.Create(fLineSeriesFx.ParentChart);

Line.Color := clBlack;

Line.Pen.Width := 1;

fLineSeriesFx.ParentChart.AddSeries( Line );

toRight := Phi(x0) > x0;

x := x0;

bound := Phi(x0);

step := abs(( bound - x)/50);

while (x > bound - step/2 + 2*step*(integer(toRight))) xor toRight do

begin

if fToAnimate then

begin

Application.ProcessMessages;

end;

Line.AddXY(x, bound);

x := x - step + 2*step*(integer(toRight));

end;

Result:= x + step - 2*step*(integer(toRight));

end;

procedure TEquation.DrawTrunc;

begin

end;

procedure TEquation.ChangeAxes(leftMin, leftMax, bottomMin, bottomMax: extended);

begin

fLineSeriesFx.ParentChart.Axes.Left.Minimum := leftMin;

fLineSeriesFx.ParentChart.Axes.Left.Maximum := leftMax;

fLineSeriesFx.ParentChart.Axes.Bottom.Minimum := bottomMin;

fLineSeriesFx.ParentChart.Axes.Bottom.Maximum := bottomMax;

end;

function TEquation.Func(x: extended): extended;

begin

Result := exp(x) + ln(x) - 10*x;

end;

function TEquation.Phi(x: extended): extended;

begin

Result := x - 0.07*Func(x);

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Разработка программного обеспечения решения задач численного вычисления определенных интегралов. Анализ задачи, методы, инструменты: требования к аппаратным ресурсам и программным средствам. Руководство пользователя, тестирование приложения, применение.

    курсовая работа [1,6 M], добавлен 27.08.2012

  • Выбор и обоснование выбора среды разработки. Разработка алгоритма работы программы, проектирование системы меню. Общее описание программы: назначение и область применения, интерфейс, требования к аппаратным и программным ресурсам, тестирование и листинг.

    курсовая работа [543,2 K], добавлен 20.05.2013

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

    реферат [14,1 K], добавлен 29.01.2009

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

    курсовая работа [96,6 K], добавлен 02.06.2012

  • Метод хорд решения нелинейных уравнений. Вычисление интеграла методом Симпсона. Процесс численного решения уравнения. Окно программы расчета корней уравнения методом хорд. Алгоритм вычисления интеграла в виде блок-схемы. Выбор алгоритма для вычислений.

    курсовая работа [832,6 K], добавлен 24.07.2012

  • Разработка программы для нахождения корней нелинейных уравнений несколькими методами: методом хорд, касательных, половинного деления, итераций. Реализации программы с помощью системы программирования Delphi 7. Методика работы пользователя с программой.

    курсовая работа [1,3 M], добавлен 11.02.2013

  • Разработка проекта по вычислению корней нелинейных уравнений методом итераций, в среде программирования Delphi. Интерфейс программы и ее программный код, визуализация метода. Сравнение результатов решения, полученных в Mathcad 14 и методом итераций.

    контрольная работа [1,9 M], добавлен 10.12.2010

  • Обзор существующих методов по решению нелинейных уравнений. Решение нелинейных уравнений комбинированным методом и методом хорд на конкретных примерах. Разработка программы для решения нелинейных уравнений, блок-схемы алгоритма и листинг программы.

    курсовая работа [435,8 K], добавлен 15.06.2013

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

    курсовая работа [423,0 K], добавлен 17.02.2010

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

    контрольная работа [694,4 K], добавлен 07.08.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.