Fyuuhh...akhirnya selesai juga perjuangan ini. :-)
Aku post ajah fungsi untuk menghasilkan persamaan linear + chartnya siapa tahu ada gunanya.
Private Function getPredictedY(ByVal Slope As Double, _
ByVal XValue As Double, _
ByVal YInt As Double) As String
Dim PredictedY As Double = (Slope * XValue) + YInt
Return (PredictedY.ToString("###.###"))
End Function
Private Function getSlope(ByVal SumXY As Double, ByVal SumXX As Double) As Double
Return (SumXY / SumXX)
End Function
Private Function getSumXY(ByVal dsSource As DataSet, _
ByVal XMean As Double, _
ByVal YMean As Double, _
ByVal intData As Integer) As Double
Dim SumXY As Double
Dim intCounter As Integer
For intCounter = 1 To intData
SumXY += SumXY + ((intCounter - XMean) * _
(dsSource.Tables(0).Rows(0)(intCounter - 1) - YMean))
Next
Return SumXY
End Function
Private Function getSumXX(ByVal XMean As Double, ByVal intData As Integer) As Double
Dim SumXX As Double
Dim intCounter As Integer
For intCounter = 1 To intData
SumXX = SumXX + (intCounter - XMean) * (intCounter - XMean)
Next
Return SumXX
End Function
Private Function getSumYY(ByVal dsSource As DataSet, _
ByVal YMean As Double, _
ByVal intData As Integer) As Double
Dim SumYY As Double
Dim intCounter As Integer
For intCounter = 1 To intData
SumYY = SumYY + ((dsSource.Tables(0).Rows(0)(intCounter - 1) - YMean) * _
(dsSource.Tables(0).Rows(0)(intCounter - 1) - YMean))
Next
Return SumYY
End Function
Private Function getMeanY(ByVal dsSource As DataSet, ByVal intData As Integer) As Double
Dim dblMean, dblSum As Double
Dim intCounter As Integer
For intCounter = 1 To intData
dblSum = dblSum + dsSource.Tables(0).Rows(0)(intCounter - 1)
Next
dblMean = dblSum / intData
Return dblMean
End Function
Private Function getMeanX(ByVal intBulan As Integer) As Double
Dim dblMean, dblSum As Double
Dim intCounter As Integer
For intCounter = 1 To intBulan
dblSum = dblSum + intCounter
Next
dblMean = dblSum / intBulan
Return dblMean
End Function
Private Function getYInt(ByVal YMean As Double, _
ByVal Slope As Double, _
ByVal XMean As Double) As Double
Return (YMean - (Slope * XMean))
End Function
Dan berikut ini adalah fungsi pemanggilnya:
Private Sub GenerateEquation(ByVal dsSource As DataSet, ByVal strForecast As String)
Dim dblSumYY, dblSumXX, dblSumXY As Double
Dim dblYMean, dblXMean, dblYInt As Double
Dim dblSlope As Double
Dim n, Forecast As Integer
Dim r As DataRow
Dim intBulanTersedia As Integer = dsSource.Tables(0).Columns.Count()
Dim intBulanKurang As Integer = 12 - intBulanTersedia
Dim intBulanMulai As Integer = intBulanTersedia + 1
Dim intData As Integer = intBulanTersedia
Forecast =
CType(strForecast, Integer)
' Initialize to get formula
' y=mx+b
' -------------------------
dblXMean = getMeanX(intData)
dblYMean = getMeanY(dsSource, intData)
dblSumXX = getSumXX(dblXMean, intData)
dblSumYY = getSumYY(dsSource, dblYMean, intData)
dblSumXY = getSumXY(dsSource, dblXMean, dblYMean, intData)
dblSlope = getSlope(dblSumXY, dblSumXX)
dblYInt = getYInt(dblYMean, dblSlope, dblXMean)
If Forecast <> 0 Then
For n = intBulanMulai To Forecast
dsSource.Tables(0).Columns.Add(n)
dsSource.Tables(0).Rows(0)(n - 1) = getPredictedY(dblSlope, n, dblYInt)
Next
End If
' Construct trendlines
' --------------------
Dim dsTrendline As New DataSet("dsTrendline")
Dim dtTrendline As New DataTable("tblTrendline")
Dim rTrendline As DataRow
Dim szBulan As String
dsTrendline.Tables.Add(dtTrendline)
' Clean up Columns and Rows
' -------------------------
dsTrendline.Tables(0).Rows.Clear()
dsTrendline.Tables(0).Columns.Clear()
rTrendline = dsTrendline.Tables(0).NewRow()
For n = 1 To dsSource.Tables(0).Columns.Count()
If n < 10 Then
szBulan = "0" & n.ToString()
Else
szBulan = n.ToString()
End If
dtTrendline.Columns.Add(New DataColumn(szBulan))
rTrendline(szBulan) = getPredictedY(dblSlope, n, dblYInt)
Next
dtTrendline.Rows.Add(rTrendline)
' Construct chart
' ---------------
GenerateChart(dsSource, dsTrendline,
False)
lblRumus.Text = "Formula: y = " & dblSlope.ToString() & "x + " & dblYInt.ToString()
End Sub
Dengan menggunakan komponen WebChart, buatlah chartnya :
Private Sub GenerateChart(ByVal pDS As DataSet, _
ByVal pDSTrendline As DataSet)
Dim n As Integer
Dim intColumn, intColumnTrendline As Integer
Dim chartOriginalData As New WebChart.ChartPointCollection
Dim chartTrendlineData As New WebChart.ChartPointCollection
' Construct default Chart first
' -----------------------------
intColumn = pDS.Tables(0).Columns.Count() - 1
For n = 0 To intColumn
chartOriginalData.Add(New WebChart.ChartPoint(pDS.Tables(0).Columns(n).ColumnName(), _
pDS.Tables(0).Rows(0)(n)))
Next
' Construct Trendline
' -------------------
intColumnTrendline = pDSTrendline.Tables(0).Columns.Count() - 1
For n = 0 To intColumnTrendline
chartTrendlineData.Add(New WebChart.ChartPoint(pDSTrendline.Tables(0).Columns(n).ColumnName(), pDSTrendline.Tables(0).Rows(0)(n)))
Next
Dim chartTypeOriginalData As New WebChart.LineChart(chartOriginalData, _
Color.Black)
Dim chartTypeTrendlineData As New WebChart.SmoothLineChart(chartTrendlineData, _
Color.Red)
chartTypeOriginalData.DataLabels.Visible =
True
chartTypeTrendlineData.DataLabels.Visible = False
chartDetails.Charts.Add(chartTypeOriginalData)
chartDetails.Charts.Add(chartTypeTrendlineData)
chartDetails.Visible =
True
chartDetails.RedrawChart()
End Sub
Tadaaa....dan terbentuklah chart yang diinginkan