Метод половинного деления

Пусть уравнение (2.1) имеет на отрезке [a,b] единственный корень, причем функция F(x) на данном отрезке непрерывна (рис. 2.1).

Разделим отрезок [a,b] пополам точкой с=(a+b)/2. Если F(c)¹0, то возможны два случая:

1) функция F(x) меняет знак на отрезке [a,c];

2) функция F(x) меняет знак на отрезке [c,b].

Выбирая в каждом случае тот отрезок, на котором функция меняет знак, и продолжая процесс половинного деления дальше, можно дойти до сколь угодно малого отрезка, содержащего корень уравнения.

Рис. 2.1

 

 

Пример 2.1. Решение в пакете MATLAB методом половинного деления уравнения

1. Создание файла Func.m, содержащего описание функции

 

% листинг файла Func.m

function z=Func(x)

z=x.^4-11*x.^3+x.^2+x+0.1;

 

2. Создание файла Div2.m, содержащего описание функции, возвращающей значение корня уравнения методом половинного деления

 

% листинг файла Div2.m

function z=Div2(f,x1,x2,eps);

% имя m-файла, содержащего описание функции

% x1 - левая граница отрезка, на котором ищется решение

% уравнения

% x2 - правая граница отрезка, на котором ищется решение

% уравнения

% eps - точность решения

L=x2-x1;

while L>eps

c=(x2+x1)/2;

if feval(f,c)*feval(f,x1)<0

% feval(f,c) - оператор вычисления в точке x=c значения функции,

% описание, которой находится в соответствующем файле.

% Имя файла хранится в строковой переменной f

x2=c;

Else

x1=c;

End;

L=x2-x1;

End;

z=c;

 

3. Построение графика функции на интервале [-1,1]

>> x1=-1;

>> x2=1;

>> dx=10^-3;

>> x=x1:dx:x2;

>> plot(x,Func(x)); grid on

Рис. 2.2

4. Вычисление значения корня уравнения

 

>> Div2('Func',x1,x2,10^-5)

ans =

0.3942

 

5. Проверка полученного значения корня

 

>> Func(ans)

ans =

E-006

 

Для рассмотрения процесса нахождения корня уравнения в динамике, необходимо сохранить значение корня на каждом шаге вычислительной процедуры и построить зависимость значения корня от номера шага. Ниже приведен листинг файла Div2I.m, содержащего описание функции, возвращающей значение корня и длины отрезка, на котором данный корень находится, на каждом шаге метода половинного деления.

 

% листинг файла Div2I.m

function [z1,z2]=Div2(f,x1,x2,eps);

k=1;

L(1)=x2-x1;% начальная длина отрезка

c(1)=(x2+x1)/2;% начальное значение корня

while L(k)>eps

if feval(f,c(k))*feval(f,x1)<0

x2=c(k);

Else

x1=c(k);

End;

k=k+1;

c(k)=(x2+x1)/2;

L(k)=x2-x1;

End;

z1=c;

z2=L;

 

6. Вычисление значений корня и длины отрезка, на котором ищется решение, на каждом шаге итерационного процесса

>> [c L]=Div2I('Func',x1,x2,10^-5);

Рис. 2.3. Зависимость значения корня от номера шага вычислительной процедуры

5. Визуализации зависимости значения корня от номера итерационного процесса (рис. 2.3)

 

>> plot(c, '-o')

6. Визуализация зависимости длины отрезка, на котором ищется значение корня, от номера итерации (рис. 2.4)

 

>> plot(L, '-o')

Рис. 2.4. Зависимость длины отрезка, на котором ищется значение корня, от номера шага вычислительной процедуры

 








Дата добавления: 2015-08-21; просмотров: 3821;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.