Дипломная работа на тему Сопоставления численных методов решения нелинейных уравнений

ДИПЛОМНАЯ РАБОТА

Сопоставления численных методов решения нелинейных уравнений

Введение

нелинейный уравнение касательная алгоритм

Целью дипломной работы является разработка программы решения нелинейных уравнений (НЛУ) различными методами. Программа включает и учитывает многие новые возможности в программировании и практике создания программ в среде программирования Паскаль и С++.

Процедура подготовки и решения задачи НЛУ на ЭВМ достаточно сложный и трудоемкий процесс, состоящий из следующих этапов:

Постановка задачи (задача, которую предстоит решать на ЭВМ, формулируется пользователем или получается им в виде задания).

Математическая формулировка задачи.

Разработка алгоритма решения задачи.

Написание программы на языке программирования.

Подготовка исходных данных.

Ввод программы и исходных данных в ЭВМ.

Отладка программы.

Тестирование программы.

Решение задачи на ЭВМ и обработка результатов.

В настоящей дипломной работе условие задачи дано в математической формулировке, поэтому необходимость в выполнении этапов 1 и 2 отпадает и сразу можно приступить к разработке алгоритма решения задачи на ЭВМ. Под алгоритмом понимается последовательность арифметических и логических действий над числовыми значениями переменных, приводящих к вычислению результата решения задачи при изменении исходных данных в достаточно широких пределах. Таким образом, при разработке алгоритма решения задачи математическая формулировка преобразуется в процедуру решения, представляющую собой последовательность арифметических действий и логических связей между ними. При этом алгоритм обладает следующими свойствами: детерминированностью, означающей, что применение алгоритма к одним и тем же исходным данным должно приводить к одному и том уже результату; массовость, позволяющей получать результат при различных исходных данных; результативностью, обеспечивающей получение результата через конечное число шагов.

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

Конфигурация и размеры блоков, а также порядок построения схем определяются ГОСТ 19.002-80 и ГОСТ 19.003-80.

На этапе 4 составляется программа на языке Турбо-Паскаль. При описании программы необходимо использовать характерные приемы программирования и учитывать специфику языка. В качестве языка программирования выбран язык ПАСКАЛЬ ввиду его наглядности и облегченного понимания для начинающих программистов, а также возможности в дальнейшем использовать для решения более трудных задач.

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

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

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

Задание при обработке на ЭВМ проходит ряд шагов: компиляцию, редактирование (компоновку) и выполнение.

Обработка результатов решения задачи осуществляется с помощью ЭВМ. Выводимые результаты оформлены в виде, удобном для восприятия.

В работе предложены программы вычисления значения функции в заданной точке, а также вычисления значения нелинейного уравнения (НЛУ) методом касательных, секущих написанных на языке программирования Turbo С 2.0.

1. Методы решения нелинейных уравнений

1.1 Метод касательных

Краткое описание сущности метода касательных (метода секущих Ньютона)

Пусть на отрезке [a; b] отделен корень с уравнения f (x) = 0 и f – функция непрерывна на отрезке [a; b], а на интервале] a; b [существуют отличные от нуля производные f’ и f».

Так как f «(x) № 0, то запишем уравнение f (x) = 0 в виде:

x = x – (f (x) / f «(x)) (1.1)

Решая его методом итераций можем записать:

xn+1 = x n – (f (x n) / f «(x n)) (1.2)

Если на отрезке [a; b] f «(x) * f «(x) > 0, то нул – евое приближение выбираем x0=a. Рассмотрим геометрический смысл метода. Рассмотрим график функции y=f(x). Пусть для определенности f `(x) > 0 и f «(x) > 0 (рис. 1). Проведем касательную к графику функции в точке B (b, f (b)). Ее уравнение будет иметь вид:

y = f (b) + f «(b) * (x – b)

Полагая в уравнении y = 0 и учитывая что f «(x) ? 0, решаем его относительно x. Получим:

x = b – (f (b) /f `(b))

Нашли абсциссу x1 точки c1 пересечения касательной с осью ox:

x1 = b – (f (b) – f’ (b))

Рис. 1.

Проведем касательную к графику функции в точке b1 (x1; f (x1)). Найдем абсциссу x2 точки с2 пересечения касательной с осью Ox:

