> restart;

Несмотря на достоинства описанного выше метода повторяющегося деления, он может Вам показаться слишком медленным (особенно когда Вы пытаетесь достигнуть высокой степени точности результата), особенно при выполнении всех описанных действий вручную. Если нам известно, что функция f не только непрерывна, но и дифференцируема, то можно воспользоваться идеей линейного приближения. Из предлагаемого ниже рисунка следует: определив каким-то образом достаточно узкий диапазон, которому принадлежит корень функции f , в качестве приближения корня можно выбрать абсциссу точки пересечения касательной, проведенной к графику функции в какой-то "стартовой" точке. (На рисунке у такой начальной точки x = 1 .)

> f := x -> x^2 - 2;

f := proc (x) options operator, arrow; x^2-2 end pr...

> x0 := 1;

x0 := 1

> t1 := x -> f(x0) + D(f)(x0)*(x-x0);

t1 := proc (x) options operator, arrow; f(x0)+D(f)(...

> plot({f,t1}, 0..3);

[Maple Plot]

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

> x1 := solve(t1(x) = 0, x);

x1 := 3/2

> t2 := x -> f(x1) + D(f)(x1)*(x-x1);

t2 := proc (x) options operator, arrow; f(x1)+D(f)(...

> plot({f,t2}, 0..3);

[Maple Plot]

Обратите внимание: уже после первой итерации нам придётся "вооружиться микроскопом", чтобы увидеть на рисунке различие между истинным корнем функции f и точкой пересечения касательной с осью x .

> x2 := solve(t2(x) = 0, x); evalf(%);

x2 := 17/12

1.416666667

"Всё опять повторится сначала!":

> t3 := x -> f(x2) + D(f)(x2)*(x - x2);

t3 := proc (x) options operator, arrow; f(x2)+D(f)(...

> x3 := solve(t3(x) = 0, x); evalf(%);

x3 := 577/408

1.414215686

Для сравнения, приведём значение sqrt(2) , найденное Maple с точностью до 10 цифр :

> evalf(sqrt(2));

1.414213562

Очевидно, метод Ньютона гораздо быстрее (по крайней мере - для выбранного нами случая).

Желательно, чтобы Вы рассуждали на тему возможных недостатков обоих методов.

 
 
Hosted by uCoz