Файл: Определение корня одномерного уравнения методом секущих.doc
Добавлен: 29.10.2018
Просмотров: 269
Скачиваний: 9
Определение корня одномерного уравнения методом секущих
В итерационном методе секущих каждое следующее значение xn+1 находится по формуле (1) как точка пересечения оси абсцисс с хордой, проведенной через точки f(a) и f(b), абсциссы a и b взяты с одной стороны от корня и не фиксируются.
(1)
Условие сходимости метода секущих:
(2)
Алгоритм нахождения корня уравнения методом секущих на естественном языке:
1. Задаем начальные параметры алгоритма: точности нахождения корня по х и у – еpsx и epsy, а также максимальное количество итераций – maxi.
2. Запрашиваем у пользователя начальное приближение к корню х0 и приращение d для вычисления двух начальных точек: x0 и xn.
3. Вычисляем значения функции в данных двух точках: f(x0) и f(xn).
4. Начало итераций от 1 до maxi.
5. Вычисление следующего приближения х по формуле (1), а также вычисление значения функции в этой точке f(x).
6. Вычисление погрешностей нахождения корня.
7. В случае удовлетворения условия: погрешности по осям x и y меньше точности вычисления корня – корень найден - конец вычислений, в обратном случае – 8.
8. Переопределение начальных точек приближения x0=xn и xn=x а также значений функции в этих точках. Переход к Шагу 5. Итерации продолжаются до тех пор, пока не будет удовлетворены условия Шага 7 либо количество итерации превысит значение maxi.
Алгоритм решения на языке VFP:
clear
eps1=0.001
eps2=0.001
maxi=1000
input "Введите начальное приближение к корню х0 :" to x0
Input "Введите начальный шаг приращения d :" to d
xn=x0+d
f0=f(x0)
fn=f(xn)
FOR i = 1 TO maxi
x=xn-(xn-x0)*fn/(fn-f0)
fx=f(x)
err2=abs(xn-x)
err1=aBS(fn-fx)
? "Итерация= "+ALLTRIM(STR(i))
?? " : x= "+ TRANSFORM(x,"99.999 999 999")
?? " : f(x)= "+ transform(fx,"99.999 999 999")
IF err1<eps1 AND err2<eps2
? "Решение найдено: ", x
RETURN
ENDIF
x0=xn
xn=x
f0=fn
fn=fx
ENDFOR
function f
LPARAMETERS x
return (x-4)*(x-2)
ENDPROC
Алгоритм решения задачи на Visual Basic:
Sub Sekushie()
eps1 = 0.001
eps2 = 0.001
maxi = 1000
x0 = Val(InputBox("Введите начальное приближение к корню х0:"))
d = Val(InputBox("Введите начальный шаг приращения d:"))
xn = x0 + d
f0 = f(x0)
fn = f(xn)
For i = 1 To maxi
x = xn - (xn - x0) * fn / (fn - f0)
fx = f(x)
err2 = Abs(xn - x)
err1 = Abs(fn - fx)
Debug.Print "Итерация= " + CStr(i)
Debug.Print "x= " + Format(x, "00.000 000 000")
Debug.Print "f(x)= " + Format(fx, "00.000 000 000")
If err1 < eps1 And err2 < eps2 Then
Debug.Print "Решение найдено !!! x= " & x
Exit Sub
End If
x0 = xn
xn = x
f0 = fn
fn = fx
Next i
End Sub
Function f(x)
f = (x - 4) * (x - 2)
End Function