while 条件式 実行コード end
例: 卒業要件124単位と取るまでに、授業を履修して単位と取ること
total_unit = 0
while total_unit < 124
unit = randi(8);
total_unit = total_unit + unit;
end
ここで、randi(n) はnまでの正の整数(即ち、$1,2,\cdots, n$中から疑似乱数を返す。
上記の例では、総単位数が124になるまでに、単位を繰り返し取っています。
%以下のコードでは、授業の数を数えている。
total_unit = 0;
lecture_num=0;
while total_unit < 124
unit = randi(4);
total_unit = total_unit + unit;
lecture_num = lecture_num + 1;
end
printf("履修科目の数:%d, 履修総単位:%d \n", lecture_num, total_unit)
例えば、「履修科目の数は50以上なると卒業できる」という卒業要件がある場合、while文を途中で終了する可能性があります。(実際、このような卒業要件がないです。)
total_unit = 0;
lecture_num=0;
while total_unit < 124
unit = randi(4);
total_unit = total_unit + unit;
lecture_num = lecture_num + 1;
if lecture_num >=50
break
end
end
以下のコートを実行してみてください。
total_unit = 0;
lecture_num=0;
while total_unit < 124
unit = randi(4);
total_unit = total_unit + unit;
lecture_num = lecture_num + 1;
if lecture_num >=50
printf("おめでとう!履修科目の数は50以上になるので、卒業でできます。\n");
break
end
end
printf("履修科目の数:%d, 履修総単位:%d \n", lecture_num, total_unit)
「1からnまでの整数の2乗の和が50に超える」と満たす最小のnを求めよ。即ち、 $$ \sum_{i=1}^{n-1} i^2 < 50, ~~ \sum_{i=1}^n i^2 \ge 50 $$ を満たす$n$を計算する。
区間$(a,b)$上の関数$f$の根を計算するために、二分法が使用されます。
関数$f=x^3-2$を例にして、区間$(0,3)$の中で$f(x)=0$の解の計算方法を説明します。
まず、$y=f(x)$のグラフを書いておきます。
注意:
%plot -f svg
a=0;
b=3;
x=a:0.001:b;
y=x.^3 - 2;
hold on
grid on
plot(x,y*0,'b-') % x軸を描く
plot(x,y,'r-') % y=f(x)のグラフを描く
p=(a+b)/2
plot(p,p^3-2,'r+') % pにおける関数の値を描く
$$ f(a)\cdot f(p)<0 $$
%plot -f svg
a=0;
b=1.5;
x=a:0.001:b;
y=x.^3 - 2;
hold off
plot(x,y,'r-')
hold on
plot(x,y*0,'b-')
p=(a+b)/2;
plot(p,p^3-2,'ro')
上記の計算を繰り返してすると、解の存在範囲を小さくすることができます。$a$と$b$が十分近いであれば、$(a+b)/2$が$f(x)=0$の近似解となれます。
$|b-a|<0.02$まで、上記のコードを手で繰り返して計算してください。 ただし、毎回の計算では、aを更新するか、bを更新するか、手動でコードを調整するのは必要です。
終了条件:
計算アルゴリズム
詳細
[Step 6:] Set $i=i+1$.
[Step 7:] If $i\le N$ Then Output(p); Else Output("N回の計算で許容誤差の範囲で近似解を見つけなかった。");
a=0;
b=3;
N=20;
TOL=0.00001;
i=1; FA = a^3-2;
while (...)
end
if i<=N
...
else
...
end