I'm trying to create a recursive sqrt(2) ratio function in matlab / octave. I can create the recursive pattern in a spreadsheet see numbers and the corresponding formulas that create them below.
I'm having trouble getting the function to work correctly in matlab / octave. The a
and b
values should match the spreadsheet images above.
function f = rtsqrt2(a,b,n)
for rr=1:n
rr
if (rr==1)
ab_num(rr,:)=[a,b];
elseif (rr==2)
a=a+b+b;
b=1+b;
ab_num(rr,:)=[a,b];
elseif
a=a+b+b;
b=a+b;
ab_num(rr,:)=[a,b];
end
end
ab_num
end
The first two lines are correct but on the third line
I get 7,9
instead of what I should get 7,5
and things get worse from there. How can I fix it so that my recursive function follows the pattern in the first image.
Please note I'm using octave 4 which is similar to matlab and that I plan on using more than just 10 recursions (10 recursions were used just to test with)
Here's an implementation that fits your description. Note the computation (as you described) is iterative not recursive.
I've included some extra bits in the function to make and display the table.
function x = rtsqrt2(a, b, n)
%% Compute the square root of 2 iteratively
%
% n = number of iterations
% a, b are the initial values
%Initialise the vector A and B to hold the computation for each step
A = zeros(1, n);
A(1) = a;
B = zeros(1, n);
B(1) = b;
C = zeros(1, n);
% Compute the values of A and B iteratively
for k = 2 : n
A(k) = A(k-1) + 2 * B(k-1);
B(k) = A(k-1) + B(k-1);
end
% Compute the entire C vector (a/b) in a vectorised manner
C = A ./ B;
% Create a table to display the table like you'd see in excel
TBL = table(A', B', C');
TBL.Properties.VariableNames = {'A' 'B' 'C'};
disp(TBL)
% sqrt(2)
x = C(end);
Here's the function running:
>>> rtsqrt2(1, 1, 10)
A B C
____ ____ ______
1 1 1
3 2 1.5
7 5 1.4
17 12 1.4167
41 29 1.4138
99 70 1.4143
239 169 1.4142
577 408 1.4142
1393 985 1.4142
3363 2378 1.4142
ans =
1.4142