Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 Алгебраические и трансцендентные уравнения.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
808 Кб
Скачать
☆

2.2.3.Метод хорд

Метод хорд [7] заключается в замене кривой y = f(x) отрезком прямой, проходящей через точки (a, f(a)) и (b, f(b)) (см. рис. 2.6). Абсцисса точки пересечения прямой с осью OX принимается за очередное приближение.

Чтобы получить расчетную формулу метода хорд, запишем уравнение прямой, проходящей через точки (a, f(a)) и (b, f(b)) и, приравнивая y нулю, найдем x:

.

Рис.2.6. Метод хорд

Алгоритм метода хорд:

1) Пусть k = 0;

2) Вычислим следующий номер итерации: k = k + 1; Найдем очередное k-ое приближение по формуле: xk = a – f(a)(b – a)/(f(b) – f(a)); Вычислим f(xk).

3) Если f(xk)= 0 (корень найден), то переходим к 5).

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

4) Если |xk – xk-1| > ε, то переходим к шагу 2);

5) Выводим значение корня xk.

6) Конец.

Замечание. Действия третьего пункта аналогичны действиям метода половинного деления. Однако в методе хорд на каждом шаге может сдвигаться один и тот же конец отрезка (правый или левый), если график функции в окрестности корня выпуклый вверх (рис. 2.6, a)) или вогнутый вниз (рис. 2.6, b)). Поэтому в критерии сходимости используется разность соседних приближений.

Пример 2.6. Применим метод хорд к уравнению sin 5x + x2 – 1 = 0 и отрезку [0,2; 0,3] для определения корня с точностью до ε = 0,001.

Решение. Проведем расчеты в программе Excel:

1) В ячейки A1:H1 запишем заголовки столбцов как в табл. 2.6;

2) В ячейку B3 запишем формулу =ЕСЛИ(C2*E2<0;B2;D2) и затем ячейку B3 протянем маркером заполнения до ячейки B10;

3) В ячейку C2 запишем формулу =SIN(5*B2)+B2^2-1 и затем ячейку C2 протянем маркером заполнения до ячейки C10;

4) В ячейку D2 запишем формулу =B2-C2*(F2-B2)/(G2-C2) и затем ячейку D2 протянем маркером заполнения до ячейки D10;

5) В ячейку E2 запишем формулу =SIN(5*D2)+D2^2-1 и затем ячейку E2 протянем маркером заполнения до ячейки E10;

6) В ячейку F3 запишем формулу =ЕСЛИ(C2*E2<0;D2;F2) и затем ячейку F3 протянем маркером заполнения до ячейки F10;

7) В ячейку G2 запишем формулу =SIN(5*F2)+F2^2-1 и затем ячейку G2 протянем маркером заполнения до ячейки G10;

8) В ячейку H2 запишем формулу =ABS(F2-B2) и затем ячейку H2 протянем маркером заполнения до ячейки H10;

В таблице 2.8 приведены результаты. Необходимая точность достигается на шаге k = 4.

Таблица 2.8

A

B

C

D

E

F

G

H

1

k

a

f(a)

x

f(x)

b

f(b)

|b-a|

2

1

0,2

-0,11853

0,25753165

0,026506

0,3

0,0874949

0,1

3

2

0,2

-0,11853

0,24701739

0,005194

0,25753165

0,026506

0,01051

4

3

0,2

-0,11853

0,24504339

0,000926

0,24701739

0,0051944

0,00197

5

4

0,2

-0,11853

0,24469436

0,000162

0,2450434

0,0009256

0,00035

Решение в программе Mathcad:

Как видим, результаты расчетов согласуются с предыдущими ответами.

Приведем программу, которая реализует метод хорд на языке C++:

#include <iostream.h>

#include <math.h>

double f(double x);

typedef double (*PF)(double);

double hord(PF f,double a, double b,double eps, int Kmax);

int main(){

double a, b, x, eps;PF pf; int Kmax;

cout << "\n a = "; cin >> a;

cout << "\n b = "; cin >> b;

cout << "\n eps = "; cin >> eps;

cout << "\n Kmax = "; cin >> Kmax;

pf = f;

x = hord(pf,a,b,eps, Kmax); cout << "\n x = " << x;

cout << "\n Press any key & Enter "; cin >> a;

return 0;

}

double f(double x){

double r;

r = sin(5*x)+x*x-1;

return r ;

}

double hord(PF f, double a, double b,double eps,int Kmax){

double xk, xk1, xerr; int k = 0;

xk = a;

do{ k = k + 1; if(k > Kmax)break;

xk1 = a - f(a)*(b - a)/(f(b) - f(a));

if (f(xk1) == 0) break;

xerr = fabs(xk1 - xk); xk = xk1;

if (f(xk1)*f(b) > 0) b = xk1;

else a = xk1;

}while (xerr > eps);

return xk1;

}

Результат расчета для примера 2.6:

a = 0.2

b = 0.3

eps = 0.0001

Kmax = 100

x = 0.244633

Press any key & Enter

Как видим, результат совпадает с предыдущими расчетами.