| 2:フラクタクル関係(プログラミング) | |
| 思いついたら、そのままフローチャートもかかずに、一気にパソコンに向かってしまうタチなので、ハッキリ言って良いプログラム(洗練されたプログラム)ではありません。Select Case 文などを使えばもっとスッキリしたものになるでしょうし、IF文の中身をもっと整理しないといけませんし、そもそも構文全体において無駄の無いようにするのがプログラマーの腕の見せ所ですが、それはみなさんにお任せすることにします。 | |
| 結 果 黒、灰色等、暗い色の点は解への収束が速いことを示します。ここではQBColorでおおざっぱな色つけをしてありますが、力のある人はRGB等でもっと細かく色つけをするとよいと思います。また、この図は原点周辺の一辺の長さが2の正方形の領域で調べてありますが、この中の小さい領域をさらに調べて拡大表示していくことで、マンデルブロート集合を表す図形に出会えるかも知れません。変数の精度やx1,y1の値等を変えてみると面白いと思います。command2は今回は関係ありません。将来的にジュリア集合を求めたりするのに使おうかなと考えています。 |
|
![]() |
|
| プログラム x^3=1の解はx=1,x=-1/2+i(sqr(3))/2、x=-1/2-i(sqr(3))/2で、sqr(3)/2=0.866にしています。解への収束は解を表す点を囲む小さな円領域に達することで判定しています。 |
|
| プログラム | Dim x, x1, y, y1, xx, yy, t As Double Dim xi, yi, s, c, i, bindex, imin As Integer こっちは(General)の設定 ------------------------------------------------------------------------------------- Private Sub Command1_Click() For x1 = -1 To 1 Step 0.01 調べる範囲の設定 For y1 = -1 To 1 Step 0.01 x = x1 y = y1 s = 0 If x1 = 0 And y1 = 0 Then x = 0.001 ここら辺はオーバーフロー対策のごまかし y = 0.001 End If For i = 1 To 50 i で収束の早さを判定します。 t = x * x + y * y Newton法での設定 xx = t * (2 * x * t + 1) - 2 * y * y yy = 2 * y * (t * t - x) x = xx / (3 * t * t) y = yy / (3 * t * t) If (x - 1) * (x - 1) + y * y < 0.0001 Then 解x=1(y=0)を囲む円領域 bindex = 0 If s = 0 Then imin = i s = 1 最小の i が残るような対策 End If End If If (x + 0.5) * (x + 0.5) + (y - 0.866) * (y - 0.866) < 0.0001 Then bindex = 1 解x=-1/2+i(sqr(3))/2を囲む円領域 If s = 0 Then imin = i s = 1 End If End If If (x + 0.5) * (x + 0.5) + (y + 0.866) * (y + 0.866) < 0.0001 Then bindex = 2 解x=-1/2-i(sqr(3))/2を囲む円領域 If s = 0 Then imin = i s = 1 End If End If Next i If bindex = 0 Then c = 10 収束の遅い点の色を先に設定 If imin <= 2 Then c = 0 End If If imin >= 3 And imin <= 4 Then c = 8 End If If imin >= 5 And imin <= 8 Then c = 2 End If xi = Int(100 * x1) + 130 Int(100*x1+130)では誤差が生じます。 yi = 130 - Int(100 * y1) Int(130-100*y1)では誤差が生じます。 Picture1.PSet (xi, yi), QBColor(c) 色の付いた点を表示 130の値は設定の項を参照 End If If bindex = 1 Then c = 12 If imin <= 2 Then c = 0 End If If imin >= 3 And imin <= 4 Then c = 8 End If If imin >= 5 And imin <= 8 Then c = 4 End If xi = Int(100 * x1) + 130 yi = 130 - Int(100 * y1) Picture1.PSet (xi, yi), QBColor(c) End If If bindex = 2 Then c = 9 If imin <= 2 Then c = 0 End If If imin >= 3 And imin <= 4 Then c = 8 End If If imin >= 5 And imin <= 8 Then c = 1 End If xi = Int(100 * x1) + 130 yi = 130 - Int(100 * y1) Picture1.PSet (xi, yi), QBColor(c) End If Next y1 Next x1 End Sub |
| 設 定 プログラムで130という値が出てきますが、ScaleHeightとScaleWidthが263なので、真ん中ぐらいが原点になるように130を採りました。 |
|
| PictureBox設定 | ![]() (注意)AutoRedrawがFalseの設定です。 |
| 戻 る |