−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−    応用数学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 <以上>