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

Автор работы: Пользователь скрыл имя, 10 Января 2011 в 01:14, курсовая работа

Описание работы

Целью курсовой работы является обретение и закрепление навыков применения информационных технологий и программирования при решении задач по специальности. В курсовой работе создаётся Windows-приложение на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое будет обеспечивать решение специализированных задач по решению систем нелинейных уравнений.

Содержание работы

ВВЕДЕНИЕ 7
1 ПОСТАНОВКА ЗАДАЧИ 10
2 РЕШЕНИЕ НЕЛИНЕЙНЫХ УРАВНЕНИЙ В СРЕДЕ DELPHI 11
2.1 Краткое описание сущности метода касательных 11
( метода секущих Ньютона) 11
2.1. Отделение корней и предварительный анализ. 11
2.2. Уточнение корней 14
2.2.1 Уточнение корней методом касательных 14
2.2.2 Уточнение корней методом хорд 17
2.2.3 Уточнение корней методом деления отрезка пополам 19
2.3 Разработка программного продукта в среде Delphi 23
2.4 Результаты тестирования программного продукта 31
4 СРАВНЕНИЕ РЕШЕНИЙ, ПОЛУЧЕННЫХ РАЗЛИЧНЫМИ СПОСОБАМИ 34
ЗАКЛЮЧЕНИЕ 36
СПИСОК ЛИТЕРАТУРЫ 37

Файлы: 1 файл

Курсовая задание 1 вариант 2.doc

— 1.12 Мб (Скачать файл)

      4. Решить задачу средствами MathCad или Maple.

      5. Построить график функции F(x,a) от x для параметра а, использовавшегося при отделении и уточнении корней.

            Примечание: Результаты решения должны быть представлены в виде таблицы, включающей решения уравнения F(x,a)=0.

 

    2 РЕШЕНИЕ НЕЛИНЕЙНЫХ  УРАВНЕНИЙ В СРЕДЕ  DELPHI

    2.1 Краткое описание  сущности метода  касательных

    ( метода секущих  Ньютона)

    Рассмотрим  решение задачи нахождения корней уравнения 

    

    на  отрезке [0,1; 5] методом касательных с точностью .  

    2.1. Отделение корней и предварительный анализ.

    Отделим корни уравнения, построив график функции  на заданном отрезке. Воспользуемся для построения графика табличным процессором Excel. Введем в ячейки А1:С3 следующие формулы и значения (рисунок 2.1):

Рисунок 2.1 – Отделение корней уравнения  при помощи Microsoft Excel 

    С помощью автозаполнения скопируем  формулы, расположенные в ячейках  В3 и С2 в ячейки B4:В4, А5:В5 и т.д. до тех пор, пока в столбце А не появится значение 10 (значение правого конца отрезка). В результате этих действий в столбце С будет таблица значений функции на заданном отрезке с шагом 0,25.

    Выделив ячейки, содержащие значения аргумента  и функции, построим с помощью  мастера диаграмм график функции (тип  диаграммы – точечная диаграмма со значениями, соединенными сглаживающими линиями без маркеров) (рисунок 2.2).

    

    Рисунок 2.2 – График функции

    По  графику видно, что уравнение  имеет три корня. В качестве отрезка локализации первого корня можно выбрать отрезок [0,3; 0,45], второго [0,5; 0,7], третьего – отрезок [1,3; 1,6].

    Определим, для какого из концов каждого отрезка  выполняется условие сходимости метода

           .  (1)

    Для этого вычислим вторую производную  функции. Первая производная функции:

.

    Вторая  производная функции:

.

    Итак, проверим выполнение условия (1) для  обоих концов каждого отрезка:

    

,

    

,

    

,

    

    

,

    

