контрольные работы 7 вариант / 4 / 07 вар_4 ЛР
.docxТитул
Задание
1. Решить уравнение методами половинного деления, итераций, секущих и касательных с точностью 0,001.
2. Вывести на печать приближенное значение корня, количество итераций, значение невязки.
3. Провести сравнительную характеристику методов.
4. Решить уравнение в среде MATLAB с помощью встроенных функций. промежуток изоляции корня [1.0;1.1]
Решение
1. Метод половинного деления
Создаём файл fun.m, содержащий описание функции .
function z=fun(x)
z=(x.^2)./((1+x).^(1/4))-1.0;
Создаём файл div_two.m (листинг 4.2), содержащий описание функции, возвращающей значение корня уравнения методом половинного деления.
function div_two(f,xn,xk,eps);
% f - Имя m-файла, содержащего описание функции
% xn - Левая граница отрезка, на котором производится поиск решения
% xk - Правая граница отрезка, на котором производится поиск решения
% eps - Точность решения
L=xk-xn;
k=0;
% k - количество итераций
while L>eps
c=(xk+xn)/2;
k=k+1;
if feval(f,c)*feval(f,xn)<0
% feval(f,c) - оператор вычисления в точке х=с значения
% функции, описание которой находится в соответствуюшем файле.
% Имя файла хранится в строковой переменной f
xk=c;
else
xn=c;
end;
L=xk-xn;
end;
x=c
k
fx=feval(f,c)
% fx - значение невязки
Вычисляем значение корня уравнения
>> div_two('fun',1.0,1.1,0.001)
x =
1.0977
k =
7
fx =
0.0011
Решение х=1.0977 получено с точностью 0,001 за семь итераций. При этом значение невязки fx = 0,0011.
Метод итераций
Создаём файл f1.m, содержащий описание функции .
function z=f1(x,m,f)
z=x-m*feval(f,x);
Создаём файл f2.m, содержащий описание функции .
function z=f2(x,m,f)
dx=10^-7;
x1=x+dx;
tmp1=x-m*feval(f,x);
tmp2=x1-m*feval(f,x1);
z=abs((tmp2-tmp1)/dx);
Построим графики функций f1, f2.
>> x=1.0:0.001:1.1;
>> m=0.1;
>> plot(x,f1(x,m,'fun'));
>> hold on
>> plot(x,f2(x,m,'fun'),'--');
>> grid on
Из рисунка видно, что в промежутке [1.0;1.1] функция удовлетворяет условиям.
Создаём файл iter.m, содержащий описание функции, возвращающей значение корня уравнения методом итераций.
function iter(f,x0,eps,m)
x1=f1(x0,m,f);
k=1;
while abs(x1-x0)>eps
x0=x1;
x1=f1(x0,m,f);
k=k+1;
end;
x=x1
k
fx=feval(f,x1)
Вычисляем значение корня уравнения:
>> iter('fun',1.0,0.001,0.1)
x =
1.0928
k =
17
fx =
-0.0072
Решение х=1.0928 получено с точностью 0,001 за 17 итераций. При этом значение невязки fx = 0,0072.
Метод секущих
Создаём файл funp1.m, содержащий описание первой производной функции.
function z=funp1(x0,f)
dx=10^-7;
x=x0+dx;
tmp1=feval(f,x0);
tmp2=feval(f,x);
z=abs((tmp2-tmp1)/dx);
Создаём файл funp2.m, содержащий описание второй производной функции.
function z=funp2(x0,f)
dx=10^-7;
x=x0+dx;
tmp1=funp1(x0,f);
tmp2=funp1(x,f);
z=abs((tmp2-tmp1)/dx);
Создаём файл sek.m, содержащий описание функции, возвращающей значение корня уравнения методом секущих.
function sek(f,f2,a,b,eps)
if feval(f,a)*feval(f2,a,f)>0
xf=a;
x0=b;
else
xf=b;
x0=a;
end;
x1=x0-feval(f,x0)*(x0-xf)/(feval(f,x0)-feval(f,xf));
k=1;
while abs(x1-x0)>eps
x0=x1;
x1=x0-feval(f,x0)*(x0-xf)/(feval(f,x0)-feval(f,xf));
k=k+1;
end;
x=x1
k
fx=feval(f,x1)
Вычислим значение корня уравнения:
>> sek('fun','funp2',1.0,1.1,0.001)
x =
1.0970
k =
2
fx =
-2.2799e-007
Решение х=1,0970 получено с точностью 0,001 за 2 итерации. При этом значение невязки fx = -2.2799e-007.
Метод касательных
Создаём файл kas.m, содержащий описание функции, возвращающей значение корня уравнения методом касательных.
function kas(f,f1,f2,a,b,eps)
if feval(f,a)*feval(f2,a,f)>0
x0=a;
else
x0=b;
end;
x1=x0-feval(f,x0)/feval(f1,x0,f);
k=1;
while abs(x1-x0)>eps
x0=x1;
x1=x0-feval(f,x0)/feval(f1,x0,f);
k=k+1;
end;
x=x1
k
fx=feval(f,x1)
Вычисляем значение корня уравнения
>> kas('fun','funp1','funp2',1.0,1.1,0.001)
x =
1.0970
k =
2
fx =
8.0103e-012
Решение х=1.0970 получено с точностью 0,001 за 2 итерации. При этом значение невязки fx = 8,0103e-012.
2. Сведем полученные данные в таблицу
|
Метод |
|||
Показатель |
Половинного деления |
Итераций |
Секущих |
Касательных |
Корень |
1.0977 |
1.0928 |
1.0970 |
1.0970 |
Кол-во итераций |
7 |
17 |
2 |
2 |
Значение невязки |
0,0011 |
0,0072 |
-2.2799e-007 |
8.0103е-012 |
3. Наилучшими показателями (количество итераций и значения невязки) обладают два метода – секущих и касательных. Самые плохие показатели получены при использовании метода итераций.
4. Решение с помощью встроенной функции solve:
>> solve('x^2/((1+x)^(1/4))-1=0')
ans =
1.0969815577985598179082789671675
-0.81165232002780264839341885890346
Решение с помощью встроенной функции fzero:
>> [x,f,e_flag,inform]=fzero('x/((1+x^4)^(1/4))+0.5',[-0.6, -0.5])
x =
1.0970
f =
-2.2204e-016
e_flag =
1
inform =
intervaliterations: 0
iterations: 5
funcCount: 7
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [1, 1.1]'