将数学公式转换为MATLAB代码

时间:2010-12-17 19:45:58

标签: matlab

如何将此数学公式转换为矢量化MATLAB代码?

a(i) = Sum (Log (b(i) / b(i-1)) - Sum (Log (b(i) / b(i-1)), 10) , 10 )

b是一个向量和i > 10

另外,Sum (d(i),n) = d(i) + d(i-1) + ... + d(i-n+1)i > n

3 个答案:

答案 0 :(得分:3)

在MATLAB中编写公式之前,您可以执行大量的简化。首先,按如下方式定义函数f(i)

f(i) = Log(b(i)/b(i-1)) = Log(b(i)) - Log(b(i-1))

然后,按照您的定义应用Sum函数,您可以看到许多术语相互抵消:

Sum(f(i),10) = f(i) + f(i-1) + ... + f(i-8) + f(i-9)
             = Log(b(i))   - Log(b(i-1)) +
               Log(b(i-1)) - Log(b(i-2)) +
               ... +
               Log(b(i-8)) - Log(b(i-9)) +
               Log(b(i-9)) - Log(b(i-10))

==> Sum(f(i),10) = Log(b(i)) - Log(b(i-10))

现在,这里有点棘手,因为有两种方法可以解释嵌套的Sum操作:内部求和变量i 取决于的操作外部求和变量i,以及外部求和变量i的内部求和变量i 独立的那个。


当内部i取决于外部i ...

然后对于外部求和的每个项,从该项的i的递减值开始计算内部求和。例如,外部求和的第五项看起来像这样:

... + f(i-4) - Sum(f(i-4),10) + ...

因此,a(i)的等式将简化如下:

a(i) = Sum(f(i) - Sum(f(i),10),10)
     = Sum(Log(b(i)) - Log(b(i-1)) - Log(b(i)) + Log(b(i-10)),10)
     = Sum(Log(b(i-10)) - Log(b(i-1)),10)
     = Log(b(i-10)) - Log(b(i-1)) +
       Log(b(i-11)) - Log(b(i-2)) +
       ... + 
       Log(b(i-18)) - Log(b(i-9)) +
       Log(b(i-19)) - Log(b(i-10))

              [b(i-11)*b(i-12)*...*b(i-18)*b(i-19)]
==> a(i) = Log[-----------------------------------]
              [  b(i-1)*b(i-2)*...*b(i-8)*b(i-9)  ]

这个最终的等式可以在MATLAB中编码如下:

a(i) = log(prod(b(i-(11:19)))/prod(b(i-(1:9))));


当内部i独立于外部i ...

那么内部求和的结果基本上看起来是相对于外部求和的常数。例如,外部求和的第五项看起来像这样:

... + f(i-4) - Sum(f(i),10) + ...

因此,a(i)的等式将简化如下:

a(i) = Sum(f(i) - Sum(f(i),10),10)
     = Sum(f(i),10) - 10*Sum(f(i),10)
     = -9*Sum(f(i),10)
     = 9*Log(b(i-10)) - 9*Log(b(i))

==> a(i) = 9*Log(b(i-10)/b(i))

这个最终的等式可以在MATLAB中编码如下:

a(i) = 9*log(b(i-10)/b(i));

答案 1 :(得分:2)

不确定你在这里表达的是什么概念(你的公式没有匹配的括号!)但如果这真的是你想要的,你可以简化如下:

log(b(i:i+9)./b(i-1:i+8))  

相当于

 diff(log(b(i-1:i+9)))

所以

我会先将b转换为log return:

c = diff(log(b));

然后

a(i+1) = sum( c(i:i+9) - sum(c(i:i+9)));

也许简化了公式,你可以更清楚地看到你想要的东西。

答案 2 :(得分:1)

a(i) = sum( log(b(i-9:i:)./b(i-10:i-1)) - sum(log(b(i-9:i)./b(i-10:i-1))))

考虑Sum(f(i), n)。它相当于sum(f(i-n+1:i))。所以Sum(Log(f(i)), n)sum(log(f(i-n+1:i)))(采用元素运算,然后对结果求和)。

修改

数学上,不是

Sum(Log(b(i)/b(i-1)), n)
= \sum_{j=0..n-1}(Log(b(i-j)/b(i-j-1)))
= \sum_{j=0..n-1}(Log(b(i-j)) - Log(b(i-j-1)))
= Log(b(i)) - Log(b(i-n))
= Log(b(i)/b(i-n))

...

那么,

a(i) = Sum(Log(b(i)/b(i-1)) - Sum(Log(b(i)/b(i-1)), n)  , n)
= Sum(Log(b(i)/b(i-1)), n) - Sum(Sum(Log(b(i)/b(i-1)), n), n)
= Log(b(i)/b(i-n)) - Sum(Log(b(i)/b(i-n)), n)

...

问题在于Sum的定义。这真的应该指定索引。

内部Sum索引如何与外部总和相互作用(两者都是i)。