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

64

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

4) Метод Ньютона (касательных)

Рис. 7. Метод касательных

Формула для данного метода выводится аналогично формуле для метода

хорд, только

вместо хорд

здесь используются касательные: y = k x +c ,

коэффициент

k

находится из геометрического смысла производной. Таким

образом: x1

= −

f (b)

+b ,

x2

= −

f (x1 )

+ x1

и общая итерационная формула

 

 

 

 

 

f '(b)

 

 

f '(x )

 

имеет вид:

 

 

 

 

 

1

 

 

 

 

 

 

 

 

f (xi1 )

 

 

 

 

 

 

xi

= −

+ xi1 .

Мы находим

 

 

 

 

f '(xi1 )

 

 

 

 

 

 

 

x1 , x2 , K, xn

до тех пор, пока f (xn ) не станет меньше ε -

заданной точности.

 

 

 

 

 

 

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

65

Листинг 4.4.

// МЕТОД НЬЮТОНА

function[value] = f(x)

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

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

i = 0;

x = b;

while abs(f(x)) > e x_prev = x;

k = numdiff(f, x); x = -f(x)/k + x;

i = i+1; end

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

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

5) Метод Бернулли

Пусть нам дано алгебраическое уравнение:

66

На основе коэффициентов этого алгебраического уравнения составляется конечно-разностное уравнение:

a0 yn+i +a1 yn+i1 +K+an yi = 0, (i = 0,1, 2, K)

(2)

Разностное уравнение – рекуррентное соотношение, связывающее следующие друг за другом n +1 членов бесконечной последовательности:

y0 , y1 , K, yi , K (3)

Решением этого уравнения называется последовательность: y0 , y1, K, yi, K,

члены которой удовлетворяют уравнению (2).

Для построения решения yi достаточно задать n его начальных значений:

y0 , y1,K, yn1

Остальные же члены yn , yn+1 , K шаг за шагом можно определить из уравнения:

a0 yn+i +a1 yn+i1 +K+an yi = 0, (i = 0,1, 2, K).

Теорема 4.3. Пусть алгебраическое уравнение имеет единственный наибольший по модулю корень x1 , тогда отношение двух последовательных

членов yi+1 и yi решения конечно-разностного уравнения стремится к пределу равному x1 , т.е.

lim yyi+1 = x1

i→∞

i

Таким образом, для приближенного нахождения наибольшего по модулю корня x1 алгебраического уравнения можно пользоваться формулой:

x1 yyii1

Заметим, что начальные значения, yi (i = 0,1, K, n 1) , могут быть взяты произвольно. Обычно берут:

Рассмотрим пример. Пусть надо найти наибольший по модулю корень x1 уравнения:

x5 +5x4 5 = 0 .

Соответствующее конечно-разностное уравнение имеет вид:

Выбираем начальные значения:

67

По формуле (*) подсчитываем значения yi при i 5 . Запишем найденные значения в таблицу:

Рис. 9. Трассировочная таблица

Остановившись на y13 , будем иметь:

x1 y13 = −1937500 = −4.991948 . y12 388125

Отсюда, учитывая y12 , приближенно можно положить:

x1 = −4.99195 .

Приведем теперь реализацию данного метода в системе Scilab.

Листинг 4.5.

//Метод Бернулли

//точность

e = 1e-8;

n = input('Enter a degree of a polynom'); z = 0; // служебная переменная

prev = 1; // служебная переменная

iter = 100; // 100 итераций должно хватить? ха-ха-ха!

// степень многочлена произвольна disp('Enter factors');

for i=1:n+1 a(i)= input('');

end

for i=1:n-1

y(i)=1; // вместо 1 можно подставить и другие значения end

y(n)=1;

//степень многочлена произвольна, поэтому

//не можем воспользоваться условием f(x) < e for i = 1:iter

68

z = 0;

for j = 2:n+1

z = z-a(j)*y(n-j+2); end

z=z/a(1); for j = 1:n-1

y(j) = y(j+1); end

y(n) = z;

if prev <> 0 x = z/prev;

end prev = z;

end

// проверка на корень summa = 0;

for i = 1:n+1

summa = summa + a(i)*x^(n+1-i); end

if abs(summa) > e

disp('мало итераций или нет корня'); else

x end

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