関数のグラフ・曲線を描くプログラム

関数y = f (x)のグラフ

 関数のグラフを描くプログラムは,たいていの場合,次のプログラムの100行から140行までを修正して作ることができます。
関数は,100行のDEF文で与えます。 110行,120行のleft,rightでx座標の範囲,130行,140行のbottom,topでy座標の範囲を指定してください。関数のグラフの場合,縦方向の尺度と横方向の尺度を一致させる必要はないので,それぞれ独立に定めてかまいません。
例1 y=(1+1/x)x のグラフを描く

100 DEF f(x)=(1+1/x)^x
110 LET left=-5
120 LET right=5
130 LET bottom=-1
140 LET top=9
150 SET WINDOW left, right, bottom, top
160 ASK PIXEL SIZE (left, bottom; right, top) p, q 
170 DRAW axes
180 FOR x=left TO right STEP (right-left)/(p-1)
190    WHEN EXCEPTION IN
200       PLOT LINES: x, f(x);
210    USE
220       PLOT LINES
230    END WHEN
240 NEXT x
250 END

 ASK PIXEL SIZEは,対角の頂点を指定した矩形内にあるピクセル数を調べる命令です。 leftとrightの位置にはそれぞれ1ピクセルが存在しますから,leftとrightとの間のピクセル間隙の個数はp-1です(植木算)。 そこで,180行のように,xの値をleftからrightまで(right-left)/(p-1)刻みで変化させて計算すれば効率よくグラフが描けます。
 グラフを描いてみようと考える関数は,その素性が明らかでない関数であるのが普通です。 ですから,計算結果がどうなるかは,計算してみるまで分からないことを前提にプログラムを作る必要があります。 従って,関数のグラフを描くプログラムには,例外状態処理が必須になります。
 例1のプログラムでは,200行で関数値の計算にエラーが発生すると,200行の実行を中断して220行を実行し,WHEN EXECPTION IN〜END WHENブロックの実行を終えます。220行のパラメータを持たないPLOT LINES文は,直前に計算された点と,次に計算する点とを結ばなくする効果を持ちます。

 関数値の変動の激しい関数のグラフを描く場合には,例1のプログラムのように画面解像度にあわせてxの値を変化させたのでは十分ではないことがあります。
 そのような場合は,刻み値をもっと細かくして計算します。
例2 y =sin(1/x)のグラフ

100 DEF f(x)=SIN(1/x)
110 LET left=-4
120 LET right=4
130 LET bottom=-4
140 LET top=4
150 SET WINDOW left, right, bottom, top
170 DRAW axes
180 FOR x=left TO right STEP (right-left)/5000
190    WHEN EXCEPTION IN
200       PLOT LINES: x, f(x);
210    USE
220       PLOT LINES
230    END WHEN
240 NEXT x
250 END


 例1や例2の手法がうまく機能しない場合もあります。
 例1のプログラムを

100 DEF f(x)=TAN(x)
110 LET left=-5
120 LET right=5
130 LET bottom=-5
140 LET top=5

のように変えて正接関数のグラフを描くと,右図のようになってしまいます。
 これは,π/2など,正接関数が定義されない値の前後で絶対値が大きな値になるものの,桁あふれのエラーになるほどではないのが原因です。

 このような場合は,連続な折れ線で描くのをあきらめ,多くの点をとるという基本に忠実なプログラムとします。
点を描く命令はPLOT POINTSですが,描かれる点の形を・にするために160行のSET POINT STYLE 1を実行しておきます。
例3 正接関数のグラフ

100 DEF f(x)=TAN(x)
110 LET left=-5
120 LET right=5
130 LET bottom=-5
140 LET top=5
150 SET WINDOW left, right, bottom, top
160 SET POINT STYLE 1
170 DRAW axes
180 FOR x=left TO right STEP (right-left)/5000
190    WHEN EXCEPTION IN
200       PLOT POINTS: x, f(x)
210    USE
230    END WHEN
240 NEXT x
250 END

これで右図のようなグラフが得られます。
 点で描く場合には,桁あふれなどのエラーが起きたら何もしなくていいので,例外処理はエラーを無視して先に進ませるだけのシンプルなものになります。

 三角関数のグラフを描くのが目的である場合は,角の大きさの単位を度に変えると厄介な問題を回避できることがあります。
 Full BASICでは,角の大きさの単位を度に変えると,TAN(-90)やTAN(90)は確実にエラーになります。そこで,xの値の変化のステップを調整して,かならずそれらの値に対する関数値が計算されるようにしておけば,問題が回避できます。
例4 正接関数のグラフ

100 OPTION ANGLE DEGREES 
110 DEF f(x)=TAN(x)
120 LET left=-320
130 LET right=320
140 LET bottom=-5
150 LET top=5
160 SET WINDOW left, right, bottom, top
170 DRAW axes(90,1)
180 FOR x=left TO right 
190    WHEN EXCEPTION IN
200       PLOT LINES: x, f(x);
210    USE
220       PLOT LINES
230    END WHEN
240 NEXT x
250 END


方程式 f (x, y)=0 の表す曲線を描く

 BASICで方程式 f (x, y)=0 の表す曲線を描くのは簡単ではありません。
y=f (x)の形や,媒介変数方程式の形に直して描くのがよい方法ですが,そのような方法が取れない場合には,次のように手があります。
例5 方程式 f (x, y)=0 の表す曲線を描く

100 DEF f(x,y)=x^2+y^2 - 3*x*y +1
110 LET left=-4
120 LET right=4
130 LET bottom=-4
140 LET top=4
150 SET POINT STYLE 1
160 SET WINDOW left,right,bottom,top
170 DRAW axes
180 FOR y=bottom TO top STEP (top-bottom)/2000
190    LET x=left
200    LET z0=f(x,y)
210    FOR x=left TO right STEP (right-left)/2000
220       LET z=f(x,y)
230       IF z0*z<0 THEN  PLOT POINTS: x,y
240       LET z0=z
250    NEXT x
260 NEXT y
270 END

 y の値を固定して,x の値を左端から右端まで少しずつ変化させ,f (x, y)の値の符号が変わったら,そのすぐ近くにf (x, y)=0となる点があるはずなのでそこに点を描きます。


 例5は,関数f (x, y)が連続であることを前提としています。関数が連続でない場合には,不連続点を取り除く工夫が必要です。
例6 

100 DEF f(x,y)=(1/(x-y))-x+3*y
110 LET left=-5
120 LET right=5
130 LET bottom=-5
140 LET top=5
150 SET POINT STYLE 1
160 SET WINDOW left,right,bottom,top
170 DRAW axes
180 FOR y=bottom TO top STEP (top-bottom)/2000
190    LET x=left
200    WHEN EXCEPTION IN
210       LET z0=f(x,y)
220    USE 
230       LET z0=1
240    END WHEN
250    FOR x=left TO right STEP (right-left)/2000
260       WHEN EXCEPTION IN
270          LET z=f(x,y)
280          IF ABS(z0)<1 AND ABS(z)<1 AND z0*z<0 THEN  PLOT POINTS: x,y
290          LET z0=z
300       USE
310          LET z0=1
320       END WHEN
330    NEXT x
340 NEXT y
350 END


戻る