ЧМ ЛР2
.docxЛР2. Методы дихотомии, Ньютона, простых итераций
x = -10:0.1:10;
y = x.^3-3*x.^2-9*x-5;
hold on
grid on
plot(x,y)
>> p = [1, -3, -9, -5];
>> roots(p)
ans =
4.99999999999999
-0.999999999999999 + 2.23479059845967e-008i
-0.999999999999999 - 2.23479059845967e-008i
>> format short
>> roots(p)
ans =
5.0000
-1.0000 + 0.0000i
-1.0000 - 0.0000i
function f = fun(x)
f = x^3 - 3*x^2 - 9*x - 5;
end
a = -10;
b = 10;
n = 1;
eps = 0.01;
k = 0;
while (abs(b - a) > eps)
fa = fun(a);
fb = fun(b);
if (fa*fb < 0)
c = b - (b - a)/2;
fc = fun(c);
if (fc == 0)
disp(c)
disp(n)
k = 1;
break
end
if (fa*fc < 0)
b = c;
else
a = c;
end
else
if (fa == 0)
disp(a)
disp(n)
k = 1;
break
else
if (fb == 0)
disp(b)
disp(n)
k = 1;
break
else
disp('Roots do not exist')
disp(n)
k = 1;
break
end
end
end
n = n+1;
end
if (k == 0)
disp(c)
disp(n-1);
end
>> Dihotomia
5
2
function df = dfun(x0)
syms x;
df0 = diff(x^3 - 3*x^2 - 9*x - 5);
df = subs(df0, x0);
end
x0 = 4;
n = 1;
x = x0 - fun(x0)/dfun(x0);
while abs(x - x0) > 0.0001
x0 = x;
x = x0 - fun(x0)/dfun(x0);
n = n + 1;
end
disp(x)
disp(n)
>> Newton
586645646446/117329129289
5
>> 586645646446/117329129289
ans = 5.000000000008523
x0 = 0.5;
n = 1;
x = x0 - 2*(fun(x0)/dfun(x0));
while abs(x - x0) > 0.0001
x0 = x;
x = x0 - 2*(fun(x0)/dfun(x0));
n = n + 1;
end
disp(x)
disp(n)
>> Newton
-2195674191073/2195674191070
4
>> -2195674191073/2195674191070
ans = -1.000000000001366
function x = kor(a)
x0 = a;
x = 0.5*(a/x0 + x0);
n = 1;
while abs(x - x0) > 0.00000000000001
x0 = x;
x = 0.5*(a/x0 + x0);
n = n + 1;
end
x
n
end
>> kor(2)
x = 1.414213562373095
n = 6
>> sqrt(2)
ans = 1.414213562373095
>> fzero('x^3-3*x^2-9*x-5',[4,6])
ans = 5
>> fzero('x^3-3*x^2-9*x-5',[-2,6])
ans = -1
function f = fun(x)
f = sin(x) - x/2;
end
a = -2;
b = -1;
>> Dihotomia
-1.895493507385254
20
a = -1;
b = 1;
>> Dihotomia
0
1
a = 1;
b = 2;
>> Dihotomia
1.895493507385254
20
>> Newton
-1.8954942672087131979612086400169
3
>> Newton
0.0
1
>> Newton
1.8954942672087131979612086400169
3
>> fzero('sin(x)-x/2',-2)
ans = -1.895494267033981
>> fzero('sin(x)-x/2',0)
ans = 0
>> fzero('sin(x)-x/2',2)
ans = 1.895494267033981