- •Численные методы
- •Содержание
- •Введение
- •1. Вычисление определенных интегралов Справочная информация
- •Формула средних прямоугольников
- •Формула трапеций
- •Формула Симпсона (j.Gregory(Грегори)1668,Th.Simpson1743)
- •Пример решения в среде Matlab
- •Контрольные задания
- •2. Решение нелинейных уравнений Справочная информация
- •Метод простых итераций Метод основывается на приведении исходного уравнения к форме
- •Относительная разница между значениями приближения корня на третьей и четвёртой итерациях составляет
- •Метод хорд
- •Пример решения на пэвм в среде Matlab
- •Контрольные задания
- •3. Решение систем линейных алгебраических уравнений Справочная информация
- •Метод Гаусса с выбором главного элемента
- •Метод простых итераций
- •О выборе метода решения систем уравнений
- •Пример решения на пэвм в среде Matlab
- •Контрольные задания
- •4. Интерполяция таблично заданных функций Справочная информация
- •Кусочно-линейная интерполяция
- •Пример решения на пэвм в среде Matlab
- •Контрольные задания
- •5. Аппроксимация таблично заданных функций Справочная информация
- •Пример решения на пэвм в среде Matlab
- •Контрольные задания
- •6. Решение задачи коши для обыкновенных дифференциальных уравнений 1-го порядка Справочная информация
- •Усовершенствованный метод Эйлера
- •Оценка погрешностей методов
- •Программное обеспечение
- •Пример решения на пэвм в среде Matlab
- •Контрольные задания
- •7. Решение задачи коши для нормальных систем обыкновенных дифференциальных уравнений и уравнений высших порядков Справочная информация
- •Метод Эйлера
- •Усовершенствованный метод Эйлера
- •Оценка погрешностей методов
- •Пример решения на пэвм в среде Matlab
- •Контрольные задания
- •Приложение. Основы работы в среде matlab Интерфейс среды
- •Переменные и константы
- •Арифметические операторы
- •Операторы отношения
- •Логические операторы
- •Элементарные функции
- •Простейшие способы ввода–вывода информации
- •Векторы и матрицы
- •Оператор двоеточие «:»
- •Оператор разветвления if
- •Операторы циклов
- •Вывод информации в файл
- •Форматный вывод информации
- •Ввод данных из файла
- •Построение графиков
- •Сообщения об ошибках и исправление ошибок
- •Список литературы
Метод хорд
Идея метода состоит в замене функцииf(x) внутри отрезка [a, b] линейной функцией (см. рис.7). Точка пересечения x1 графика линейной функции и оси абсцисс принимается за значение одной из границ нового отрезка локализации корня, который выбирается так, чтобы выполнялось одно из условий
f(a)·f(x1) < 0 или f(x1)·f(b) < 0.
Далее процесс повторяется и находится следующее приближение корня x2 – точка пересечения графика линейной функции нового отрезка с осью абсцисс.
Д
Рис.7.
или .
Процесс поиска корня продолжается до тех пор, пока не будет выполнено одно из условий окончания вычислений
или ,
где δабс и δотн – задаваемые абсолютная и относительная разницы между соседними значениями приближения корня, соответственно. Абсолютная погрешность найденного значения корня может быть оценена с помощью неравенства
,
где
, .
При решении практических задач, учитывая предположение о монотонности функции f(x) и её первой производной на отрезке [a, b] локализации корня, вместо приведённых формул для M и m используют их приближённые аналоги
, .
Каждый из рассмотренных методов имеет свои достоинства и недостатки. В частности, итерационные методы обладают бóльшей скоростью сходимости вычислений, чем методы сужения интервала. Однако они требуют предварительных аналитических преобразований, что не всегда целесообразно.
Пример решения на пэвм в среде Matlab
Пусть надо отыскать все корни уравнения
x3 – 10x2 + 25x – 12 = 0
на отрезке [0,10] с абсолютной погрешностью не хуже 0.001.
Сначала построим график заданной функции на указанном отрезке. Эта операция необходима для локализации корней. Для этого сначала создаётся и сохраняется f.m с формулой для вычисления левой части уравнения:
function y=f(x)
y=x.^3 - 10*x.^2 + 25*x - 12
Затем в окне Command Windowзадаются команды для построения графика функции. При этом указываются границы изменения аргумента и шаг его изменения, организуется обращение к встроенной функцииplotс указанием массивов значений абсцисс и ординат, по которым строится график, а также применяется опцияgridдля вывода сетки (это можно сделать и интерактивно непосредственно в графическом окне):
x=0:0.01:10
plot(x,f(x)), grid
Получающийся результат работы такой программы показан рис.8. Количество корней в данном случае три, их начальные приближения можно принять в виде 1, 4 и 7.
Для уточнения этих начальных приближений корней и получения
Рис.8.
их значений с заданной погршностью в том же окне Command Windowследует последовательно обратиться к функцииfzero,встроенной в средуMATLAB, указывая имя функции, где вычисляется левая часть решаемого уравнения, начальные приближения всех трех корней и требуемую погрешность:
fzero(@f,1,0.001)
fzero(@f,4,0.001)
fzero(@f,7,0.001)
Результат вычислений получается в системной переменной ans(см. рис.9). Для увеличения количества выводимых знаков после запятой (по умолчанию выводится 4 знака) можно перед командами вызова функций ввести инструкциюformat long.
Встроенная функция fzeroобращается кm-файлу, где задана пользователем функция, и использует предложенный Т.Деккером алгоритм, основанный на комбинации методов бисекции, метода секущих и обратной квадратичной интерполяции.
Метод обратной квадратичной интерполяции обладает более высоким порядком сходимости, нежели метод секущих, и состоит в следующем. На каждой итерации он использует три предыдущих при-
Рис.9.
ближения к корню xk–2, xk–1 и xk. По ним строится единственная квадратичная парабола
,
проходящая через точки
.
С помощью уравнения этой параболы находится текущее приближение корня xk+1, как абсцисса точки пересечения параболы c осью 0x.
Функция fzeroопределяет точку, где функция меняет знак. Точки, где функция касается оси 0x, не считаются достоверными корнями. В случае функций без достоверных нулей, эта функция работает до тех пор, пока в качестве значения аргумента уравнения не встретятся бесконечность, неопределённость или комплексное значение. Вместо начального приближения при обращении к функцииfzeroможно через запятую указать границы интервала локализации искомого корня:fzero(@f,6,7,0.001).
Эта же задача может быть решена методом половинного деления. Программа, реализующая его алгоритм для уточнения первого корня, отрезок локализации которого принят от 0 до 1, может иметь следующий вид:
a=0; левая граница отрезка локализации корня
b=1; правая граница отрезка локализации корня
x=(a+b)/2 середина отрезка
while (x-a)>0.001 0.001 – погрешность поиска корня
if f(x)*f(a)<=0
b =x;
else
a =x;
end
x=(a+b)/2 деление отрезка пополам
end
Результат работы этой программы имеет вид:
x =
0.5000
x =
0.7500
x =
0.6250
x =
0.6875
x =
0.6563
x =
0.6406
..........
..........
x =
0.6270
x =
0.6279
Последовательная замена в программе значений для aиbна2.5и3.5и на6и7позволяет уточнить второй и третий корни рассматриваемого уравнения:
x =
2.9990
и
x =
6.3721
Если задаться целью решить рассматриваемое уравнение методом Ньютона–Рафсона, то последовательность действий будет иметь следующий вид. Имея в ранее созданном файле f.mописание левой части уравнения, следует сформировать файлf1.mс описанием её первой производной:
function y=f1(x)
y=3*x.^2 - 20*x + 25;
После этого программа, реализующая уточнение приближённого значения корня, равного 1, методом Ньютона–Рафсона, может быть представлена в виде
x=1; начальное приближение корня
while (abs(f(x)/f1(x))>0.001) 0.001 – погрешность поиска корня
x=x-f(x)/f1(x);
end
x1=x вывод результата в командное окно
Эту программу надо сохранить в файле с именем, например, root.m, и затем запустить его на выполнение. Результат его работы показан ниже:
x1 =
0.6277
Замена в файле root.mначального значение корня последовательно на 4 и 7 при запуске его на выполнение позволяет получить следующие сообщения:
x1 =
3.0000
и
x1 =
6.3723
Эти значения корней с точностью до 10–3совпадают со значениями, которые были получены при применении метода половинного деления и встроенной функцииfzero.
В случае применения к решению заданного уравнений метода секущих, как и при использовании метода половинного деления, Никаких предварительных преобразований не требуется. Действия этого метода можно сразу программировать. Один из возможных вариантов такой программы представлен ниже.
a=0;b=1; границы отрезка локализации
x=a; x1=b;
while (abs(x1-x)>0.001) начало итераций, 0.001 – погрешность поиска корня
k=(f(b)-f(a))/(b-a);
x1=x;
x=(k*a-f(a))/k; вычисление нового приближения корня
if ((f(x)*f(a))>0) выбор границ нового отрезока локализации корня
a=x;
else
b=x;
end
end
x1=x вывод результата в командное окно
Запуск этой программы на выполнение для первоначальных отрезков локализации [0, 1], [2.5, 3.5] и [6, 7] трёх корней исходного уравнения позволяет получить следующие их значения
x1 =
0.6280
x1 =
3.0000
x1 =
6.3722
Для решения этого же уравнения методом простых итераций сначала надо привести исходное уравнений
x3 – 10x2 + 25x – 12 = 0
к виду x=φ(x) так, чтобы функцияφна отрезках [,β] локализации каждого корня подчинялась бы условию сходимости метода
.
Для отрезка [0, 1] исходное уравнение можно преобразовать следующим образом:
.
В этом случае производная правой части будет
.
На отрезке [0, 1] она по модулю всегда меньше 1. Поэтому в качестве начального приближения корня можно взять любое число с этого отрезка, например х= 1.
Для других отрезков локализации корней исходное уравнение можно преобразовать к виду
.
В этом случае параметр релаксации подбирается из условия сходимости метода
или.
Для отрезка [2.5, 3.5] это условие даёт следующий диапазон параметра релаксации: 0<<0.24, а для отрезка [6, 7]: –0.063<<0. В связи с этим можно принять= 0.2 и= –0.05 соответственно.
Программа для применения метода простых итераций может иметь вид
x=1;
while abs((12-x^3+10*x^2)/25-x)>0.001
x=(12-x^3+10*x^2)/25;
end
x= x
x=3.5
while abs(0.2*(x^3-10*x^2+25*x-12))>0.001
x=x+0.2*(x^3-10*x^2+25*x-12);
end
x= x
x=7
while abs(0.05*(x^3-10*x^2+25*x-12))>0.001
x=x-0.05*(x^3-10*x^2+25*x-12);
end
x= x
Результатом выполнения этой программы будут следующие значения корней:
x =
0.6289
x =
2.9994
и
x =
6.3715