- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
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 (xi−1 ) |
|
||
|
|
|
|
|
xi |
= − |
+ xi−1 . |
||
Мы находим |
|
|
|
|
f '(xi−1 ) |
||||
|
|
|
|
|
|
|
|||
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+i−1 +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, yn−1
Остальные же члены yn , yn+1 , K шаг за шагом можно определить из уравнения:
a0 yn+i +a1 yn+i−1 +K+an yi = 0, (i = 0,1, 2, K).
Теорема 4.3. Пусть алгебраическое уравнение имеет единственный наибольший по модулю корень x1 , тогда отношение двух последовательных
членов yi+1 и yi решения конечно-разностного уравнения стремится к пределу равному x1 , т.е.
lim yyi+1 = x1
i→∞
i
Таким образом, для приближенного нахождения наибольшего по модулю корня x1 алгебраического уравнения можно пользоваться формулой:
x1 ≈ yyi−i1
Заметим, что начальные значения, 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
