【问题标题】:Converting a math formula into MATLAB code将数学公式转换为 MATLAB 代码
【发布时间】:2010-12-17 19:45:57
【问题描述】:

如何将此数学公式转换为向量化的 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

【问题讨论】:

  • 是的,但是这个公式不是matlab代码
  • 我只是想把公式转换成matlab代码。索引问题后我会调整。

标签: matlab


【解决方案1】:

在 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));

【讨论】:

    【解决方案2】:

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

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

    等价于

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

    所以

    我会先将 b 转换为 log 返回:

    c = diff(log(b));
    

    然后

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

    也许通过简化公式,您可以更清楚地看到自己想要什么。

    【讨论】:

      【解决方案3】:

      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)。

      【讨论】:

      • 谢谢lijie的回答,但是公式中Log(b(i)/b(i-1))是标量,而在你的回复中是向量。
      • 其实 log (b (i) / b (i-1)) 是一个标量,Sum (Log (b (i) / b (i-1)), 10) 给出另一个标量,它是 log (b (i) / b (i-1)) 的最后 10 个值的总和。
      • 所以,a(i) 是结果的最后 10 个值的总和:log (b (i) / b (i-1)) - Sum (Log (b (i) / b (i-1))
      • 哦,我读错了 sum 的定义(将 - 读为 +)。会调整答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多