x2 = x1 – (f (x1) / (f «(x1))

Вообще:

xk+1 = x k – (f (x k) / f «(x k)) (1.3)

Таким образом, формула (1.3) дает последовательные приближения (xk) корня, получаемые из уравнения касательной, проведенной к графику функции в точке b k (x k; f (x k0) метод уточнения корня c [a; b] уравнения f (x) = 0 с помощью формулы (1.3) называется методом касательной или методом Ньютона.

Геометрический смысл метода касательных состоит в замене дуги y = f (x) касательной, одной к одной из крайних точек. Начальное приближение x 0 = a или x0 = b брать таким, чтобы вся последовательность приближения х k принадлежала интервалу] a; b [. В случае существования производных f’, f», сохраняющих свои знаки в интервале, за х0 берется тот конец отрезка [a; b], для которого выполняется условие f «(х0) * f (х0) > 0. Для оценки приближения используется общая формула:

|c-x k-1 | Ј | f (x k+1)/m|, где m = min f «(x) на отрезке [a; b].

На практике проще пользоваться другим правилом:

Если на отрезке [a; b] выполняется условие 0 < m < | f (x)| и –e—–заданная точность решения, то неравенство | x k+1-x k| Ј—-e– влечет выполнение неравенства |c-x k-1|–Ј—-e–.

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

|c-x k-1| Ј—-e–.

Решение нелинейного уравнения аналитически

Определим корни уравнения х3 + 0,1х2 + 0,4х – 1,2 = 0 аналитически. Находим:

f (x) = х3 + 0,1х2 + 0,4х – 1,2

f `(x) = 3х2 + 0,1х + 0,4

f (-1) = -2,5 < 0 f (0) = -1,2 < 0 f (+1) = 0,3 > 0

x

 ?

-1

0

+1

+ ?

sign f (x)

+

+

Следовательно, уравнение имеет действительный корень, лежащий в промежутке [0; +1].

Приведем уравнение к виду x = j (x), так, чтобы | j `(x) | <1 при 0 Ј–x–Ј–+1.

Так как max | f «(x) | = f «(+1) = 3 + 0,1 + 0,4 = 3,5 то можно взять R = 2.

Тогда j (x) = x – (f (x) / R) = x – 0,5 х3 – 0,05 х2 – 0,2 х + 0,6 = – 0,5 х3 – 0,05 х2 + 0,8 х + 0,6.

Пусть х0 = 0, тогда х n+1 = j (х n).

Вычисления расположим в таблице.

n

хn

х2n

х3n

j (хn).

f (x)

1

1

1

1

0,85

-0,17363

2

0,85

0,7225

0,614125

0,9368125

0,08465

3

0,9368125

0,87761766

0,822163194

0,89448752

-0,04651

4

0,89448752

0,800107923

0,715686552

0,917741344

0,024288

5

0,917741344

0,842249174

0,772966889

0,905597172

-0,01306

6

0,905597172

0,820106238

0,74268589

0,912129481

0,006923

7

0,912129481

0,83198019

0,758873659

0,908667746

-0,0037

8

0,908667746

0,825677072

0,750266124

0,910517281

0,001968

9

0,910517281

0,829041719

0,754856812

0,909533333

-0,00105

10

0,909533333

0,827250884

0,752412253

0,910057995

0,000559

11

0,910057995

0,828205555

0,753715087

0,909778575

-0,0003

12

0,909778575

0,827697055

0,753021048

0,909927483

0,000159

13

0,909927483

0,827968025

0,753390861

0,909848155

-8,5E-05

14

0,909848155

0,827823665

0,753193834

0,909890424

4,5E-05

15

0,909890424

0,827900583

0,753298812

0,909867904

-2,4E-05

16

0,909867904

0,827859602

0,753242881

0,909879902

1,28E-05

17

0,909879902

0,827881437

0,753272681

0,90987351

-6,8E-06

18

0,90987351

0,827869803

0,753256804

0,909876916

3,63E-06

19

0,909876916

0,827876002

0,753265263

0,909875101

-1,9E-06

20

0,909875101

0,827872699

0,753260756

0,909876068

1,03E-06

График функции y = х3 + 0,1х2 + 0,4х – 1,2

Алгоритм и блок схема метода касательных

{Конец основного тела программы}

Результаты выполнения программы

От A= 0.0000000000E+00 до B= 1.0000000000E+00

Погрешность с= 1.0000000000E-08

От A= 0.0000000000E+00 до B= 1.0000000000E+00

Погрешность с= 1.0000000000E-08

xn= 8.5000000000E-01 xn+1= 9.3681250000E-01 f (xn+1)= 8.4649960270E-02

xn= 9.3681250000E-01 xn+1= 8.9448751986E-01 f (xn+1)=-4.6507647892E-02

xn= 8.9448751986E-01 xn+1= 9.1774134381E-01 f (xn+1)= 2.4288343840E-02

xn= 9.1774134381E-01 xn+1= 9.0559717189E-01 f (xn+1)=-1.3064617920E-02

xn= 9.0559717189E-01 xn+1= 9.1212948085E-01 f (xn+1)= 6.9234699658E-03

xn= 9.1212948085E-01 xn+1= 9.0866774587E-01 f (xn+1)=-3.6990702320E-03

xn= 9.0866774587E-01 xn+1= 9.1051728099E-01 f (xn+1)= 1.9678960780E-03

xn= 9.1051728099E-01 xn+1= 9.0953333295E-01 f (xn+1)=-1.0493249720E-03

xn= 9.0953333295E-01 xn+1= 9.1005799543E-01 f (xn+1)= 5.5884091853E-04

xn= 9.1005799543E-01 xn+1= 9.0977857497E-01 f (xn+1)=-2.9781681224E-04

xn= 9.0977857497E-01 xn+1= 9.0992748338E-01 f (xn+1)= 1.5865717614E-04

xn= 9.0992748338E-01 xn+1= 9.0984815480E-01 f (xn+1)=-8.4537703515E-05

xn= 9.0984815480E-01 xn+1= 9.0989042365E-01 f (xn+1)= 4.5040009354E-05

xn= 9.0989042365E-01 xn+1= 9.0986790364E-01 f (xn+1)=-2.3997676180E-05

xn= 9.0986790364E-01 xn+1= 9.0987990248E-01 f (xn+1)= 1.2785800209E-05

xn= 9.0987990248E-01 xn+1= 9.0987350958E-01 f (xn+1)=-6.8122881203E-06

xn= 9.0987350958E-01 xn+1= 9.0987691573E-01 f (xn+1)= 3.6295678001E-06

xn= 9.0987691573E-01 xn+1= 9.0987510095E-01 f (xn+1)=-1.9338276616E-06

xn= 9.0987510095E-01 xn+1= 9.0987606786E-01 f (xn+1)= 1.0303429008E-06

xn= 9.0987606786E-01 xn+1= 9.0987555269E-01 f (xn+1)=-5.4896190704E-07

xn= 9.0987555269E-01 xn+1= 9.0987582717E-01 f (xn+1)= 2.9248803912E-07

xn= 9.0987582717E-01 xn+1= 9.0987568093E-01 f (xn+1)=-1.5583464119E-07

xn= 9.0987568093E-01 xn+1= 9.0987575885E-01 f (xn+1)= 8.3031409304E-08

xn= 9.0987575885E-01 xn+1= 9.0987571733E-01 f (xn+1)=-4.4236003305E-08

xn= 9.0987571733E-01 xn+1= 9.0987573945E-01 f (xn+1)= 2.3572283681E-08

xn= 9.0987573945E-01 xn+1= 9.0987572766E-01 f (xn+1)=-1.2558302842E-08

xn= 9.0987572766E-01 xn+1= 9.0987573394E-01 f (xn+1)= 6.6920620156E-09

Конечные значения

xn+1= 9.0987573394E-01 f (xn+1)= 6.6920620156E-09

1.2 Метод хорд

Пусть дано уравнение , где – непрерывная функция, имеющая в интервале (a, b) производные первого и второго порядков. Корень считается отделенным и находится на отрезке [a, b].

Идея метода хорд состоит в том, что на достаточно малом промежутке [a, b] дугу кривой можно заменить хордой и в качестве приближенного значения корня принять точку пересечения с осью абсцисс. Рассмотрим случай (рис. 1), когда первая и вторая производные имеют одинаковые знаки, т.е. .

Уравнение хорды – это уравнение прямой, проходящей через две точки (a, f(a)) и (b, f(b)).

Общий вид уравнения прямой, проходящей через две точки:

Подставляя в эту формулу значения, получим уравнение хорды AB:

.

Пусть x1 – точка пересечения хорды с осью x, так как y = 0, то

x1 может считаться приближенным значением корня.

Аналогично для хорды, проходящей через точки и , вычисляется следующее приближение корня:

В общем случае формулу метода хорд имеет вид:

(1.4)

Если первая и вторая производные имеют разные знаки, т.е. , то все приближения к корню выполняются со стороны правой границы отрезка (рис. 3) и вычисляются по формуле:

(1.5)

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

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

Если обозначить через m наименьшее значение |f'(x)| на промежутке [a, b], которое можно определить заранее, то получим формулу для оценки точности вычисления корня:

или

где – заданная погрешность вычислений.

Алгоритм и блок схема метода хорд

Пользуясь рекуррентной формулой (1.5) и формулой для оценки точности вычисления, составим процедуру уточнения корня методом хорд:

Procedure chord (a, b, eps, min: real; var x: real);

Здесь x:=x1 – ((b-x1)*fx(x1))/(fx(b) – fx(x1)) – рекуррентная формула,

abs (fx(x))/min < eps – формула для оценки точности вычислений.

При вычислении производной функции

Function proizv (x0, eps: real): real;

будем иметь в виду, что один из способов найти производную – это взять достаточно малые значения справа и слева на равном расстоянии от – точке, в которой мы хотим найти производную.

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

По значениям f’ можно таким же способом найти производную от f’, т.е. f”. Можно выразить f” непосредственно через f(x):

Для производной третьего порядка можно использовать следующую формулу:

Здесь dx:=1 – первоначальная величина промежутка,

dx:=dx/2 – для уточнений делим промежуток на 2,

dy:=fx (x0+dx/2 – fx (x0-dx/2) – вычисление первой производной в точке x0,

dy2:=fx (5*x0/4+dx) – 2*fx (5*x0/4)+fx (5*x0/4-dx) – вычисление второй производной, для определения точности вычисления, используется вторая производная в точке

abs (dy2/(2*dx))<eps – формула для оценки погрешности

дифференцирования,

proizv:=dy/dx – значение первой производной.

Для оценки точности вычисления корня необходимо вычислять наименьшее значение производной f'(x) на промежутке [a, b], поэтому надо найти производную в точке x0.

Так как мы вычислили значение производной, то составим процедуру определения модуля ее наименьшего значения на промежутке [a, b]:

Procedure minimum (a, b, eps:real; var min:real);

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

Здесь min:=abs (proizv(a, eps)) – модуль значения производной функции в начале отрезка,

d:=abs (proizv(b, eps)) – модуль значения производной функции в конце отрезка,

If min>d Then – сравнение значений модуля производной.

Функция для указания точности вычисления:

Function utoch (eps:real):integer;

Применяется в выводе корня x для уточнения его порядка относительно погрешности.

Здесь k:=k+1 – оператор, подсчитывающий степень погрешности и порядка корня x.

Заданную функцию запишем так:

Function fx (x:real):real;

Здесь fx:=exp(x) – 10*x – наша заданная функция.

Результаты вычисления методом хорд

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

0,11

0,111

0,1119

0,11183

0,111833

Результат вычислений в программе MathCAD дал следующее значение корня x:

x=0.112

График функции выглядит так:

Поведение функции вблизи точки пересеченья с осью ОХ выглядит так:

2. Сравнения методов решения нелинейных уравнений

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

В работе должно быть предусмотрено:

– построение графика функции f (x) на отрезке [a, b],

– проверка корректности введенных значений исходных данных (выполнение условия a < b, выполнение условия e > 0),

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

Варианты численного метода: 1) метод простых итераций, 2) метод Ньютона, 3) метод проб, 4) метод секущих, 5) метод хорд.