.

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

    Погрешность данного метода на k-ом шаге оценивается по формуле: 

           , (2)

    где M – минимальное значение модуля первой производной функции на отрезке [a; b].

    Найдём  значение М. Для этого построим таблицу значений второй производной функции на отрезках [0.3; 0,45], [0,5; 0.7] и [1.3; 1.6] с помощью Excel и выберем из таблицы минимальное значение модуля первой производной функции на каждом из отрезков.

    Таблица имеют вид (рисунок 2.3):

    Рисунок 2.3 – Таблица значений первой и  второй производной

    Минимальное значение модуля производной на первом отрезке оказалось равным 34.34, на втором – 14.53, на третьем – 1.73 

    2.2. Уточнение корней

    2.2.1 Уточнение корней  методом касательных 

    На  рисунке 2.4 представлена блок-схема алгоритма уточнения корней методом касательных.

    В начале осуществляется ввод исходных данных: значения левого и правого концов отрезка локализации корня а и b, начальное приближение корня х (выбранное в соответствии с условием (2)), допустимая погрешность уточнения корня е и предварительно найденное минимальное значение модуля производной функции f(x) на отрезке локализации корня М.

    В теле цикла с постусловием осуществляется присвоение текущего приближения корня переменной, в которой будет храниться предыдущее приближение корня и вычисляется следующее приближение корня в соответствии с рекуррентной формулой для вычисления k-го приближения корня:

          

    Буквами f и p обозначены функция f(x) и её производная соответственно.

    Далее осуществляется проверка условия достижения заданной точности, которое и является условием выхода из цикла (прекращения вычислений). После завершения выполнения цикла выводится уточнённое значение корня.

    При реализации этого алгоритма на языке программирования Паскаль, текст подпрограммы будет иметь примерно следующий вид: 

    procedure TForm1.MetKas(beg,eps,ms : Extended);

    {Описание функции}

    function getf(xs:Extended):Extended;

    var f,a : Extended;

    begin

      a := ValA;

      f:= ln(abs(ln(abs(xs*a))))+a*exp(ln(xs)*0.75)+a*sqr(ln(xs))*ln(xs)-sqrt(xs*a)+a;

      getf := f;

    end;

    {Описание  производной функции}

    function getp(xs:real):real;

    var a,p : Extended;

    begin

      a := ValA;

      p:= 1/(xs*ln(xs*a))+0.75*a/(exp(ln(xs)*0.25))+(3*a*sqr(ln(xs)))/xs-a/(2*sqrt(xs*a));

      getp := p;

    end;

    {Описание  функции, реализующей алгоритм  метода уточнения корней}

    function MK(x,e,M:Extended):Extended;

    var x0,x1,x2:Extended;

    begin

      repeat

        x0:=x;

        x1 := getf(x0);

        x2 := getp(x0);

        x:=x0-getf(x0)/getp(x0);

      until abs(getf(x))/M<=e;

      MK:=x;

    end;

    {Раздел  операторов}

    begin

    {Находим  с помощью функции МК уточненное  значение корня и при-сваиваем  его переменной х}

    x := 0;

    x:=MK(beg,eps,ms);

    Memo1.Lines.Add('Уточненное  значение корня x='+FloatToStr(x));

    end; 

    2.2.2 Уточнение корней  методом хорд 

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

           .  

    Здесь  с – значение конца отрезка, для которого выполняется условие 

          

    В качестве начального приближения выбирается конец отрезка оставшийся после выбора с. Т.е., если с=a, то начальным приближением корня выбирают b и наоборот.

    В нашем случае: для первого интервала: с = 0.45, для второго – 0.5, для третьего – 1.6.

    Блок-схема  алгоритма уточнения корней этим методом отличается от блок-схемы алгоритма уточнения корней методом касательных лишь списком вводимых исходных значений и рекуррентной формулой.

    Текст подпрограммы для уточнения корней заданного в условии задачи уравнения  методом хорд, написанной на языке  Паскаль , имеет вид: 

    procedure TForm1.MetHord(c,beg,eps,ms : Extended);

{Описание  функции решения уравнения методом  ХОРД}

function getf(xs:Extended):Extended;

var f,a : Extended;

begin

  a := ValA;

  f:= ln(abs(ln(abs(xs*a))))+a*exp(ln(xs)*0.75)+a*sqr(ln(xs))*ln(xs)-sqrt(xs*a)+a;

  getf := f;

end;

{Описание  функции, реализующей алгоритм  метода уточнения корней}

function MCh(c,x,e,M:Extended):Extended;

var x0:Extended;

begin

  repeat

    x0:=x;

    x:=(c*getf(x0)-x0*getf(c))/(getf(x0)-getf(c));

  until abs(getf(x))/M<=e;

  MCh:=x;

end;

{Раздел  операторов}

begin

{Находим  с помощью функции МК уточненное  значение корня и при-сваиваем  его переменной х}

x := 0;

x:=MCh(c,beg,eps,ms);

Memo2.Lines.Add('Уточненное значение корня x=' + FloatToStr(x));

end; 
 
 
 

2.2.3 Уточнение корней  методом деления  отрезка пополам 

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

    Блок-схема  алгоритма уточнения корней методом  деления отрезка пополам приведена на рисунке 2.

    После ввода значений концов отрезка и  допустимой погрешности  в теле цикла  с постусловием вычисляется приближение корня. Затем в блоках 4 и 6 выполняется поиск отрезка, содержащего корень. Если выполняется условие f(a)f(x)<0, то корень лежит на отрезке [aх] и значение правого конца этого отрезка х заносится в переменную b; если это условие не выполняется, то проверяется условие f(b)f(x)<0. Если оно выполняется, корень лежит на отрезке [хb] и значение левого конца этого отрезка х заносится в переменную a. Если же ни одно из этих условий не выполняется, то, очевидно, f(x)=0, т.е. х – точный корень уравнения, который и выводится.

    Далее осуществляется проверка условия достижения заданной точности вычислений корня, которое и является условием выхода из цикла. После окончания вычислений найденное значение корня выводится.

      

    Подпрограмма  для уточнения корней заданного  в условии уравнения методом деления отрезка пополам, написанная на языке Паскаль:

procedure TForm1.MetDOP(beg,ends : Extended);

var a,b,x:Extended;

{Описываем функцию}

Информация о работе Решение нелинейных уравнений в среде Delphi