mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 20:03:04 +02:00
74 lines
2.9 KiB
Matlab
74 lines
2.9 KiB
Matlab
interval = [-5, 10];
|
|
rootBrackets = rootBracketing(@taskFunction, interval(1), interval(2));
|
|
|
|
printGraph(@taskFunction, 'False Position', @falsePosition, interval, rootBrackets, 'Approximate zeros of function for method of ');
|
|
|
|
function y = taskFunction(x)
|
|
y = -2.1 + 0.3*x - x*exp(1)^(-x);
|
|
end
|
|
|
|
function [zero, iterations] = falsePosition(taskFunction, a, b, tolerance)
|
|
|
|
[iterations, lastTwoA, lastTwoB, i] = initialize();
|
|
[zero, iterations, a, b, lastTwoA, lastTwoB] = firstTwoIterations(a, b, taskFunction, iterations, lastTwoA, lastTwoB);
|
|
[zero, iterations] = falsePositionLoop(taskFunction, zero, tolerance, lastTwoA, lastTwoB, i, a, b, iterations);
|
|
end
|
|
|
|
function [iterations, lastTwoA, lastTwoB, i] = initialize()
|
|
iterations = double.empty(2, 0);
|
|
lastTwoA = double.empty(2, 0);
|
|
lastTwoB = double.empty(2, 0);
|
|
i = 0;
|
|
end
|
|
|
|
function [zero, iterations, a, b, lastTwoA, lastTwoB] = firstTwoIterations(a, b, taskFunction, iterations, lastTwoA, lastTwoB)
|
|
for j = 1 : 2
|
|
zero = (a*taskFunction(b) - b * taskFunction(a)) / (taskFunction(b) - taskFunction(a));
|
|
iterations(:, size(iterations, 2) + 1) = [zero, taskFunction(zero)];
|
|
if sign(taskFunction(a)) ~= sign(taskFunction(zero))
|
|
b = zero;
|
|
else
|
|
a = zero;
|
|
end
|
|
lastTwoA(j) = a;
|
|
lastTwoB(j) = b;
|
|
end
|
|
end
|
|
|
|
function [zero, iterations] = falsePositionLoop(taskFunction, zero, tolerance, lastTwoA, lastTwoB, i, a, b, iterations)
|
|
while abs(taskFunction(zero)) > tolerance
|
|
[lastTwoA, i, a, lastTwoB, b, tolerance, zero, iterations] = insideLoop(lastTwoA, i, a, lastTwoB, b, tolerance, taskFunction, iterations);
|
|
end
|
|
end
|
|
|
|
function [lastTwoA, i, a, lastTwoB, b, tolerance, zero, iterations] = insideLoop(lastTwoA, i, a, lastTwoB, b, tolerance, taskFunction, iterations)
|
|
[lastTwoA, lastTwoB] = changeLastTwoAB(lastTwoA, lastTwoB, i, a, b);
|
|
zero = calculateZero(lastTwoB, tolerance, a, b, lastTwoA, taskFunction);
|
|
iterations(:, size(iterations, 2) + 1) = [zero, taskFunction(zero)];
|
|
[a, b] = newSubInterval(taskFunction, a, b, zero);
|
|
end
|
|
|
|
function [lastTwoA, lastTwoB] = changeLastTwoAB(lastTwoA, lastTwoB, i, a, b)
|
|
lastTwoA(mod(i, 2) + 1) = a;
|
|
lastTwoB(mod(i, 2) + 1) = b;
|
|
end
|
|
|
|
function [zero] = calculateZero(lastTwoB, tolerance, a, b, lastTwoA, taskFunction)
|
|
if(abs(lastTwoB(1) - lastTwoB(2)) < tolerance)
|
|
zero = (a*(taskFunction(b) / 2) - b * taskFunction(a)) / (taskFunction(b) / 2 - taskFunction(a));
|
|
elseif (abs(lastTwoA(1) - lastTwoA(2)) < tolerance)
|
|
zero = (a*taskFunction(b) - b * (taskFunction(a) / 2)) / (taskFunction(b) - (taskFunction(a) / 2));
|
|
else
|
|
zero = (a*taskFunction(b) - b * taskFunction(a)) / (taskFunction(b) - taskFunction(a));
|
|
end
|
|
end
|
|
|
|
function [a, b] = newSubInterval(taskFunction, a, b, zero)
|
|
if sign(taskFunction(a)) ~= sign(taskFunction(zero))
|
|
b = zero;
|
|
else
|
|
a = zero;
|
|
end
|
|
end
|
|
|