WUT_Computer_Science/ENUME/projectB/Code/task3.asv
2021-12-03 04:11:21 +01:00

73 lines
2.5 KiB
Plaintext

interval = [-5, 10];
rootBrackets = rootBracketing(@polynomial, interval(1), interval(2));
printGraph(@polynomial, 'Laguerre', @laguerre, interval, rootBrackets, 'Approximate zeros of function for method of ');
printComplexGraph(@polynomial, 'Laguerre', @laguerre, [-1 + i, 0], 'Aproximate complex roots of polynomial');
function y = polynomial(x)
y = -2 * x^4 + 12 * x^3 + 4* x^2 + 1 * x + 3;
end
function [zero, iterations] = laguerre(polynomial, a, b, tolerance)
[degree, zero, iterations] = initialize(a, b, polynomial);
[zero, iterations] = laguerreLoop(polynomial, zero, tolerance, iterations, degree);
end
function [degree, zero, iterations] = initialize(a, b, polynomial)
degree = 4;
zero = (a + b) / 2;
iterations = [zero; polynomial(zero)];
end
function [zero, iterations] = laguerreLoop(polynomial, zero, tolerance, iterations, degree)
while abs(polynomial(zero)) > tolerance
[iterations, zero] = insideLoop(polynomial, zero, degree, iterations);
end
end
function [iterations, zero] = insideLoop(polynomial, zero, degree, iterations)
[derrivative0, derrivative1, derrivative2] = calculateDerrivatives(polynomial, zero);
[zPlus, zMinus] = calculateZ(degree, derrivative0, derrivative1, derrivative2);
% update answer
zero = newzero;
iterations(:, size(iterations, 2) + 1) = [zero, polynomial(zero)];
end
function [derrivative0, derrivative1, derrivative2] = calculateDerrivatives(polynomial, zero)
% calculate derivatives
derrivative0 = polynomial(zero);
derrivative1 = derivative(polynomial, zero, 1);
derrivative2 = derivative(polynomial, zero, 2);
end
function [zPlus, zMinus] = calculateZ(degree, derrivative0, derrivative1, derrivative2)
expressionUnderSquareRoot = (degree - 1) * ((degree - 1) * derrivative1 ^ 2 - degree * derrivative0 * derrivative2);
lagsqrt = sqrt(expressionUnderSquareRoot);
zPlus = degree * derrivative0 / (derrivative1 + lagsqrt);
zMinus = degree * derrivative0 / (derrivative1 - lagsqrt);
end
function [] = chooseNewZero()
% choose value closer to current approximation
if abs(zPlus) < abs(zMinus)
newzero = zero - zPlus;
else
newzero = zero - zMinus;
end
% calculate the nth derivative of polynomial at x
function y = derivative(function_, x, degree)
if degree == 0
y = function_(x);
return
end
step = sqrt(eps);
y = (derivative(function_, x + step, degree - 1) - derivative(function_, x - step, degree - 1)) / (2 * step);
end