mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 22:23:11 +02:00
73 lines
2.6 KiB
Matlab
73 lines
2.6 KiB
Matlab
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, 1 + i], '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);
|
|
newZero = chooseNewZero(zPlus, zMinus, zero);
|
|
[zero, iterations] = updateZeros(newZero, iterations, polynomial);
|
|
end
|
|
|
|
function [derrivative0, derrivative1, derrivative2] = calculateDerrivatives(polynomial, zero)
|
|
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 newZero = chooseNewZero(zPlus, zMinus, zero)
|
|
if abs(zPlus) < abs(zMinus)
|
|
newZero = zero - zPlus;
|
|
else
|
|
newZero = zero - zMinus;
|
|
end
|
|
end
|
|
|
|
function [zero, iterations] = updateZeros(newZero, iterations, polynomial)
|
|
zero = newZero;
|
|
iterations(:, size(iterations, 2) + 1) = [zero, polynomial(zero)];
|
|
end
|
|
|
|
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
|