while True:

問題9

𝑥(1 + 𝑥) = 𝑎 を満足する 𝑥 の値(0 < 𝑥 < 1の範囲内のもの)を小数以下 4 桁まで求めたい. ただし,𝑎 は 2 より小さい正の実数で,データとして読み込むものとする.次のような考え 方によるプログラムを作れ.ただし、別途に 2 次方程式の解の公式により答えを計算しその 結果と比較するプログラムとせよ. [ヒント]左辺の関数は,𝑥 が 0 から 1 まで増加するのにともない,0 から 2 まで単調に増 加する関数である.よって,上の方程式を満足する 𝑥 の値が 0 と 1 の間に存在することは明 らかである.最初 𝑥min = 0, 𝑥max = 1 ととる.𝑥min は解 𝑥 の下限,すなわち求めるべき答え はこれより上にあることを意味する.同様に 𝑥max は 𝑥 の上限を意味する.𝑥test = (𝑥min + 𝑥max)⁄2を計算しこれを左辺の 𝑥 に代入する.このとき左辺の値が 𝑎 以上(未満)で あれば,𝑥test を 𝑥max(𝑥min) に代入する.この手続きを繰り返すと 𝑥min と 𝑥max の差はだん だんゼロに近づいてゆく.この差が十分小さく(たとえばこの場合は 0.00001 より小さく)なっ たところで繰り返しを打ち切ればよい.

難易度 ★★☆☆☆

標準的な問題です。文章が長く初めの理解に時間がかかるかもしれませんが、アルゴリズム自体は非常に簡潔です。 DOで半永久的に回しながら、xminとxmaxの差が0.0001を下回った時に抜ける(exit)すればいいです。
program question9
	implicit none
	real :: a, x, xmin, xmax, xtest, val

	print *, "input a:"
	read *, a

	xmin = 0
	xmax = 1
	do
		if (xmax - xmin < 0.00001) then
			exit
		end if
		xtest = (xmax + xmin) / 2
		val = xtest * (1 + xtest)
		if (val >= a) then
			xmax = xtest
		else
			xmin = xtest
		end if
	end do

	print *, xmin

	! 二次方程式解
	print *, (-1 + (1 + 4 * a) ** 0.5) / 2

end program question9
ページのトップへ戻る