如果未来能够被预测,世界将大有不同。
马尔可夫(Markov)是俄国著名的数学家。马尔可夫预测法是以马尔可夫的名字命名的一种预测事件发生的概率的方法,可用于市场占有率的预测和销售期望利润的预测。
事物的发展状态总是随着时间的推移而不断变化的。在一般情况下,人们要了解事物未来的发展状态,不但要看到事物现在的状态,还要看到事物过去的状态。马尔可夫认为,还存在另外一种情况, 人们要了解事物未来的发展状态,只须知道事物现在的状态,而与事物以前的状态毫无关系。例如,A产品明年是畅销还是滞销, 只与今年的销售情况有关,而与往年的销售情况没有直接的关系。后者的这种情况就称为马尔可夫过程,前者的情况就属于非马尔可夫过程。
马尔可夫过程的重要特征是无后效性。事物第n次出现的状态,只与其第n-1次的状态有关,它与以前的状态无关。举一个通俗例子说:池塘里有三片荷叶和一只青蛙,假设青蛙只在荷叶上跳来跳去。若现在青蛙在荷叶A上,那么下一时刻青蛙要么在原荷叶A上跳动,要么跳到荷叶B上,或荷叶C上。青蛙究竟处在何种状态上,只与当前状态有关,而与以前位于哪一片荷叶上并无关系。这种性质,就是无后效性。
代码:
Option Explicit
'自定义函数GetPn()用来表示矩阵Va的Imonth次幂
Function GetPn(Va As Variant, Icol As Integer, Imonth As Integer) As Variant
'定义变量i,j,k,l为整型变量
Dim i As Integer, j As Integer, k As Integer, l As Integer
'定义Vt,Vtemp为变量型变量
Dim Vt As Variant, Vtemp As Variant
'声明Vt变量为数组型变量,并声明其行,列变量Icol,Icol
Vt = Array(Icol, Icol)
Vt = Va '将Va赋给Vt
For k = 1 To Imonth Step 1 '循环运算
Vtemp = Vt '将Vt赋给临时变量Vtemp
For i = 1 To Icol '行循环
For j = 1 To Icol '列循环
Vt(i, j) = 0 '使当前Vt(i,j)清0
For l = 1 To Icol
'给Vt(i,j)赋值
Vt(i, j) = Vt(i, j) + Vtemp(i, l) * Va(l, j)
Next l
Next j
Next i
Next k
GetPn = Vt '将得到的Vt返回
End Function
Sub OneStep()
Range("C11").Select '选择C11单元格
ActiveCell.FormulaR1C1 = "=R[-7]C/R[-7]C[3]" '求商
Range("D11").Select '选择单元格D11
ActiveCell.FormulaR1C1 = "=R[-7]C/R[-7]C[2]" '求商
Range("E11").Select '选择单元格E11
ActiveCell.FormulaR1C1 = "=R[-7]C/R[-7]C[1]" '求商
Range("C11").Select '选择单元格C11
'填充计算
Selection.AutoFill Destination:=Range("C11:C13"), Type:=xlFillDefault
Range("D11").Select '选择单元格D11
'填充计算
Selection.AutoFill Destination:=Range("D11:D13"), Type:=xlFillDefault
Range("E11").Select '选择单元格E11
'填充计算
Selection.AutoFill Destination:=Range("E11:E13"), Type:=xlFillDefault
'选择单元格C11到E13区域
Range("C11:E13").Select
Selection.NumberFormatLocal = "0.000" '设置单元格格式
End Sub
Sub AnyStep() '自定义函数,用来计算任何月份的盈亏情况
Dim Smonth As Integer '定义Smonth表示月份
Dim i As Integer, j As Integer '定义i,j整型变量
'判断输入的是否为1-12的数字
If (Range("C15").Value < 13 And Range("C15").Value > 1) Then
'如果为月份,则赋值给Smonth
Smonth = Val(Range("C15").Value) - 1
For i = 1 To 3 '外循环
For j = 1 To 3 '内循环
'使用函数GetPn , 计算矩阵各元素值
Cells(16 + i, 2 + j) = Application.WorksheetFunction.Index(GetPn(Range("C11:E13"), _
3, Smonth), i, j)
Next j
Next i
Range("C17:E19").Select '选择单元格区域C17:E19
Selection.NumberFormatLocal = "0.000" '设置单元格格式
Else
'输入的不是月份数则进行提示
MsgBox "请在C15单元格里输入您想查看的月份数"
End If
End Sub
毫无疑问,本示例最核心的代码为n步转移概率的计算函数-GetPn()。
这部分代码的数学原理似乎是矩阵乘法,可参考下文:
马尔可夫链-Chapman-Kolmogorov方程及其n步转移概率矩阵 (http://blog.youkuaiyun.com/makenothing/article/details/41363971)
有关矩阵乘法的介绍,参考度娘。
http://baike.baidu.com/link?url=hWDYx_ykyBHwRRWDEK1F8MKe514xBLjsMwygzcNTK5OmBDOwshenvcKh-rTHP1nwNAzZuKDAoswkZ8Wb75-bgQAo4brEfMUiAqEqP9is8LdiDQNBOVky3Ltjua4fJ8Er