- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
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 (xi−1 ) (b − xi−1 ) |
+ xi−1 . |
|
f (b) − f (xi−1 ) |
|||
|
|
Приведем теперь реализацию данного метода в системе 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
