Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачник_Главы 7-9.doc
Скачиваний:
7
Добавлен:
15.08.2019
Размер:
2.6 Mб
Скачать

Метод хорд.

Метод деления пополам можно улучшить, если использовать для следующего вычисления не середину отрезка, а то значение x, в котором дает нуль линейная интерполяция между двумя известными значениями функции f(x). Геометрический способ интерполяции эквивалентен замене кривой y=f(x) хордой, проходящей через точку А(а,f(a)) и через точку B(b,f(b)).

Уравнение хорды: , где x0 точка пересечения с осью ОX.

Найдем точку пересечения хорды с осью ОХ:( х=с; y=0 ) координаты этой точки

c=a- (*)

Алгоритм метода хорд состоит из следующих шагов:

  1. Вычислить f(a) и f(b).

  2. Вычислить с по формуле с (*). Вычислить f(c)

  3. Как только c-a< или b-c< закончить вычисление. За корень взять x=c.

  4. Если f(c)*f(a)>0, то a=c и f(a)=f(c), иначе b=c и f(b)=f(c).

  5. Выполнять с п.2.

Пример 9.2

Найти корни уравнения на интервале [0,2;1,5] = .

/**************************************************/

/* Приближенные методы решения уравнений. */

/* Метод хорд */

/**************************************************/

#include <stdio.h>

#include <math.h>

#include <conio.h>

void main( )

{

clrscr();

float a, b, eps;

float c, fa, fc,fb;

printf("\nВведите интервал[a,b] и точность eps\n");

printf("\n a="); scanf ("%f",&a);

printf("\n b="); scanf ("%f",&b);

printf("\n eps="); scanf ("%f",&eps);

printf("\nВведено a=%f\t b=%f \t eps=%f",a,b,eps);

fa=2*a-exp(-0.1*a);

fb=2*b-exp(-0.1*b);

if (fa!=0)

{

do

{

c=a-fa/(fb-fa)*(b-a);

fc=2*c-exp(-0.1*c);

if((c-a)<eps || (b-c)<eps )

{

printf ("\n Корень уравнения =%f",c);

break;

}

else

if (fa*fc>0)

{

a=c;

fa=fc;

}

else

{

b=c;

fb=fc;

}

} while (1);

}

getch();

}

Результаты работы программы.

Введите интервал[a,b] и точность eps

a=0.2

b=1.5

eps=0.0001

Введено a=0.200000 b=1.500000 eps=0.000100

Корень уравнения =0.476723

Метод хорд, как и метод деления пополам абсолютно надежен. В большинстве случаев он имеет более быструю сходимость, чем метод деления пополам. Однако основное достоинство метода деления пополам состоит в том, что скорость сходимости не зависит от вида функции f(x) и заранее известно, что будет в каждом конкретном случае, что нельзя сказать о методе хорд.

Метод Ньютона.

Если функция достаточно гладкая и имеет одну или более непрерывных производных, то можно применить и другие методы, позволяющие сократить число вычисляемых функций по сравнению с методом деления пополам.

В точке строят касательную. -точка пересечения. Далее снова строят касательную.

, где

Процесс продолжать до тех пор, пока |x -x |<.

Следовательно: .

Пример 9.3

Найти корни уравнения f(x)=sin(x)-x+0,15=0 на отрезке [0,5;1] =10 .

Запишем производную функции f(x):

f ’(x)=cos(x)-1

y=x-(sin(x)-x+0,15)/(cos(x)-1))

Выберем начальное приближение. Метод Ньютона обладает хорошей сходимостью, но основная трудность в методе Ньютона заключается в выборе начального приближения (x0), которое ведет к сходящемуся итерационному процессу. Начальное приближение целесообразно выбирать так, чтобы выполнялось условие:

f(x0)*f ’’(x0)>0

f ’’(x0)=-sin(x0)<0 (на заданном интервале). Значит необходимо, чтобы: f(x)=sin(x)-x*0,15<0.

Чтобы избежать процесса зацикливания программы, необходимо поставить ограничение на число итераций (повторов).

/************************************************/

/* Приближенные методы решения уравнений */

/* Метод Ньютона */

/************************************************/

#include <stdio.h>

#include <math.h>

#include <conio.h>

void main( )

{

clrscr();

int i, k=50; // k-ограничитель итераций.

float x, y, z, eps;

printf ("\n Начальное приближение:");

scanf ("%f",&x);

printf ("\n Точность:");

scanf ("%f",&eps);

printf ("\n x=%f и eps=%f", x, eps);

i=0; // i-счетчик итераций.

do

{

y=x-(sin(x)-x+0.15)/(cos(x)-1);

i++;

if (i>k) break;

z=x; // Сохраним предыдущее приближение.

x=y; // Новое приближение.

}

while (fabs(y-z)>eps);

if (i>=k)

printf ("\n Число итераций больше допустимого");

else

printf ("\n Корень равен=%f",x);

getch();

}

Результаты работы программы.

Начальное приближение:0.5

Точность:0.00001

x=0.500000 и eps=0.000010

Корень равен=0.981122