フィルターのクリア

Trying to use a for loop to calculate years with an IF statement but it seems to ignore it.

1 回表示 (過去 30 日間)
Chett Manly
Chett Manly 2021 年 9 月 13 日
コメント済み: Chett Manly 2021 年 9 月 14 日
So the program is meant to stop if balance >= 500000 but it seems to soldier on until it runs out of months. Use of a for loop is required.
clear; close all; clc
balance(1) = 1000;
contribution = 1200;
M = 1; % month ticker
years = 12/M;
interest = 0.0025;
for M = 1:300
if balance(M) >= 50000 %balance(M)
end
M = M + 1; % you need to increment months + 1 every cycle
balance(M) = balance(M-1) + interest*balance(M-1) + contribution;
end
%Balance %This will display the final Balancefprintf('%g Months until $500000 reached\n', M);
fprintf('%g Years until $500000 reached\n', years);
12 Years until $500000 reached
format bank
plot(balance);
grid on
ytickformat('usd')
title('Saving 3% compound')
xlabel('Months')
ylabel('Saving balance')

回答 (1 件)

Jan
Jan 2021 年 9 月 13 日
編集済み: Jan 2021 年 9 月 13 日
Either
for M = 2:300
if balance(M) >= 50000 %balance(M)
break; % Leave the for M loop
end
% NOPE ! M = M + 1; % you need to increment months + 1 every cycle
balance(M) = balance(M-1) + interest*balance(M-1) + contribution;
end
or
for M = 2:300
if balance(M) < 50000 %balance(M)
% NOPE ! M = M + 1; % you need to increment months + 1 every cycle
balance(M) = balance(M-1) + interest*balance(M-1) + contribution;
end
end
If you do not know in advanve how log a loop runs, a while loop is nicer:
M = 2;
while M <= 300 && balance(M) < 50000
balance(M) = balance(M-1) + interest*balance(M-1) + contribution;
M = M + 1;
end
While the counter M must be increased in the while loop, this is done in the for loop automatically.
[EDITED] M starts at 2 now.
  4 件のコメント
Jan
Jan 2021 年 9 月 13 日
This looks strange:
M = 1; % month ticker
years = 12/M; % Are you sure that 12/1 is the number of years?!
% The usual definition is Months / 12
for M = 1:300
if balance(M) >= 500000 %balance(M)
break; % Leave the for M loop
end
% No! Do not increase the loop counter inside the
% body of a FOR loop:
% M = M + 1;
My code failed, because accessing balance(M - 1) requires the loop to start at M=2. I've edited my answer.
Label = max(balance) is not useful before the loop, because balance contains 1 value only.
Chett Manly
Chett Manly 2021 年 9 月 14 日
You were right about the year ticker, it needs to be lower in the code to work correctly.
If you disable the M line in the loop, and change the for if argument to not have the M ticker the program.
This version runs but if I change the M value to 2 and the for arguement to 2:300 then it won't run.
clear; close all; clc
balance(1) = 1000;
contribution = 1200;
M = 1; % month ticker
interest = 0.0025;
for M = 1:300
if balance(M) >= 500000 %balance(M)
break; % Leave the for M loop
end
M = M + 1; % you need to increment months + 1 every cycle
balance(M) = balance(M-1) + interest*balance(M-1) + contribution;
Label = max(balance) %this labels the plot with max balance
end
%Balance %This will display the final Balancefprintf('%g Months until $500000 reached\n', M);
years = M/12;
fprintf('%g Years until $500000 reached\n', years);
format bank
plot(balance);
grid on
ytickformat('usd')
title('Saving 3% compound')
xlabel('Months')
ylabel('Saving balance')
%This creates the Label on the plot
txt = {'Max Balance:',Label,'\leftarrow'};
text(M,Label,txt,'HorizontalAlignment','right')

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLabels and Annotations についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by