Упрощенный метод Ньютона: , n=0,1,…

Метод ложного положения: , n=0,1,…;

Метод секущих: , n=0,1,…

Метод Стеффенсена: , n=0,1,…

2.1 Метод секущих

Пусть на отрезке [a; b] отделен корень с уравнения f(x) = 0 и f-функция непрерывна на отрезке [a; b], а на интервале] a; b [существуют отличные от нуля производные f’ и f».

Так как f «(x) ? 0, то запишем уравнение f(x) = 0 в виде:

x = x – (f(x)/f «(x)) (2.1)

Решая его методом итераций можем записать:

х n+1 = x n – (f (x n)/f «(x n)) (2.2)

Если на отрезке [a; b] f «(x) * f «(x) > 0, то нулевое приближение выбираем x0=a. Рассмотрим геометрический смысл метода. Рассмотрим график функции y=f(x). Пусть для определенности f `(x) > 0 и f «(x) > 0. Проведем касательную к графику функции в точке B (b, f(b)). Ее уравнение будет иметь вид:

y = f(b) + f «(b) * (x – b)

Полагая в уравнении y = 0 и учитывая что f «(x) ? 0, решаем его относительно x. Получим:

x = b – (f (b) /f `(b))

Нашли абсциссу x1 точки c1 пересечения касательной с осью ox:

