Дано уравнение в виде f(x)=0, где f(x) некоторая функция переменной x. Число x* называется корнем или решением данного уравнения, если при подстановке x= x* в уравнение последнее обращается в тождество f(x*)=0. Число x* называют также нулем функции y=f(x).
В общем случае уравнение может иметь одно или несколько корней, как действительных, так и комплексных. Нахождение действительных корней с заданной точностью можно разбить на два этапа. Сначала корни отделяются, т.е. определяются отрезки, которые содержат по оному корню уравнения; а затем уточняются, т.е. вычисляются с требуемой точностью ε. Отделение корней уравнения f(x)=0, в области определения, непрерывной функции f(x), можно осуществлять несколькими способами:
Табулирование – составление таблицы из равноотстоящих значений независимой переменной x и соответствующих значений функции и определение отрезков в которых смежные значения функции имеют различные знаки и следовательно содержат нулевые значения функции.
Графический - строим график функции f(x) и определяем минимальные отрезки, включающие точки пересечения графика функции с осью x.
|
|
Уточнение корня на отрезке [a,b], в котором локализован только один корень, осуществляется итерационными методами, в которых последовательно, шаг за шагом, производится уточнение начального приближения корня. Итерацией называется совокупность вычислительных операций, приводящих к новому приближенному значению корня. Если каждое последующее значение x(k) (k=1,2,3,…) находится все ближе к точному значению, говорят, что метод сходится. В противном случае метод расходится. Для реализации итерационного процесса должны быть заданы начальное приближение x(0) и точность ε, с которой найти решение уравнения. Условие окончание имеет вид: |x(k)-x(k-1)| ≤·ε.Все методы можно разделить на две группы: с условной и безусловной сходимостью.
Методы с безусловной сходимостью. Метод половинного деления. В этом методе на каждой итерации новое приближение определяется как: x(k)=(a(k-1)+b(k-1))/2, где к – номер итерации.
Алгоритм
1) Задаем функцию f(x), отрезок [a(0),b(0)], точность ε и k=1.
2) Вычисляем приближение x(k)=(a(k-1)+b(k-1))/2
3) Определяем новый отрезок [a(k),b(k)]. Проверяем, если
f(a(k-1))*f(x(k))>0, то a(k)=x(k) и b(k)=b(k-1), иначе a(k)=a(k-1) и b(k)=x(k).
4) Проверяем условие окончания, если |b(k)-a(k)| ≤·2ε, то за ответ принимаем значение равное x=(a(k)+b(k))/2 и переходим на пункт 5, иначе k=k+1 и переходим на пункт 2.
5) Выводим x и f(x).
Блок-схема метода половинного деления.
|
Программа. Деление пополам.
|
|
function DATA
global a b eps n_plot_dots;
a=1;
b=3;
eps=0.01;
n_plot_dots=100;
end
function [ fx ] = f(x)
fx=x.^2-5;
end
function [ x,fx ] = fun_DelenPopolam(a,b,eps)
for i=1:100
c=(a+b)/2;
fa=f(a);
fb=f(b);
fc=f(c);
if fa*fc<0
b=c;
else
if fc*fb<0
a=c;
else
i
break;
end %if
end %if
if abs(a-b)<eps
i
break;
end %if
end %for i
x=c;
fx=f(c);
end % function
function GLAV_DelenPopolam
global a b eps x fx n_plot_dots;
DATA;
[ x,fx ] = fun_DelenPopolam(a,b,eps);
REPORT;
end
function REPORT
global a b eps x fx n_plot_dots;
disp('Delenie Popolam');
disp(' ');
disp(['a = ' num2str(a,'%10.5f') ]);
disp(['b = ' num2str(b,'%10.5f') ]);
disp(['eps = ' num2str(eps,'%10.5f') ]);
disp('Results');
disp(['x = ' num2str(x,'%10.5f') ]);
disp(['fx = ' num2str(fx,'%10.5f') ]);
h=(b-a)/(n_plot_dots-1);
for i=1:n_plot_dots
if i==1
xmas(i)=a;
else
xmas(i)=xmas(i-1)+h;
end %if
fmas(i)=f(xmas(i));
end
disp(' i x fx ');
disp(' ______________________________')
i=0;
for i=1:length(xmas)
xx=xmas(i);
ffx=fmas(i);
disp(sprintf('%10.3f\t%10.3f\t %10.3f',i,xx,ffx));
end %for
plot(xmas,fmas,'r.');
grid on;
xlabel('x');
ylabel('y');
title('Delenie Popolam');
end
Методы с условной сходимостью. В этих методах исходное уравнение f(x)=0 преобразуется к эквивалентному виду x=j(x). Тогда на каждой итерации новое приближение будем определять как: x(1) = j (x(0)), x(2) = j (x(1)), x(3) = j (x(2)),….., т.е. x(k)=j(x(k-1)), k=1,2,3…. За x(0) принимают любое число на заданном отрезке [a;b]. Вид функции j(x) определим исходя из достаточного условия сходимости, которое записывается как: |j’(x)| < 1, для всех значений x отрезка[a;b], т.е. максимальная производная на заданном отрезке должна быть меньше единицы.
Метод простых итераций. Для уравнения x2-5=0 можно положить j(x)=5/x или j(x)=(1/2)(x+5/x) и соответствующие итерационные формулы будут иметь вид x(k)=5/x(k-1) и x(k)=(1/2)(x(k-1)+5/x(k-1)). В первом случае метод расходится. А во втором сходится.Общий подход для получения итерационной формулы x=j(x). Помножим обе части уравнения f(x)=0 на множитель, и прибавим к обеим частям по x, тогда итерационная формула будет иметь вид: x = x + bf(x) = j(x)
Определить множитель b можно из достаточного условия сходимости. |j’(x)| < 1 и в то же время j’(x) = 1 + bf’(x) тогда
|1 + bf’(x)| < 1 или -1 < 1 + bf’(x) < 1 тогда -2 < bf’(x) < 0.
Мы должны выбрать максимальную по модулю производную |f’(x)| на заданном отрезке. |f’(b)|>|f’(a)| b = -2/f’(b), иначе b = -2/ f’(a).