Метод дихотомии (деления отрезка пополам) Цитата
Программа находит корень уравнения F(x) = 0, где F(x) - непрерывная на отрезке [a,b] функция, удовлетворяющая условию F(a)*F(B)<0. Для нахождения корня отрезок [a,b] делится пополам и выбирается тот полуинтервал, на концах которого знаки F(x) разные. Затем процесс деления повторяется до тех пор, пока длина интервала не станет меньше Eps.
{$n+} Uses Crt; Function f(x: Double): Double; Begin f := 1 / (Exp(x * Ln(2))) - 10 + 0.5*Sqr(x) End; Var x, Eps, a, b, c: Double; n: Integer; begin ClrScr; Writeln('Введите значения a и b'); Read(a, b); WriteLn('Введите точность Eps'); Read(Eps); n := 0; Repeat c := (a + b) / 2; If (f(a) * f©) < 0 Then b := c Else a := c; Inc(n) Until (b - a) <= Eps; x := (a + b) / 2; WriteLn('Корень равен x=', x:10:7); WriteLn('Количество делений = ',n); ReadKey end.
Метод хорд
{$n+} Uses Crt; Var x, Eps, a, b, c: Double; n: Integer; Function f(x: Double): Double; Begin f := 1 / (Exp(x * Ln(2))) - 10 + 0.5*Sqr(x) End; Function Chord(a, b: Double): Double; Begin Chord := (f(b)*a - f(a)*b) / (f(b) - f(a)) End; begin ClrScr; Writeln('Введите значения a и b'); Read(a, b); WriteLn('Введите точность Eps'); Read(Eps); ClrScr; n := 0; Repeat C := Chord(a, b); If f(a)*f© > 0 Then a := c Else b := c; Inc(n) Until Abs(Chord(a, b) - C) < Eps; x := c; WriteLn('Корень равен x=', x:10:7); WriteLn('Количество итераций = ',n); ReadKey end.
Метод Ньютона (касательных) Цитата
Действительный корень x уравнения F(x) = 0 вычисляется методом Ньютона по итерационному уравнению:Xk+1 = Xk - F(Xk)/F'(Xk)
{$n+} Function newton(start, Eps: Extended): Extended; Var X, prev: Extended; { Заданная функция } Function F(Arg: Extended): Extended; Begin F := Sqr(Arg) - 2 End; { Производная заданной функции } Function Deriv(Arg: Extended): Extended; Begin Deriv := 2 * Arg End; Begin X := start; Repeat prev := X; X := prev - F(prev) / Deriv(prev); Until Abs(X - prev) <= Eps; newton := X End; Var a, Eps: Extended; begin WriteLn('Введите начальное приближение a'); Read(a); WriteLn('Введите точность Eps'); Read(Eps); WriteLn('Корень равен x= ', newton(a, Eps):10:7); end.
Метод Ньютона с аппроксимацией производной Цитата
Если вычисление производной в методе Ньютона затруднено, можно заменить ее вычисление оценкой:F'(X)= (F(X+h)-F(X))/h
{$n+} Function newton(start, Eps: Extended): Extended; Var X, prev: Extended; Function noDeriv(Arg: Extended): Extended; Function F(Arg: Extended): Extended; Begin F := 1 / (Exp(arg * Ln(2))) - 10 + 0.5*Sqr(arg) End; Begin noDeriv := -2 * Eps * F(Arg) / (F(Arg + eps) - F(Arg - eps)) End; Begin X := start; Repeat prev := X; X := prev + noDeriv(prev) Until Abs(X - prev) <= Eps; newton := X End; Var a, Eps: Extended; begin WriteLn('Введите начальное приближение a'); Read(a); WriteLn('Введите точность Eps'); Read(Eps); WriteLn('Корень равен x= ', newton(a, Eps):10:7); end.