−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
応用数学I・II 1995.6.13
9.関数のグラフを描こう 飯島
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
9−0.はじめに
先週の自習のとき,ワークステーションの不調から,インターネットがうまく使えなか
ったようです。残念でした。またの機会に,インターネットは楽しむこととしましょう。
また,試験の内容については,いかがでしたか。解答例(プログラム)は今回の末尾に添
付しますし,またインターネット上にも掲載しますから,参考にしてください。
さて,今回からは,「グラフィック」を扱います。数学的に「こういうことをやりたい
」ということの理解と実行を中心にし,「プログラミングとしての基礎的なこと」は多少
後回しにする部分もでてきますが,とにかく,数学的な実験を楽しみましょう。
9−1 座標
コンピュータは「紙」とは違って,有限の点の集まりです。ですから,厳密に言うと,
横640,縦480(98などは640×400)のマス目に色を塗るだけのことしかで
きません。しかし,TVも同じように有限の点しかありませんが,あれを見ることで,「
これは花だ」と分かったり,野球中継を見て興奮できるように,「アバウトでいいや」と
思えば,結構いろいろなことをさせることができます。
(1) 点を描く
SCREEN 12 ← これはグラフィックモードの宣言。
FOR x = 0 to 639
FOR y = 0 to 479
PSET (x, y)
NEXT
NEXT
これが一番元になっている「点」を,元の座標でプロットする方法です。(この点のこと
を,ピクセルと言います。)
元々の座標はこのことからも分かるように,
(0,0) +−−−−+(639,0)
| |
(0,479)+−−−−+(639,479)
となっています。この座標はいかにもコンピュータ的で,人間的ではありません。
特に,数学で使うならば,
(-15,10) +−−−−+(15,10)
| |
(-15,-10)+−−−−+(15,-10)
のような感じで,通常の座標のように使いたいものです。そのようにするためには,
(2) 数学らしい座標の取り方
SCREEN 12
WINDOW (-15,10)-(15,-10) ←これがそのための宣言
FOR x = -15 to 15
FOR y = -10 to 10
PSET (x,y)
NEXT
NEXT
としてみましょう。また,以下のプログラムはどういう工夫をしているのでしょう。
下線部の役割を考えてください。
(3)
SCREEN 12
WINDOW (-15,10)-(15,-10)
FOR x = -15 to 15 STEP .1
FOR y = -10 to 10 STEP .1
PSET (x,y)
NEXT
NEXT
また,下線部の 0.1 を他の値に変えてみましょう。どういう変化があるでしょう。
(4)
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
FOR x = -15 to 15 STEP .1
FOR y = -10 to 10 STEP .1
PSET (x,y)
NEXT
NEXT
また,下線部の「15」という値を変えてみましょう。どういう変化があるでしょう。また
,(3) と比較して,どういう点が便利でしょう。
(5)
SCREEN 12
INPUT "Max of x "; MaxOfX
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
FOR x = -15 to 15 STEP .1
FOR y = -10 to 10 STEP .1
PSET (x,y)
NEXT
NEXT
実際に,MaxOfXの値を,いろいろと入力してみましょう。(4) のプログラムと比べて,
どういう点が便利でしょう。
9−2 関数のグラフを描こう
関数のグラフはコンピュータを使うと迅速かつ正確に描くことができます。
まずは,次のプログラムを入力してみましょう。
(1)
SCREEN 12
INPUT "Max of x "; MaxOfX
MaxOfY = MaxOfX * 480 / 640
dp = MaxOfX / 640 / 2
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
FOR x = -15 to 15 STEP dp
y = x ^ 2 + 2 * x - 5
PSET (x,y)
NEXT
NEXT
どんな関数のグラフでしょう。関数を変えるには,どこを変えたらいいか分かりますか
。また,関数の描画の基本はこれでいいのですが,しかし,これでは愛想がないですね。
次の工夫をしてみます。どのような点に改良点があるのかを読み取ってください。
(2)
SCREEN 12
MaxOfX = 15
DO
CLS
MaxOfY = MaxOfX * 480 / 640
dp = MaxOfX / 640 / 2
WINDOW (-MaxOfX, MaxOfY)-(MaxOfX, -MaxOfY)
LINE (-MaxOfX, 0)-(MaxOfX, 0)
FOR i = -INT(MaxOfX) TO INT(MaxOfX)
LINE (i, 10 * dp)-(i, -10 * dp)
NEXT
LINE (0, -MaxOfY)-(0, MaxOfY)
FOR i = -INT(MaxOfY) TO INT(MaxOfY)
LINE (10 * dp, i)-(-10 * dp, i)
NEXT
FOR x = -MaxOfX TO MaxOfX STEP dp
y = x * x + 2 * x - 5
IF ABS(y) < MaxOfY THEN PSET (x, y)
NEXT
INPUT "Max of x ( 0 -> end)"; MaxOfX
LOOP UNTIL MaxOfX <= 0
9−3 練習問題
次の関数のグラフを描いてみましょう。そして,その概形をスケッチしましょう。
(1) x ^ 3 + 5 * x ^ 2 + 2 * x - 5 (2) x ^ 3 + 7 * x ^ 2 + 2 * x - 5
| |
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
(3) y = sin(x)
(4) IF x = 0 then y = 0 ELSE y = sin (1 / x) |
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
(5) IF x = 0 then y = 0 ELSE y = x * sin (1 / x)
(6) IF x = 0 then y = 0 ELSE y = sin (1 / x) / x |
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
(7) y = sin ( x ^2) (8) y = sin (x) ^2
| |
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
(9) y = sin ( x) ^3 (10) y = sin ( 7 * x) + sin ( 8 * x)
| |
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
(11) y = exp ( -x ^2)
(12) IF x = 0 THEN y = 0 ELSE y = x ^2 + 1 / x
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
(13) IF x = 0 THEN y = 0 ELSE y = x ^2 + 1 / x ^2
(14) IF x ^2 - 1 = 0 THEN y = 0 ELSE y = x ^ 3 / (x ^2 - 1)
| |
| |
| |
| |
| |
−−−−−−−−−+−−−−−−−−−− −−−−−−−−+−−−−−−−−
| |
| |
| |
| |
| |
9−4 点,線,円
次のプログラムを入力し,点,線,円の簡単な文法を調べてください。なお,この部分は
,必ずしも数学のプログラミングに不可欠というわけではないので,時間の都合によって
は,授業中では扱わないかもしれません。グラフィックスのプログラミングに関心がある
人は,自分なりに作業して理解してください。
(1) 点
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
clr = clr MOD 7 + 1
INPUT "x, y =";x,y
PSET (x , y),clr
IF x = 0 AND y = 0 THEN END
LOOP
(2) 円
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
INPUT "x, y =";x,y
INPUT "r =";r
CIRCLE (x , y), r
IF x = 0 AND y = 0 THEN END
LOOP
(3) 線分
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
clr = clr MOD 7 + 1
INPUT "Start : x, y =";x1,y1
IF x1= 0 AND y1= 0 THEN END
INPUT "End : x, y =";x2,y2
LINE (x1, y1)- (X2,Y2),clr
LOOP
(4) ?(1)
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
clr = clr + 1
INPUT "Start : x, y =";x1,y1
IF x1= 0 AND y1= 0 THEN END
INPUT "End : x, y =";x2,y2
LINE (x1, y1)- (X2,Y2),clr,B
LOOP
(5) ?(2)
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
clr = clr + 1
INPUT "Start : x, y =";x1,y1
IF x1= 0 AND y1= 0 THEN END
INPUT "End : x, y =";x2,y2
LINE (x1, y1)- (X2,Y2),clr,BF
LOOP
(6) ?(3)
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
clr = clr + 1
INPUT "Start : x, y =";x1,y1
IF x1= 0 AND y1= 0 THEN END
INPUT "End : x, y =";x2,y2
LINE (x1, y1)- (X2,Y2),clr, ,&H707
LOOP
(7) ?(4)
SCREEN 12
MaxOfX = 15
MaxOfY = MaxOfX * 480 / 640
WINDOW (-MaxOfX,MaxOfY) - (MaxOfX, - MaxOfY)
DO
INPUT " x, y =";x,y
IF x= 0 AND y= 0 THEN END
LINE -(X,Y)
LOOP
9−5 試験の解答
解答のためのプログラムの例です。正解は,実際に動かして確かめてください。
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| n |
|1.Σ k が 10000より大きくなるのは n= のときである。 |
| k=1 |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
CLS
FOR K = 1 TO 10000
SUM = SUM + K
PRINT K; SUM
IF SUM > 10000 THEN EXIT FOR
NEXT
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| n |
|2.Σ 1/k が 5 より大きくなるのは,n= のときである。 |
| k=1 |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
CLS
FOR K = 1 TO 10000
SUM = SUM + 1 / K
PRINT K; SUM
IF SUM > 5 THEN EXIT FOR
NEXT
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| 10000 2 |
|3.Σ 1/k = |
| k=1 |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
CLS
FOR k = 1 TO 10000
SUM = SUM + 1 / (k * k)
PRINT k; SUM
IF SUM > 5 THEN EXIT FOR
NEXT
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
|4.1から100までの数について,約数の個数について調べたい。 |
| (1)約数の個数が奇数となるものを列挙し,それらの数の特徴をいいなさい。 |
| |
| (2)約数の個数が最も大きなものは, である。 |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
CLS
FOR n = 1 TO 100
Yaku = 0
FOR i = 1 TO n
IF n MOD i = 0 THEN Yaku = Yaku + 1
NEXT
PRINT n; Yaku,
NEXT
まとめて表示するには
CLS
num = 100
DIM Yaku(num)
Max = 0
FOR n = 1 TO num
Yaku(n) = 0
FOR i = 1 TO n
IF n MOD i = 0 THEN Yaku(n) = Yaku(n) + 1
NEXT
PRINT n; Yaku(n),
IF Max < Yaku(n) THEN Max = Yaku(n)
NEXT
FOR x = 1 TO Max
PRINT
PRINT x; ":";
FOR n = 1 TO num
IF Yaku(n) = x THEN PRINT n;
NEXT
NEXT
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| 2 2 2 2 |
|5.a +b =c +d となるa,b,c,dの組で,互いに素なものを3つ|
|以上見つけなさい。(それぞれ正の整数とする。) |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
CLS
INPUT "Last"; Last
FOR i = 1 TO Last
FOR j = i + 1 TO Last
FOR k = i + 1 TO Last
L2 = i ^ 2 + j ^ 2 - k ^ 2
IF L2 < k ^ 2 THEN EXIT FOR
l = INT(SQR(L2))
FOR ct = l TO 1 STEP -1
IF i MOD ct = 0 AND j MOD ct = 0 AND k MOD ct = 0 AND l MOD ct =
0 THEN EXIT FOR (前行に続く)
NEXT
IF ct = 1 THEN PRINT i; j, k; l
NEXT
NEXT
NEXT
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
|6.p,p+2が素数の場合,双子素数と言う。100〜1000の間の双子素数は|
|何組あるか調べなさい。 |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
CLS
FOR n = 101 TO 1000 STEP 2
check = check + 1
FOR i = 2 TO SQR(n)
IF n MOD i = 0 THEN
check = 0
EXIT FOR
END IF
NEXT
IF check = 2 THEN PRINT n - 2; n,
NEXT
<以上>