Excel VBA高效办公应用-第十五章-VBA在生产预测与经营分析中的应用

本文介绍了马尔可夫预测法的基本概念及应用,详细解释了马尔可夫过程的无后效性特点,并通过一个关于青蛙跳跃的例子进行了说明。此外,文章提供了计算n步转移概率的具体VBA代码。

如果未来能够被预测,世界将大有不同。

马尔可夫(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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值