Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

59

Глава_4.

Решение нелинейных алгебраических уравнений

Численное решение нелинейного алгебраического уравнения проводят в два этапа:

Сначала отделяют корни уравнения, то есть находят такие промежутки, в которых содержится только один корень;

На втором этапе проводят уточнение отделенных корней, то есть находят корни с заданной точностью.

Для отделения корней удобно пользоваться двумя следующими теоремами.

Теорема

4.1.

Если

функция

f (x)

непрерывна на отрезке [a;b] ,

причем

f (a) f (b) < 0

, то на отрезке [a;b]

функция имеет хотя бы один корень.

 

Теорема

4.2.

Если

функция

f (x)

строго монотонна на отрезке

[a;b] и

f (a) f (b) < 0

, то

f (x) имеет единственный корень на отрезке [a;b] .

 

1) Метод половинного деления

Рис.1. Метод половинного деления

Алгоритм:

1)Вводим интервал для поиска решения a,b .

2)Начало цикла.

3)Делим интервал пополам, получаем точку c = a +2 b .

4)Если знаки функции f (x) в точках a и c различны, решение находится на интервале (a,c) , тогда положим b = c ; иначе, если знаки функции в точках c и b различны, решение находится на

60

интервале (c,b) , тогда положим a = c , иначе прекращаем работу,

поскольку решения нет.

5) Пока f (x) < e , возвращаемся к началу цикла, иначе выводим середину интервала a +2 b и заканчиваем работу (здесь, e -

заданная точность).

Приведем теперь реализацию данного метода в системе Scilab. Будем искать корень уравнения: x2 5x 7 = 0 .

Листинг 4.1.

// МЕТОД ПОЛОВИННОГО ДЕЛЕНИЯ

function[value] = f(x)

value = x^2 - 5*x - 7; // зададим функцию endfunction

a = input('Введите наименьшую точку интервала'); b = input('Введите наибольшую точку интервала'); e = 0.000001;

i = 0;

if f(a)*f(b) > 0

disp('воспользуйтесь другим методом или поменяйте промежуток'); return;

end if; x = b;

while abs(f(x)) > e i = i+1;

x = (b+a)/2; if f(x)*f(a) < 0 b = x;

else

a = x; end end

disp('КОРЕНЬ = '); x disp('ИТЕРАЦИИ') i

61

Рис. 2. Результат работы Листинга_4.1

2) Метод Секущих

Рис. 3. Метод секущих

Суть данного метода состоит в том, чтобы с помощью секущих получить

последовательность точек xn : lim xn = x0 , где f (x0 ) = 0 .

n→∞

Записываем уравнение первой хорды: y = k x +c1 .

Коэффициент k =

f (b) f (a)

 

и остается

постоянным

у

каждой

хорды.

 

 

 

 

b a

 

 

 

 

 

 

 

 

 

 

 

 

 

Находим c1 из равенства

y(b) = f (b) :

k b +c1 = f (b) . Отсюда c1 = f (b) k b .

Тогда

y = k x + f (b) k b = k (x b) + f (b) .

Находим

x1

-

первую

точку

последовательности {xn } из условия

y(x1 ) = 0 :

 

 

 

 

 

k (x1 b) + f (b) = 0 , отсюда

x1

= −

f (b)

+b .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

 

 

 

 

 

 

Уравнение второй хорды:

y = k x +c2 . Находим c2 из условия

f (x1 ) = y(x1 ) :

k x1 +c2

= f (x1 ) , отсюда: c2 = f (x1 ) k x1 и

y = k (x x1 ) + f (x1 ) . Находим x2 -

вторую точку последовательности из условия y(x2 ) = 0 :

 

 

 

 

k (x2 x1 ) + f (x1 ) = 0 , отсюда

x2

= −

f (x1 )

+ x1 .

 

 

 

 

 

k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Итак, мы находим x1 , x2 , K, xn

и если

f (xn ) <ε , то xn

-

корень,

найденный

с точностью ε .

 

 

 

 

 

 

 

 

 

 

 

 

 

Приведем теперь реализацию данного метода в системе Scilab. Будем искать корень уравнения: x2 5x 7 = 0 .

62

Листинг 4.2.

// МЕТОД СЕКУЩИХ

function[value] = f(x) value = x^2 - 5*x - 7; endfunction

a = input('Введите наименьшую точку интервала'); b = input('Введите наибольшую точку интервала'); e = 0.000001; // погрешность задаем произвольно

i = 0; // счетчик итераций (просто для интереса)

k = (f(b)-f(a))/(b-a); x = b;

while abs(f(x)) > e i = i+1;

x_prev = x;

x = -f(x)/k + x; end

disp('КОРЕНЬ = '); x disp('ИТЕРАЦИИ'); i

Рис. 4. Результат работы Листинга_4.2

3) Метод секущих (с изменяемым углом)

63

Рис. 5. Метод секущих с изменяемым углом

Из рис.5 очевидно, что

x1 = −

f (b) (b a)

+b ;

x2 = −

f (x1 ) (b x1 )

+ x1 ; .………

f (b) f (a)

f (b) f (x )

 

 

 

 

 

 

 

 

 

 

1

 

Общая итерационная формула для данного метода имеет вид:

xi = −

f (xi1 ) (b xi1 )

+ xi1 .

f (b) f (xi1 )

 

 

Приведем теперь реализацию данного метода в системе Scilab. Будем искать корень уравнения: x2 5x 7 = 0 .

Листинг 4.3.

// МЕТОД СЕКУЩИХ C ИЗМЕНЯЕМЫМ УГЛОМ

function[value] = f(x) value = x^2 - 5*x - 7; endfunction

a = input('Введите наименьшую точку интервала'); b = input('Введите наибольшую точку интервала'); e = 0.000001; // погрешность задаем произвольно

i = 0; // счетчик итераций (просто для интереса)

x = a;

while abs(f(x)) > e i = i+1;

x_prev = x;

x = -(f(x)*(b-a))/(f(b)-f(x)) + x; end

disp('КОРЕНЬ = '); x disp('ИТЕРАЦИИ'); i