Файл: Определение корня уравнения методами табуляции, деления отрезка пополам.doc
Добавлен: 29.10.2018
Просмотров: 361
Скачиваний: 10
Определение корня уравнения методами: табуляции, деления отрезка пополам.
Метод деления отрезка пополам – один из наиболее распространенных простейших итерационных методов нахождения корней нелинейных уравнений. Во всех итерационных методах корни уравнения находятся приближенно при помощи многократных повторений вычислительной процедуры, пока не будет достигнута требуемая точность. Если после каждого повторения (итерации) погрешность в вычислении корня уменьшается – то итерационная процедура сходится (мы все более и более приближаемся к корню), иначе – процесс расходится.
Для использования метода деления отрезка пополам необходимо предварительно проанализировать поведение функции, например, построить таблицу значений функции (протабулировать), выделить окрестности корней и выбрать тот корень, который мы хотим найти первым – т.е. задать отрезок [a, b], в котором он расположен. На концах отрезка окрестности корня функция будет иметь разные знаки. Делим начальный отрезок пополам – на отрезки [a, х0] и [х0, b], где х0=(a+b)/2. Определяем, в каком из этих отрезков находится корень. Обозначаем через a и b границы этого отрезка. Для отрезка с корнем значения функции f(x) в граничных точках будут иметь разные знаки. В качестве критерия того, что функция имеет разные знаки, можно использовать знак выражения f(a)*f(b). Если f(a)*f(b) будет меньше нуля, то функция в точках a и b имеет разные знаки. Второй отрезок, на котором знак f(x) не меняется, отбрасываем. В качестве первого приближения корня принимаем точку c0. Проверяем значение функции f(х0), если оно по модулю меньше заданной погрешности – e, т.е. |f(х0)|<e , то считаем, что корень найден. Если корень с допустимой погрешностью еще не найден, то переходим ко второй итерации – снова делим этот отрезок пополам, находим новую точку х1=(a+b)/2 и повторяем итерационную процедуру.
В качестве критерия сходимости можно добавить анализ текущей ширины отрезка [a, b], если она становится меньше допустимой погрешности ex: [a,b]<ex и модуль значения функции меньше заданной погрешности e: |f(х0)|<e, то процесс прекращается.
Для того, чтобы в случае расходимости метода вычисления не длились бесконечно долго максимальное количество итераций ограничивают, как правило, для определения корня достаточно нескольких десятков итераций.
Алгоритм нахождения корня уравнения методом деления отрезка пополам на естественном языке:
1. Задаем начальные параметры алгоритма: точность нахождения корня – е и максимальное количество итераций – maxi.
2. Запрашиваем у пользователя границы отрезка a и b, табулируем функцию на заданном отрезке.
3. Задаем главный цикл от 1 до максимального количества итераций.
4. Проверяем, если на заданном отрезке функция меняет знак, то продолжаем вычисления, в обратном случае – отрезок выбран неудачно. Выход из программы.
5. Находим середину отрезка [a,b], вычисляем значение функции в точке х0. В случае удовлетворения точности нахождения корня и критерию сходимости завершаем итерации - работа программы закончена, в обратном случае – 6.
6. Переопределяем отрезок [a,b] таким образом, чтобы на нем выполнялось условие смены знака функции. Переходим к Шагу 5.
Алгоритм решения на языке VFP:
clear
e=0.001
maxi=1000
input "Введите границу отрезка а: " to a
input "Введите границу отрезка b: " to b
DO Tabulation WITH a,b,0.5
FOR i=1 TO maxi
fa=f(a)
fb=f(b)
IF fa*fb<0 then
x=(a+b)/2
fx=f(x)
?" Итерация= "+ALLTRIM(STR(i))
??" : x= "+TRANSFORM(x,"99.99")
??" : (f(x))= "+transform(fx,"99.9999")
IF ABS(fx)<e
?" Корень найден, x= "+ALLTRIM(str(x))
??" за "+ALLTRIM(STR(i))+ " итераций !!!"
RETURN
ELSE
IF fa*fx<0 THEN
b=x
endif
IF fx*fb<0 THEN
a=x
endif
ENDIF
ELSE
?" Итерация= "+ALLTRIM(STR(i))
??" : f(a)= "+TRANSFORM(fa,"99.9999")
??" : f(b)= "+TRANSFORM(fb,"99.9999")
?" Отрезок [a,b] выбран неудачно !!!"
return
ENDIF
ENDFOR
? "Решение не найдено за", maxi, "итераций"
FUNCTION f
PARAMETERS x
RETURN (x-4)*(x-2)
ENDFUNC
PROCEDURE Tabulation
lparameters a,b,abstep
?"---Табуляция функции---"
FOR x=a TO b STEP abstep
?"x= "+TRANSFORM(x,"99.99")+" : "+"f(x)= "+TRANSFORM(f(x),"99.9999")
ENDFOR
?"-----------------------"
ENDPROC
Алгоритм решения задачи на Visual Basic:
Sub Dichotomia()
e = 0.001
maxi = 1000
a = Val(InputBox("Введите границу отрехка а: "))
b = Val(InputBox("Введите границу отрехка b: "))
Call Tabulation(a, b, 0.5)
For i = 1 To maxi
fa = f(a)
fb = f(b)
If fa * fb < 0 Then
x = (a + b) / 2
fx = f(x)
Debug.Print " Итерация= " + CStr(i)
Debug.Print " x= " + Format(x, "00.00")
Debug.Print " (f(x))= " + Format(fx, "00.0000")
If Abs(fx) < e Then
Debug.Print " Корень найден, x= " + CStr(x)
Debug.Print " за " + CStr(i) + " итераций !!!"
solution = True
Exit Sub
Else
If fa * fx < 0 Then
b = x
End If
If fx * fb < 0 Then
a = x
End If
End If
Else
Debug.Print " Итерация= " + CStr(i)
Debug.Print " : f(a)= " + Format(fa, "00.0000")
Debug.Print " : f(b)= " + Format(fb, "00.0000")
Debug.Print " Отрезок [a,b] выбран неудачно !!!"
Exit Sub
End If
Next i
If Not solution Then Debug.Print "Решение не найдено за", maxi, "итераций"
End Sub
Function f(x)
f = (x - 4) * (x - 2)
End Function
Sub Tabulation(a, b, abstep)
Debug.Print "---Табуляция функции---"
For x = a To b Step abstep
Debug.Print "x= " + Format(x, "00.00") + " : " + "f(x)= " + Format(f(x), "00.0000")
Next x
Debug.Print "-----------------------"
End Sub