ЗВІТ
про виконання лабораторної роботи № 1-2
“Чисельні методи розв’язання нелінійних рівнянь на ПК”
з дисципліни “Методи обчислень”
Мета роботи: ознайомитись з методикою і вивчити різні алгоритми розв’язування нелінійних рівнянь на ЕОМ.
Завдання: Методами поділу відрізка пополам, методом хорд, методом дотичних та методом ітерацій знайти всі корені нелінійного рівняння. Точність знаходження коренів вважати рівною 0,0000001.
Методом поділу відрізка пополам:
clear, clc
f = @(x) atan(2*x)-0.2*((x-1)^4)+sin(x); % функция
exp = 0.0000001; % точность
a = 2; % нижний предел
b = 4; % верхний предел
fplot(f,[a,b]), hold on % рисуем функцию
fa=f(a);
fb=f(b);
p=(a+b)/2;
n=1;
fp=f(p);
while abs(fp)>exp
if fa*fp<0
b=p;
else
a=p;
end;
p=(a+b)/2;
n=n+1;
fa=f(a);
fp=f(p);
end;
x0 = p; % корень
plot(x0, f(x0),'or')
grid on
title(['x_0=',num2str(x0)])
Методом хорд:
clear, clc
f = @(x) atan(2*x)-0.2*((x-1)^4)+sin(x);
a=2;
b=4;
e=0.0001;
while(abs(a-b)>e)
c=a-(f(a)*(b-a))/(f(b)-f(a));
if f(c)*f(b)>0
b=c;
else
a=c;
end;
end
disp(['Ответ x=' num2str(c,3)]);
x0 = с; % корень
plot(x0, f(x0),'or')
grid on
title(['x_0=',num2str(x0)])
Методом дотичних:
clear, clc;
e = 0.000001;
f = @(x) atan(2*x)-0.2*((x-1)^4)+sin(x);
df = @(x) (2/(4*(x^2)+1))-0.8*((x-1)^3)+cos(x);
a=0; b=1; N=0;
y1=f(a); y2=f(b);
z1=df(a); z2=df(b);
N=4;
ezplot(f,[a, b]), hold on
while 1
s=((z2*b - z1*a)-(y2-y1))/(z2-z1);
y=f(s); z=df(s);
N = N + 2;
if z==0 | b-a < 2*e
x=s;
break;
elseif z>0
b=s; y2=y; z2=z;
else
a=s; y1=y; z1=z;
end
end
if z~=0
x=(a+b)/2;
y=f(x);
end
fprintf('Метод касательных \n \n');
fprintf('x = %.5f \n', x);
fprintf('y = %.5f \n \n', y);
fprintf('Количество итераций: %i \n', N);
ezplot(f,[-0.5 1]),hold on
plot(x,y,'or'), grid on
grid on
Метод ітерацій:
clear, clc
f = inline('atan(2*x)-0.2*((x-1)^4)+sin(x)'); %ф.inline чтобы задать строку
x = -10:0.01:10;
y = f(x);
plot(x,y); grid
% Метод простых итераций
eps = 1e-4;
x0 = 1;
% значение производной в начальной точке:
L0 = 2e-6./(f(x0+1e-6)-f(x0-1e-6));
iter = 0;
x = x0;
razn = 100;
while abs(razn)>eps
xn = x - L0*f(x);
razn=xn-x;
x=xn;
iter=iter+1;
end
x
iter
hold on
plot(x,f(x),'or'), grid on
Обчислимо вираз: =L0
похідну обчислюємо приблизно, за допомогою невеликого прирісту:
де h = 10-6, отримаємо:
Комбінований:
clear, clc
syms x
f = x^3+6*x-5;
a=0.5;
b=1;
eps=0.000001;
i=0;
c=(a+b)/2;
f1=diff(f);
f2=diff(f1);
while(abs(b-a)>eps)
if((subs(f1,x,c)*subs(f2,x,c))>=0)
a=a-(b-a)*subs(f,x,a)/(subs(f,x,b)-subs(f,x,a));
b=b-subs(f,x,b)/subs(f1,x,b);
else
a=a-subs(f,x,a)/subs(f1,x,a);
b=b-(b-a)*subs(f,x,b)/(subs(f,x,b)-subs(f,x,a));
end
i=i+1;
end
fprintf('b=% f \n', double(b))
ezplot(f,[0.5 1]),hold on
plot(b,subs(f,x,b),'or')
grid on
Висновок: Я навчилась розв’язувати нелінійні рівняння на ПК різними чисельними методами: половинного ділення, хорд, дотичних(Ньютона), ітерацій (послідовних наближень), комбінаційний (хорд та дотичних).