How to plot recursive definition in Matlab/Simulink?

8 visualizaciones (últimos 30 días)
Sammy
Sammy el 14 de Ag. de 2021
Comentada: Peter O el 20 de Ag. de 2021
where n is 1 to 10
A(n)=1.03*A(n-1)-700;
B(n)=(B(n-1)+50)*1.03;
(n-1) being the previous term of n
is it possible to plot those recursive definitions as two lines on the same graph in Matlab?
if so how?

Respuesta aceptada

Peter O
Peter O el 14 de Ag. de 2021
Sure. Use a while loop and call functions for each. However, for this problem, consider using a for loop. It will be much more efficient since you can use the values immediately previous.
You will need to define A(1) and B(1). I'll assume them to be 1 here.
nmx = 10;
% Assuming A(1) and B(1) are 1, because they weren't otherwise defined.
A = ones(nmx,1);
B = ones(nmx,1);
for ix=2:nmx
A(ix) = 1.03*A(ix-1)-700;
B(ix) = 1.03*(B(ix-1)+50);
end
% Call the recursive function for each value of n
Ar = ones(nmx,1);
Br = ones(nmx,1);
for ix=1:nmx
[Ar(ix)] = A_recurse(ix);
[Br(ix)] = B_recurse(ix);
end
figure(1)
plot(1:nmx,A,'p');
hold on
plot(1:nmx,B,'o');
plot(1:nmx,Ar,'s');
plot(1:nmx,Br,'x');
hold off
legend('A','B','Ar','Br');
function A = A_recurse(n)
if n == 1
A = 1;
else
A = 1.03*A_recurse(n-1)-700;
end
end
function B = B_recurse(n)
if n == 1
B = 1;
else
B = 1.03*(B_recurse(n-1)+50);
end
end
  2 comentarios
Sammy
Sammy el 20 de Ag. de 2021
Editada: Sammy el 20 de Ag. de 2021
Very nice!, what if the values of A and B were different intial values such as say 10000 for A and something like 2000 for B? Would you simply replace the 1 with those numbers or would it need to be different.
Peter O
Peter O el 20 de Ag. de 2021
That's correct!
A(1) = 10000;
B(1) = 2000;
Two other comments:
First, structuring using a for loop is generally a good idea when you don't know how many times you will recurse or are looping a large number of values. The number of nested function calls can grow dramatically and it's harder for computers to optimize. A point of note is the way I coded the recursion above was a way to capture the output at each value, so it's even worse.
For the above case on n=10:
n=10 waits on n=9 which waits on n=8... 10 calls
n=9 waits on n=8... 9 calls
...
55 calls
If you were only interested in the final value for getRecurse(10), then you'd have 10 evaluations using either the FOR loop or recursion. It's much easier to capture running values or build arrays using a loop than using recursion.
Second, a stylistic thing. In MATLAB it's good practice to preallocate your arrays when you know their size because it reduces the amount of work the computer has to do to keep it in memory as you fill it. I used a ones call to fill the above to skip allocating A(1)=1, which is not necessarily the best practice. If you're going to use a different value to start, consider evaluating to a more "blank" value with an explicit step to initialize. Common choices are setting to zero or nan to start.
A = zeros(nmx,1);
B = zeros(nmx,1);
A(1) = 10000;
B(1) = 2000;
The intention in above style would be more clear to someone reading your code than initializing all your values to the initial value.
A = 10000*ones(nmx,1);
B = 2000*ones(nmx,1);

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Productos


Versión

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by