- •Графики функций sin X и .
- •В чем заключается задача о численном решении уравнений
- •Задача о нахождении корня уравнения с заданной точностью.
- •Отделение корней
- •График функции
- •Графики, полученные при помощи plot (верхний) и fplot (нижний).
- •Различное число корней в зависимости от значения параметра .
- •Основные способы обращения к fzero
- •Способы задания уравнения для fzero
- •Графики функций
- •Решение уравнения, зависящего от параметров
- •Интерфейс fzero, получение информации о вычислениях, параметры вычислительного процесса
- •Выходные аргументы fzero
- •Входные аргументы fzero
- •Прерывание работы fzero, пример приложения с кнопкой Stop
График функции
Изучая поведение функции мы видим, что у нее есть три корня, первый около -3.5, а два других около 1.5. Однако нашей задачей было отделение корней, т.е. указание промежутков, на которых находится ровно один корень. Как видно из графика, для первого корня это промежуток [-4, -3]. Для того, чтобы отделить два других корня, удобно воспользоваться инструментом ZoomIn графического окна для увеличения масштаба просмотра вблизи точки x = 1.5 . После увеличения масштаба просмотра становится ясно, что промежутками, содержащими ровно один корень, являются отрезки [1, 1.4] и [1.8, 2.2]. Итак, все три корня отделены.
Следующая функция представляет более сложный пример для отделения корней
Ее график на отрезке [0, 3], построенный по равноотстоящим точкам с шагом 0.1, приведен ниже.
График
функции
,
построенный с шагом 0.1
Из графика видно, что один корень принадлежит отрезку [1.5, 2.5]. А вблизи точки x = 1 ситуация не очень понятная, более того, увеличение масштаба ничего не дает. Выход состоит в построении графика вблизи точки x = 1 с более мелким шагом, причем в достаточно малой окрестности единицы. Например, график f ( x ) , построенный на отрезке [0.999, 1.002] с шагом 0.0001, дает хорошее представление о расположении двух оставшихся корней.
График
функции
,
вблизи x =
1.
Становится понятным, что у данной функции есть два корня вблизи точки x = 1 . Один из них находится на отрезке [0.9995, 1.0005], а другой — на отрезке [1.0005, 1.0015]. Все три корня исследуемой функции отделены.
Заметим, что функция plot строит график табличной функции, заданной векторами x и y, которые мы получили по исходной непрерывной функции f ( x ) , соединяя точки отрезками. В зависимости от выбора точек для построения графика, он может оказаться слишком неточным или даже неверным. Приведем самый простой пример.
Предположим, требуется построить график функции
на отрезке [0.05, 1]. Сделаем это двумя способами. Первый из них состоит в вычислении функции с шагом 0.05 на данном отрезке и применении функции plot. Второй способ основан на использовании функции fplot. Для сравнения выведем результаты в одно графическое окно на разные оси, для чего применим функцию subplot
x = 0.05:0.05:1;
y = sin(1./x);
figure
subplot(2,1,1)
plot(x,y)
subplot(2,1,2)
fplot('sin(1/x)', [0.05 1])
Графики, полученные при помощи plot (верхний) и fplot (нижний).
Видим, что неудачный выбор шага для plot привел к плохому графику, который не учитывает особенности поведения функции. Нижний график, построенный при помощи fplot, намного лучше отражает поведение исследуемой функции, хотя fplot не требует задания шага. Дело в том, что алгоритм fplot является адаптивным, т.е. fplot выбирает точки для построения графика, приспосабливаясь к особенностям поведения функции. Выбираемые функцией fplot точки для построения графика не обязательно расположены равномерно. В областях быстрого изменения функции их плотность больше, чем в областях плавного ее изменения.
Рассмотрим еще один прием, полезный при отделении корней. Перед тем, как строить график исследуемой функции f ( x ) для отделения корней уравненияf ( x ) = 0 , иногда бывает полезно представить исходное уравнение f ( x ) = 0 в виде g ( x )=h ( x ) , где g ( x ) и h ( x ) — по возможности достаточно простые функции, поведение которых известно. Корни тогда находятся в абсциссах точек пересечения графиков этих функций.
Приведем сначала очевидный пример. Рассмотрим уравнение
Преобразуем его к эквивалентному виду
Ясно,
что у данного уравнения есть только
один корень — абсцисса точки пересечения
графиков гиперболы
и
экспоненциальной функции ex .
Отделить данный корень достаточно
просто, например при x =
0.1 левая часть уравнения
меньше
нуля, а при x =
1 — больше нуля, следовательно на отрезке
[0.1, 1] содержится ровно один корень.
Рассмотрим теперь уравнение
Совершив несложное преобразование (перенос единицы в правую часть и умножение обеих частей на x− Π ), приведем его к виду
На
отрезке [-15, 15] строим графики функций
.
Находим точку пересечения, получается,
что у исходного уравнения есть корень.
figure
fplot('sin(x)', [-15 15])
hold on
fplot('x-pi', [-15 15], 'r')
grid on
Графики
функций
.
Теперь
строим график исходной функции
на
отрезке [-15, 15]. Он не пересекает ось
абсцисс, следовательно корня нет.
figure
fplot('sin(x)/(x-pi)-1', [-15 15])
grid on
Графики
функции
.
Несложно понять, что в первом случае мы совершили неэквивалентное преобразование, которое привело к появлению корня x = Π у преобразованного уравнения. Поэтому при совершении перехода от уравнения вида f ( x )= 0 к уравнению вида g ( x )=h ( x ) требуется выполнять только эквивалентные преобразования для того, чтобы не изменить число корней.
Рассмотрим еще один пример — уравнение, зависящее от параметра:
Требуется
провести отделение корней уравнения в
зависимости от значений параметра a ,
изменяющихся от 0.2 до 1.3. Для этого удобно,
во-первых, привести уравнение к виду
.
Во-вторых, можно построить графики левой
и правой частей уравнения при изменении
значения параметра a от
0.2 до 1.3 с некоторым шагом, скажем 0.1. Для
этого удобно применить цикл for. В цикле
меняется значение параметра a и
строятся графики. В заголовке графика
написано текущее значение . Команда
pause означает, что надо нажать клавишу
для продолжения работы программы (эти
операторы удобно набрать в новом m-файле
и выполнить, например выделив и нажав
F9).
figure
x=-3:0.01:3;
for a = -0.2:0.1:1.3
y1 = exp(-a*x);
y2 = a*x.^2;
plot(x, y1, x, y2)
grid on
title(['a=' num2str(a)])
pause
end
Проследив поведение левой и правой частей уравнения в зависимости от значениq параметра , мы видим, что у данного уравнения может быть либо два корня, либо один корень, либо вообще ни одного корня.
