Эффективное суммирование N функций в MATLAB - PullRequest
0 голосов
/ 30 сентября 2019

Я хотел бы эффективно рассчитать следующую функцию, и, следовательно, предпочтительно с помощью ручки функции. enter image description here

В данном уравнении только "s" является переменной. Остальные являются известными константами, но они изменяются внутри цикла. Я хотел бы получить это как дескриптор функции, потому что позже мне нужно найти корни этой функции.

Этот вопрос относится к этому вопросу, который я недавно задавал . Но ответ кажется неэффективным, и я не могу получить единый дескриптор функции для всего этого. Есть ли способ?

Моя проба:

K=10;
N=4;

for ii=1:K
    for jj=1:N
f{ii,jj}=@(x) p_th0{ii}(jj).*log(p_th1{ii}(jj)/p_th0{ii}(jj)).*(p_th1{ii}(jj)/p_th0{ii}(jj)).^x;
    end
end

function y = sum_of_functions(f,x)
   y = 0;
   for ii=1:numel(f)
    y = y + f{ii}(x);
   end
end

r = FindRoots(@(x)sum_of_functions(f,x),A,B,2^5,0);

В этом коде «x» (соответствует «s» в формуле) - это переменная, для которой позже будут найдены корни. «p_th0» и «p_th1» являются ячейками некоторых известных констант (изменяющихся внутри внешнего цикла while). В приведенном выше коде этой части в f {ii, jj} = @ (x) отсутствует термин, на который нам нужно разделить сумму. Таким образом, он учитывает только двойную сумму по числителю на данном рисунке.

Я также должен отметить, что я недоволен отсутствием единого дескриптора функции для всего этого. У меня есть просто ячейка с некоторыми функциями, и каждый раз, когда мне нужно оценить сумму, я должен сначала построить ее. Вместо этого я хотел бы собрать сумму дескриптора функции один раз и просто использовать этот дескриптор функции в «FindRoots».

1 Ответ

1 голос
/ 30 сентября 2019

Будет гораздо эффективнее, если вы забудете об анонимных функциях и просто напишите одну функцию для вычисления ваших значений.

f = @(x)theFunction(p_th0,p_th1,x);
r = FindRoots(f,A,B,2^5,0);

function y = theFunction(p_th0,p_th1,x);
   K = numel(p_th0);
   N = numel(p_th0{1});
   y = 0;
   for ii=1:K
      for jj=1:N
         B = p_th1{ii}(jj)/p_th0{ii}(jj);
         A = p_th0{ii}(jj).*log(B);
         y = y + A .* B.^x;
      end
   end
end

Если вы создадите вложенную функцию и вернетесправиться с этим, то вы даже можете предварительно вычислить некоторые из этих расчетов. Это довольно причудливое решение, но оно более эффективно, чем приведенный выше код.

f = getFunctionHandle(p_th0,p_th1);
r = FindRoots(f,A,B,2^5,0);

function out = getFunctionHandle(p_th0,p_th1);
   K = numel(p_th0);
   N = numel(p_th0{1});
   A = zeros(K,N);
   B = zeros(K,N);
   for ii=1:K
      for jj=1:N
         B(ii,jj) = p_th1{ii}(jj)/p_th0{ii}(jj);
         A(ii,jj) = p_th0{ii}(jj).*log(B(ii,jj));
      end
   end

   % nested function
   function y = func(x)
      y = 0;
      for ii=1:numel(A)
         y = y + A .* B.^x;
      end
   end

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