x1 = b – (f (b) – f’ (b))

Проведем касательную к графику функции в точке b1 (x1; f (x1)).Найдем абсциссу x2 точки с2 пересечения касательной с осью Ox:

x2 = x1 – (f (x1)/(f «(x1))

Вообще:

х k+1=x k – (f (x k)/f «(x k)) (2.3)

Таким образом, формула (2.3) дает последовательные приближения (x k) корня, получаемые из уравнения касательной, проведенной к графику функции в точке b k (x k; f (x k0) метод уточнения корня c [a; b] уравнения f(x) = 0 с помощью формулы (2.3) называется методом касательной или методом Ньютона.

Геометрический смысл метода касательных состоит в замене дуги y = f (x) касательной, одной к одной из крайних точек. Начальное приближение x0 = a или x0 = b брать таким, чтобы вся последовательность приближения х k принадлежала интервалу] a; b [. В случае существования производных f’, f», сохраняющих свои знаки в интервале, за х0 берется тот конец отрезка [a; b], для которого выполняется условие f «(х0) * f (х0) > 0. Для оценки приближения используется общая формула:

|c-x k-1 | ? | f (x k+1)/m|, где m = minf’ (x) на отрезке [a; b].

На практике проще пользоваться другим правилом:

Если на отрезке [a; b] выполняется условие 0 < m < | f (x)| и e—–заданная точность решения, то неравенство | x k+1-x k| ?–e–влечет выполнение неравенства |c-x k-1| ?–e–.

В этом случае процесс последовательного приближения продолжают до тех пор, пока не выполнится неравенство:|c-x k-1| ?–e–.

Упрощенный метод Ньютона: , n=0,1,…

Метод секущих: , n=0,1,…

2.2 Алгоритм и блок схема метода секущих

Метод секущих, так же, как и метод проб, использует не одно, а два начальных приближения, которые мы обозначим соответственно xn1 и xn2. Перед выполнением первой итерации воспользуемся правилом (6) для определения значений этих приближений.

При выполнении каждой очередной итерации для вычисления следующего приближения по методу хорд проведем прямую линию (секущую) MN через точки с координатами (xn1, f(xn1)) и (xn2, f (xn2)), а абсциссу точки пересечения секущей MN с осью х возьмем в качестве значения следующего приближения xs к корню (рис. 5).

Рис. 5. Графическая иллюстрация метода секущих

Принятое правило нахождения следующего приближения приводит к расчетной формуле:

Из трех приближений к корню оставим два последних (отбрасываем самое старое xn1). В методе секущих это делается по следующему правилу:

xn1 = xn2; xn2 = xs.

Выполнение итераций можно прекратить при выполнении условия

|xn2 – xn1|< e,

а полученное значение приближения xs взять в качестве искомого значения корня xw.

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

Обратим внимание на то, что формула имеет много общего с формулой Ньютона. Знаменатель в формуле есть не что иное, как среднее значение производной f`(x) на отрезке [xn1, xn2].

2.3 Пример 1 для сравнения методов решения НЛУ

Для заданного нелинейного уравнения вида f(x)=0 графическим или аналитическим способом найти интервалы локализации корней, 5x – 3x – 5=0

1) 5x-3x-5=0; y=5x y=3x-5 5x=3x+5

x -2 -1 0 1 2 x -2 2

y 0,04 0,2 1 5 25 y -1 11

a) графический метод

Первое решение находится в интервале (-2; – 1). Второе в интервале (1; 2)

б) метод секущих

1) (-2; – 1)

f(x)=5x-3x-5

f(-2)=5-2+6-5=1/25+1=26/25=1.04>0

f(-1)=5-1+3-5=1/5-2=-1.8<0

x1=a – (b-a) f(a)/f(b) – f(a)=-2 – (-1+2)*1.04/-1.8-1.04=-1/6338<0

f (-1.6338)=5-1.6338+3*1.6338-5=-0.0265<0

применим метод к промежутку (-2; – 1.6338)

x2=-2 – (-1.6429+2)*1.04/(-0.0002-1.04)=-1.64297

f (-1.64297)=5-1.6338+3*1.64297-5=-0.00003

искомый корень: -1.6429

2) (-2; – 1)

f(1)=51-3-5=-3<0

f(2)=52-3*2-5=25-11=14>0

x1=a – (b-a) f(a)/f(b) – f(a)=1 – (2-1)*(-3)/-14+3=1+3/17=1.1765

f (1.1765)=51.1765+3*1.1765-5=-1.8869<0

(1.1765; 2)

x2=a – (b-a) f(a)/f(b) – f(a)=1.1765 – (2-1.1765)*(-1.8869)/-14+-1.8869=1.2743

f (1. 2743)=-1.04795<0

(1.2743; 2)

x3=a – (b-a) f(a)/f(b) – f(a)=1.2743 – (2-1.2743)*(-1.04795)/-14+-1.04795=1.3248

f (1. 3248)=-0.5411<0

(1.3248; 2)

x4=a – (b-a) f(a)/f(b) – f(a)=1.3248 – (2-1.3248)*(-0.5411)/-14+=-0.5411=1.3499

f (1. 3499)=-0.2688<0

(1.3499; 2)

x5=a – (b-a) f(a)/f(b) – f(a)=1.3499 – (2-1.3499)*(-0.2688)/-14+-0.2688=1.3621

f (1. 3621)=-0.1313<0

(1.3621; 2)

x6=a – (b-a) f(a)/f(b) – f(a)=1.3621 – (2-1.3621)*(-0.1313)/-14+-0.1313=1.3680

f (1. 3680)=-0.0635<0

(1.3680; 2)

x7=a – (b-a) f(a)/f(b) – f(a)=1.3680 – (2-1.3680)*(-0.0635)/-14+-0.0635=1.3709

f (1. 3709)=-0.0299<0

(1.3709; 2)

x8=a – (b-a) f(a)/f(b) – f(a)=1.3709 – (2-1.3709)*(-0.0299)/-14+-0.0299=1.3722

f (1. 3722)=-0.0148<0

(1.3722; 2)

x9=a – (b-a) f(a)/f(b) – f(a)=1.3722 – (2-1.3722)*(-0.0148)/-14+-0.0148=1. 3729

f (1. 3729)=-0.0067<0

(1.3729; 2)

x10=a – (b-a) f(a)/f(b) – f(a)=1.3729 – (2-1.3729)*(-0.0067)/-14+-0.0067=1.3732

f (1. 3732)=-0.0032<0

(1.3732; 2)

x11=a – (b-a) f(a)/f(b) – f(a)=1.3732 – (2-1.3732)*(-0.0032)/-14+-0.0032=1.3733

f (1. 3733) =-0.00199<0

(1.3733; 2)

x12=a – (b-a) f(a)/f(b) – f(a)=1.3733 – (2-1.3733)*(-0.00199)/-14+-0.00199=1.3734

f (1. 3734)=-0.0008<0

(1.3734; 2)

x13=a – (b-a) f(a)/f(b) – f(a)=1.3734 – (2-1.3734)*(-0.0008)/-14+-0.0008=1.37344

f (1. 37344)= -0.0004<0

(1.37344; 2)

x14=a – (b-a) f(a)/f(b) – f(a)=1.37344 – (2-1.37344)*(-0.0004)/-14+-0.0004=1.3735

f (1. 3735)=-0.0003<0

(1.3735; 2)

x15=a – (b-a) f(a)/f(b) – f(a)=1.3735 – (2-1.3735)*(-0.0003)/-14+-0.0003=1.37347

f (1. 37347)=-0.000001<0

(1.37347; 2)

искомый корень: 1.3734

2.4 Пример 2 для сравнения методов решения НЛУ

При а =0.1

Интервал изменения параметра x

Строим график функции

При интервале изменения коэффициента x

График имеет вид

При а=0 функция f(x)=0 имеет значения корня x=0.77

Находим более точное значение корня

– вычислительный блок

– процедура нахождения корня

– более точное значение корня

Проверка:

При а =1

Интервал изменения параметра x

Строим график функции при интервале изменения коэффициента x

График имеет вид при а=1 функция f(x)=0 имеет приближенное значения корня x=0,21

Находим более точное значение корня

– вычислительный блок

– процедура нахождения корня

– более

точное значение корня

Проверка:

При а =2

Интервал изменения параметра x

Строим график функции при интервале изменения коэффициента x

График имеет вид при а=2 функция f(x)=0 имеет приближенное значения корня x=-0,25

Находим более точное значение корня

– вычислительный блок

– процедура нахождения корня

– более точное значение корня

Проверка:

Нахождение более точного значения корня при помощи root

– приближенное значение корня

Находим min и max функции

– шаг изменения аргумента

– на интервале от -10 до 10

– на интервале от -10 до 10

Разложение функции d(x)=exp(x) в степенной ряд

– интервал изменения аргумента

2.5 Пример 3 для сравнения методов решения НЛУ

Для решения были предложены следующие уравнения:

x3 – 4x – 2 = 0 и 4x = cosx

При решении каждого уравнения вводится соответствующая функция ((x) = x3 – 4x – 2 и (x) = 4x – cosx), а решениями уравнения являются нули соответствующей функции.

Следует отметить, что обе функции непрерывны и дважды дифференцируемы на всей области определения (-; ).

Необходимо найти приближенные решения уравнений с заданной точностью (0,001). С целью упростить работу (в частности, избавить человека от однотипных арифметических и логических операций) и обеспечить максимальную точность вычислениям, при решении данных уравнений была использована ЭВМ и программы на языке Turbo Pascal 7.0, созданные специально для решения данных задач.

Способ хорд

Теоретическая часть

Данный способ можно свести к следующему алгоритму:

Разделим всю область исследования (Df) отрезки, такие, что внутри каждого отрезка [x1; x2] функция монотонная, а на его концах значения функции (x1) и (x2) разных знаков. Так как функция (x) непрерывна на отрезке [x1; x2], то ее график пересечет ось ОХ в какой либо одной точке между x1 и x2.

Проведем хорду АВ, соединяющую концы кривой y = (x), соответствующие абсциссам x1 и x2. Абсцисса a1 точки пересечения этой хорды с осью ОХ и будет приближенным значением корня. Для разыскания этого приближенного значения напишем уравнение прямой АВ, проходящей через две данные точки A(x1;(x1)) и B(x2; (x2)), в каноническом виде:

;

Учитывая, что y = 0 при x = a1, выразим из данного уравнения a1:

Чтобы получить более точное значение корня, определяем (а1). Если на данном отрезке мы имеем (x1)<0, (x2)>0 и (a1)<0, то повторяем тот же прием, применяя формулу (1) к отрезку [a1; x2]. Если (x1)>0, (x2)<0 и (a1)>0, то применяем эту формулу к отрезку [x1; a1]. Повторяя этот прием несколько раз, мы будем получать все более точные значения корня а2, а3 и т.д.

Пример 1. x3 – 4x – 2 = 0

(x) = x3 – 4x – 2,

(x) = 3x2 – 4,

производная меняет знак в точках

(x) + – +

(x) х

функция (x) монотонно возрастает при x(-;] и при х[;), и монотонно убывает при x[;].

Итак, функция имеет три участка монотонности, на каждом из которых находится по одному корню.

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

(-2)= -2,

(-1)= 1,

(0)= -2,

(1)= -5,

(2)= -2,

(3)= 13.

Таким образом, корни находятся в интервалах

(-2; – 1), (-1; 0), (2; 3).

Заключение

Удалось разработать программу решения нелинейных и трансцендентных уравнений методами касательных, секущих – хорд. Программа включает и учитывает многие новые возможности в программировании и практике создания программ в среде программирования С++ и ТурбоПаскаль.

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

Литература

Алексеев В.Е., Ваулин А.С., Петрова Г.Б. – Вычислительная техника и программирование. Практикум по программированию: Практ.пособие/ – М.: Высш. шк., 1991. – 400 с.

Абрамов С.А., Зима Е.В. – Начала программирования на языке Паскаль. – М.: Наука, 1987. -112 с.

Вычислительная техника и программирование: Учеб. для техн. вузов/ Петров А.В., Алексеев В.Е., Ваулин А.С. и др. – М.: Высш. шк., 1990 – 479 с.

Гусев В.А., Мордкович А.Г. – Математика: Справ. материалы: Кн. для учащихся. – 2-е изд. – М.: Просвещение, 1990. – 416 с.

Марченко А.И., Марченко Л.А. – Программирование в среде Turbo Pascal 7.0 – К.: ВЕК+, М.: Бином Универсал, 1998. – 496 с.

Математическое обеспечение САПР: Методические указания к практическим занятиям. Рязань, РРТИ, 1990 (№1706).

Математическое обеспечение САПР: Методические указания к лабораторным работам. Рязань, РРТИ, 1991 (№1890).

Бахвалов Н.С., Шадков И.П., Кобельников Г.М., Численные методы. М.: Наука, 1987.

Волков Е.А., Численные методы. М.: Наука, 1988.

Элементы вычислительной математики, под ред. Норкина С.Б.М.: Высшая школа, 1966.

Архангельский Н.А. Вычислительные методы алгебры в приемах и задачах. М.: МАИ, 1976.

Васильев Ф.П. Численные методы решения экстремальных задачь. М.: Наука, 1988.

Васильков Ф.В., Василькова Н.Н. Компьютерные технологии вычислений в математическом моделировании: Учеб. Пособие. М.: Финансы и статистика, 1999.

Фильчаков П.Ф., Справочник по высшей математике. Киев: Наукова думка, 1974.

Фильчаков П.Ф., Численные методы. Киев: Наукова думка, 1976.

Большая математическая энциклопедия. М.: Олма-Пресс, 2004

Демидович Б.П., Марон И.А. Основы вычислительной математики. М.: Наука, 1970.

Тихонов А.Н. Вводные лекции по прикладной математике. М.: Наука, 1984.

Калиткин Н.Н., Численные методы. М.: Наука, 1987.

Корн Г., Корн Т. Справочник по математике. М.: Наука, 1984.

Приложение

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

Программа на языке PASCAL 7.0

program metod_kasatel; {Название программы}

uses Crt; {Модуль дисплейных функций}

var {Блок описаний переменных}

xn, xn1, a, b, c, mx, y0, x0:real;

function f1 (x1: Real): Real; {Основная функция}

begin

f1:= x1*x1*x1*(-0.5) – 0.05*x1*x1+0.8*x1+0.6;

end;

function f2 (x4: Real): Real; {Производная от основной функции}

begin

f2:= x4*x4*x4+0.5*x4*x4+0.1*x4*x4+0.4*x4-1.2;

end;

begin {Начало основного тела программы}

Clrscr; {Очистка экрана перед выполнением программы}

a:=0; b:=1; c:=0.00000001;

Writeln (‘ От A=’, a, ‘ до B=’, b); {Вывод на экран}

Writeln (‘ Погрешность с=’, c);

Readln; {Ожидание нажатия клавиши Enter}

xn:=b;

xn1:= f1 (xn);

y0:=f2 (b);

while ABS(y0)>c do {Проверка по точности вычисления корня}

begin {Тело цикла}

xn:=xn1;

xn1:=f1 (xn);

y0:= f2 (xn1);

{Печать промежуточного результата}

Writeln (‘xn=’, xn, ‘ xn+1=’, xn1,’ f (xn+1)=’, y0);

Readln; {Ожидание нажатия клавиши Enter}

end; {Конец тела цикла}

Writeln (‘Конечные значения’); {Печать полученного результата}

Writeln (‘ xn+1=’, xn1,’ f (xn+1)=’, y0);

Readln; {Ожидание нажатия клавиши Enter}

End

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

Задание: Разработать программу, которая выполняет уточнение корня нелинейного уравнения отделенного на заданном интервале [a, b], заданным методом.

Решить нелинейное уравнение с использованием разработанной программы и средств системы MathCAD. Сравнить полученные результаты.

Определить количество необходимых итераций для следующих значений погрешностей результата: Eps=;;;;.

Используемый метод: метод хорд.

Контрольный пример: ;

Интервал [a, b]: [0,1].

Список идентификаторов.

a – начало отрезка,

b – конец отрезка,

eps – погрешность вычислений,

x – искомое значение корня,

min – модуль значения производной функции в начале отрезка,

d – модуль значения производной функции в конце отрезка,

x0 – точка, в которой мы ищем производную.

****************************************************************

Program Khord;

uses crt;

Var

a, b, eps, x, min: real;

{Вычисление данной функции}

Function fx (x:real): real;

begin

fx:=exp(x) – 10*x;

end;

{Функция вычисления производной и определение точности вычислений}

{Для определения точности вычисления берем значение 2-й производной в точке x*=}

Function proizv (x0, eps: real): real;

var

dx, dy, dy2: real;

begin

dx:=1;

Repeat

dx:=dx/2;

dy:=fx (x0+dx/2) – fx (x0-dx/2);

dy2:=fx (5*x0/4+dx) – 2*fx (5*x0/4);

dy2:=dy2+fx (5*x0/4-dx);

Until abs (dy2/(2*dx))<eps;

proizv:=dy/dx;

end;

{Уточнение количества знаков после запятой}

Function utoch (eps:real): integer;

var

k: integer;

begin

k:=-1;

Repeat

eps:=eps*10;

k:=k+1;

Until eps>1;

utoch:=k;

end;

{Процедура определения наименьшего значения производной на

заданном промежутке}

Procedure minimum (a, b, eps: real; var min: real);

var

d: real;

begin

a:=a-eps;

b:=b+eps;

Repeat

a:=a+eps;

b:=b-eps;

min:=abs (proizv(a, eps));

d:=abs (proizv(b, eps));

If min>d Then min:=d

Until min <>0

end;

{Процедура уточнения корня методом хорд}

Procedure chord (a, b, eps, min: real; var x:real);

Var

x1: real;

begin

x1:=a;

Repeat

x:=x1 – ((b-x1)*fx(x1))/(fx(b) – fx(x1));

x1:=x

Until abs (fx(x))/min<eps

end;

{Основная программа}

Begin

clrscr;

Writeln (‘Введите начало отрезка a, конец отрезка b’);

Readln (a, b);

Writeln (‘Введите погрешность измерений eps’);

Readln (eps);

minimum (a, b, eps, min);

chord (a, b, eps, min, x);

Writeln (‘Корень уравнения x= ‘, x:3:utoch(eps));

End.

****************************************************************

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

#include <math.h>

#include <stdio.h>

double f (double x)

{

return 5^x-3*x-5;

}

double findRootChord (double a,

double b,

double eps,

long max_step,

double (&f) (double))

{

double f_a = f(a);

double f_b = f(b);

double xn;

for (long k=0; k<max_step; k++)

{

xn = a-f_a*(b-a)/(f_b-f_a); double f_xn = f(xn);

if (fabs(f_xn)<eps)

{

break;

}

if (f_xn*f_b<0)

{

a = xn; f_a = f_xn;

}

else

{

b = xn; f_b = f_xn;

}

}

return xn;

}

void main()

{

clrscr();

cout.precision(6);

cout.setf (ios:fixed|ios:showpoint);

double x = findRootChord (-10,1. 0000001,10000, f);

cout<<«x = «<<x<<endl;

cout<<«f(x) = «<<f(x)<<endl;

getch();

}

Программа вычисления корня. Сравнения

struct files

{

float x;

float y;

struct files *radr;

}*w_f, *r_f, *l_f;

struct msp

{

struct msp *radr1;

float z;

} *w_msp, *r_msp, *l_msp;

struct fll

{

struct fll *radr2;

float a;

} *w_fll,*r_fll, *l_fll;

struct u

{

struct u *uadr;

float u;

} *w_u,*r_u,*l_u;

struct v

{

struct v *vadr;

float v;

} *w_v,*r_v,*l_v;

#include <stdio.h>

#include <stdlib.h>

float FileFunction()

{float h;

FILE *in;

in=fopen («spisok.txt», «r»);

for (;! feof(in);)

{

w_f=(struct files *) malloc (sizeof(struct files));

if (l_f==NULL) {l_f=w_f;}

else {r_f->radr=w_f;}

fscanf (in, «%f»,&w_f->x);

fscanf (in, «%f»,&w_f->y);

r_f=w_f;

} w_f=l_f;

fclose(in);

w_f=l_f->radr;

h=(w_f->x) – (l_f->x);

return h;

}

void TableMin()

{

float s, s1, p;

do

{

s=w_f->y;

w_f=w_f->radr;

s1=w_f->y;

p=s1-s;

w_msp=(struct msp *) malloc (sizeof(struct msp));

w_fll=(struct fll *) malloc (sizeof(struct fll));

if (l_msp==NULL) {l_msp=w_msp;}

else {r_msp->radr1=w_msp;}

if (l_fll==NULL) {l_fll=w_fll;}

else {r_fll->radr2=w_fll;}

w_fll->a=p; r_fll=w_fll;

w_msp->z=p; r_msp=w_msp;

}

while (w_f!=r_f);

w_msp=l_msp;

return;

}

void TableMax()

{

float p, s, s1, i, c;

for (i=1; i<=8; i++)

{c=w_msp->z;

l_msp=NULL;

do

{

s=c;

w_msp=w_msp->radr1;

c=w_msp->z;

s1=w_msp->z;

p=s1-s;

w_fll=(struct fll *) malloc (sizeof(struct fll));

r_fll->radr2=w_fll;

w_fll->a=p; r_fll=w_fll;

r_msp->radr1=w_msp;

if (l_msp==NULL) {w_msp->z=p; l_msp=w_msp;}

else {w_msp->z=p;}

} while (w_msp!=r_msp);

r_msp=w_msp;

w_msp=l_msp;

}

return;

}

float UX (float x, float h)

{

float u, u1;

int i=1;

w_f=l_f;

while (w_f!=r_f) {w_f=w_f->radr; i++;}

i=(i/2);

for (w_f=l_f; i>=1; i-) {w_f=w_f->radr;}

u=(x – (w_f->x))/h;

w_u=(struct u *) malloc (sizeof(struct u));

l_u=w_u;

w_u->u=u;

r_u=w_u;

for (i=1; i<=3; i++)

{

u1= – (i*i-u*u)/((i*2)*((i*2)+1));

u1=u1*(w_u->u);

w_u=(struct u *) malloc (sizeof(struct u));

r_u->uadr=w_u;

w_u->u=u1;

r_u=w_u;

}

return u;

}

float VX (float u)

{

float v1, v, i;

v=1-u;

w_v=(struct v *) malloc (sizeof(struct v));

l_v=w_v;

r_v->vadr=w_v;

w_v->v=v;

r_v=w_v;

for (i=1; i<=4; i++)

{

v1= – (i*i-v*v)/((i*2)*((i*2)+1));

v1=v1*(w_v->v);

w_v=(struct v *) malloc (sizeof(struct v));

r_v->vadr=w_v;

w_v->v=v1;

r_v=w_v;

}

return 1;

}

float Summa()

{

int j, i=1;

float s, s1, p;

w_f=l_f;

w_fll=l_fll;

w_u=l_u;

w_v=l_v;

while (w_f!=r_f) {w_f=w_f->radr; i++;}

i=(i/2);

for (w_f=l_f; i>=1; i-) {w_f=w_f->radr;}

s=(w_f->y)*(w_v->v);

w_f=w_f->radr;

s1=(w_f->y)*(w_u->u);

w_f=l_f;

while (w_f!=r_f) {w_f=w_f->radr; i++;}

i++;

j=i;

do

{

if (i==0) {j – ;}

i=j;

j=i-1;

i=j;

for (; i>=1; i-) {w_fll=w_fll->radr2;}

i=j;

for (i=((i/2) – 1); i>=1; i-) {w_fll=w_fll->radr2;}

w_v=w_v->vadr;

s=s+(w_fll->a)*(w_v->v);

i=j;

for (i=((i/2)); i>=1; i-) {w_fll=w_fll->radr2;}

} while (w_fll!=r_fll);

w_fll=l_fll;

w_f=l_f;

while (w_f!=r_f) {w_f=w_f->radr; i++;}

j=i;

w_u=l_u;

do

{

j=i;

for (; i>=1; i-) {w_fll=w_fll->radr2;}

i=j-1;

for (i=((i/2)+1); i>=1; i-) {w_fll=w_fll->radr2;}

w_u=w_u->uadr;

s1=s1+(w_fll->a)*(w_u->u);

i=j-1;

j=0;

i=i-1;

for (i=((i/2)); i>=1; i-, j++) {w_fll=w_fll->radr2;}

i=j*2;

} while (w_u!=r_u);

p=s1+s;

return p;

}

void main()

{

float p, u, h, x;

l_msp=NULL; l_fll=NULL; l_f=NULL;

w_u=NULL; r_u=NULL; l_u=NULL;

w_v=NULL; r_v=NULL; l_v=NULL;

h=FileFunction();

w_f=l_f;

TableMin();

TableMax();

printf («n BBEDuTE X=»);

scanf («%f»,&x);

u=UX (x, h);

VX(u);

p=Summa();

printf («nOTBET:%3.4f», p);

getch();

}

Поделиться статьёй
Поделиться в telegram
Поделиться в whatsapp
Поделиться в vk
Поделиться в facebook
Поделиться в twitter
Лев Цветков
Лев Цветков
Я являюсь кандидатом математических наук. Окончил финансовый университет при Правительстве Российской Федерации, факультет прикладной математики и информационных технологий ФУ. По специальности работаю более 25 лет, за это время написал 6 диссертаций, 20 научных статей и 6 монографий. Кроме преподавания работаю репетитором, а по выходным подрабатываю в компании «Диплом777». С сайтом сотрудничаю с 2012 года.

Ещё статьи

Нет времени делать работу? Закажите!
Вид работы
Тема
Email

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