Преобразование математической формулы в код MATLAB - PullRequest
2 голосов
/ 17 декабря 2010

Как я могу преобразовать эту математическую формулу в векторизованный код 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 ]

3 голосов
/ 18 декабря 2010

Прежде чем кодировать формулу в 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 голосов
/ 18 декабря 2010

Не уверен, какое понятие вы выражаете здесь (ваша формула не имеет соответствующих скобок!), Но если это действительно то, что вы хотите, вы можете упростить это следующим образом:

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

эквивалентно

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

Итак

Я бы сначала преобразовал b в log log:

c = diff(log(b));

, затем

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

Возможно, с упрощенной формулой вы можетевидеть более четко, что вы хотите.

1 голос
/ 17 декабря 2010

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))) (возьмите поэлементную операцию, а затем сложите результат).

EDIT

Математически, не

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...