How to plot recursive definition in Matlab/Simulink?

조회 수: 10 (최근 30일)
Sammy
Sammy 2021년 8월 14일
댓글: Peter O 2021년 8월 20일
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?

채택된 답변

Peter O
Peter O 2021년 8월 14일
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
Sammy
Sammy 2021년 8월 20일
편집: Sammy 2021년 8월 20일
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 2021년 8월 20일
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);

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by