Цитата
Программа находит корень уравнения 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)
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
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.