Option Explicit On Option Strict On Public Class Form1 Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim tpoint As Double Dim ppoint As Double Dim r As Integer Dim prbs As Double Dim sr As System.IO.StreamReader Dim sw As System.IO.StreamWriter Dim dat As String Dim sbuf() As String Dim delim() As Char = {","c} Dim fname1 As String = "" Dim fname2 As String = "" Dim i As Integer Dim k As Integer Dim ndata As Integer Dim xd() As Double Dim yd() As Double Dim com As String '読み込み If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fname1 = OpenFileDialog1.FileName sr = New System.IO.StreamReader(fname1, System.Text.Encoding.Default) dat = sr.ReadLine() : com = dat dat = sr.ReadLine() : sbuf = dat.Split(delim) : ndata = CInt(sbuf(0)) - 1 ReDim xd(ndata) ReDim yd(ndata) k = 0 Do While sr.Peek() >= 0 dat = sr.ReadLine() : sbuf = dat.Split(delim) : xd(k) = CDbl(sbuf(0)) : yd(k) = CDbl(sbuf(1)) + 0.5 k = k + 1 Loop sr.Close() ndata = k - 1 '確率計算・画面表示 For i = 0 To ndata ppoint = xd(i) prbs = SHENTON(ppoint) tpoint = TODA(prbs) r = DataGridView1.Rows.Add() DataGridView1(0, r).Value = xd(i).ToString("0.0") DataGridView1(1, r).Value = yd(i).ToString("0.000000") DataGridView1(2, r).Value = prbs.ToString("0.000000") DataGridView1(3, r).Value = tpoint.ToString("0.000") Next i '書き込み If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fname2 = SaveFileDialog1.FileName sw = New System.IO.StreamWriter(fname2, False, System.Text.Encoding.Default) sw.WriteLine(com) sw.WriteLine("%点(入力値),非超過確率(正規分布表),非超過確率(Shenton),%点(戸田)") k = 3 For r = 0 To ndata dat = DataGridView1(0, r).Value.ToString For i = 1 To k dat = dat & "," & DataGridView1(i, r).Value.ToString Next i sw.WriteLine(dat) Next r sw.Close() End Sub Private Function TODA(ByVal rx As Double) As Double '非超過確率の%点 Dim i As Integer Dim ry As Double Dim ay As Double Dim uay As Double Dim b(10) As Double Dim sum As Double If rx = 0.5 Then uay = 0 Else If rx < 0.5 Then ry = rx Else ry = 1 - rx End If ay = -Math.Log(4.0 * ry * (1.0 - ry)) b(0) = 1.570796288 b(1) = 0.03706987906 b(2) = -0.0008364353589 b(3) = -0.0002250947176 b(4) = 0.000006841218299 b(5) = 0.000005824238515 b(6) = -0.00000104527497 b(7) = 0.00000008360937017 b(8) = -0.000000003231081277 b(9) = 0.00000000003657763036 b(10) = 0.0000000000006936233982 sum = 0.0 For i = 0 To 10 sum = sum + b(i) * ay ^ CDbl(i) Next i uay = Math.Sqrt(ay * sum) If rx < 0.5 Then uay = -uay End If TODA = uay End Function Private Function SHENTON(ByVal u As Double) As Double '%点に対する非超過確率 Dim nt As Integer = 30 Dim ii As Integer Dim ue As Double Dim af As Double Dim qh As Double Dim ag As Double Dim ab As Double Dim q As Double If u >= 0 Then ue = u If u < 0 Then ue = -u af = ue * ue qh = 0.0 ag = Math.Exp(-0.5 * af) * 0.3989422804014327 ab = -1.0 For ii = nt To 1 Step -1 qh = CDbl(ii) * af / (2.0 * CDbl(ii) + 1.0 + ab * qh) ab = -ab Next ii qh = 0.5 - ag * ue / (1.0 - qh) If u < 0 Then qh = 1.0 - qh q = qh SHENTON = 1.0 - q End Function Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DataGridView1.ColumnCount = 4 DataGridView1.Columns(0).Width = 100 DataGridView1.Columns(1).Width = 100 DataGridView1.Columns(2).Width = 100 DataGridView1.Columns(3).Width = 100 DataGridView1.Columns(0).HeaderText = "%点(入力値)" DataGridView1.Columns(1).HeaderText = "非超過確率(正規分布表)" DataGridView1.Columns(2).HeaderText = "非超過確率(Shenton)" DataGridView1.Columns(3).HeaderText = "%点(戸田)" End Sub End Class