Корректирующий расчет суммирования рядов делить на n на каждом шаге суммирования - PullRequest
0 голосов
/ 23 января 2019

Ранее я задавал этот вопрос, в котором упоминалось суммирование ряда для вычисления числа Пи по формуле

pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 ...

Внутри вычисления

A = Sum of a_i from i=1 to N

и

a_i = (-1)^(i+1)/(2i-1)

Я пишу это вычисление, чтобы проанализировать производительность времени, которое требуется для вычисления пи на N суммирования.Я хочу понять связь между T_N и N при увеличении N, где

T_N = the total elapsed time it takes to do N summations.

N = the number of summations.

Моя программа Matlab отображает T_N как функцию N. ВнутриВ этой программе я определяю переменные, чтобы найти значения a и b (где a - точка пересечения y, а b - наклон) для следующего линейного уравнения

T_N=a + b*N

. Для этого я написалследующая ниже программа Matlab (с начальным тестом N = 1000)

clear all;
n=1000;
f=[];
telapsed = zeros(1,n);
tic
for jj=1:n
    ii=1:jj;
    f=[f 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed(jj) = toc;
end

hold on
plot(1:n,telapsed)
title('Time it takes to sum \pi using N summations')
xlabel('Number of summations (N)') 
ylabel('Total Time (T_N)')
p = polyfit(1:n,telapsed,1);
slope=p(1)      % slope of t_N = a + b*N or b
intercept=p(2)  % y-intercept or a

При запуске этой программы получается следующий график

enter image description here

Итак, этот код возвращает значения a и b для N = 1000. Код возвращает

a = slope = 9.3447e-06
b = intercept = 0.0011

Итак, при N = 1000 я нахожу, что

T_n = a + b*N = 9.3447e-06 + 0.0011*N

Ятеперь пытаюсь откорректировать мой код от черчения

T_N as a function of N

до черчения

(T_N − a)/N as a function of N

Чтобы сделать это, я сделал следующие корректировки

clear all;
n=1000;
f=[];
g=[];
telapsed = zeros(1,n);
telapsed2 = zeros(1,n);
tic

% The original for loop computes T_N as a function of N
for jj=1:n
    ii=1:jj;
    f=[f 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed(jj) = toc;
end

% I think that I need to make a new for loop to compute (T_N − a)/N as a function of N
for jj=1:n
    ii=1:jj;
    g=[g 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed2(jj) = toc/jj; % This must be wrong, I think that I need to adjust to compute (T_N − a)/N
end

hold on
plot(1:n,telapsed) % the plot for T_N as a function of N
plot(1:n,telapsed2) % the plot for (T_N − a)/N as a function of N
title('Time it takes to sum \pi using N summations')
xlabel('Number of summations (N)') 
ylabel('Total Time (T_N)')
legend('T_N as a function of N','(T_N − a)/N as a function of N')

p = polyfit(1:n,telapsed,1);
slope=p(1)      % slope of t_N = a + b*N or b
intercept=p(2)  % y-intercept or a

p2 = polyfit(1:n,telapsed2,1);
slope2=p2(1)      % Adjusted slope
intercept2=p2(2)  % Adjusted y-intercept

, которыесоздает следующий график

enter image description here

Это не может быть правильным способом построения графика (T_N - a) / N как функция N. У меня должна быть ошибка в определении

for jj=1:n
    ii=1:jj;
    g=[g 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed2(jj) = toc/jj; % This must be wrong, I think that I need to adjust to compute (T_N − a)/N
end

, чтобы вычислить

(T_N − a)/N as a function of N

Могу ли я внести поправку в код Matlab вышечтобы вычислить (T_N - a) / N в строке

telapsed2(jj) = toc/jj;

Я не уверен, как исправить свой код, чтобы эта строка вычисляла

slope = slope of computation per N summations
telapsed(jj)= (toc-slope)/n

Я мог бы бытьЯ могу добавить это в первом цикле for для f, но я не уверен, как.

Вопрос: Как я могу настроить свой код Matlab так, чтобы я мог успешно изменить вычисление с

T_N as a function of N

до

(T_N − a)/N as a function of N

1 Ответ

0 голосов
/ 25 января 2019

Я думаю, что нашел частичное решение.Первоначально я написал следующий код для построения графика T_N как функции N.

clear all;
n=50;
f=[];
telapsed = zeros(1,n);
tic
for jj=1:n
    ii=1:jj;
    f=[f 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed(jj) = toc;
end

hold on
plot(1:n,telapsed)
title('Time it takes to sum \pi using N summations')
xlabel('Number of summations (N)') 
ylabel('Total Time (T_N)')
p = polyfit(1:n,telapsed,1);
slope=p(1)      % slope of t_N = a + b*N or b
intercept=p(2)  % y-intercept or a

При запуске этой программы получается следующий график

enter image description here

где

slope = 1.3802e-05
intercept = 0.0021

т. Е.

T_N = a + b * N = 0,0021 + 1,3802e-05 * N

Для построения графика (T_N - a) / N как функция N, я внес следующие изменения

clear all;
n=50;
f=[];
telapsed = zeros(1,n);
tsum = zeros(1,n);
tic

for jj=1:n
    ii=1:jj;
    f=[f 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed(jj) = toc;
    psum = polyfit(jj,toc,n);
    pintercept = psum(2);
    tsum(jj) = (telapsed(jj)-pintercept)/jj;
end

hold on
plot(1:n,telapsed) % the plot for T_N as a function of N
plot(1:n,tsum) % the plot for (T_N - a)/N as a function of N
title('Time it takes to sum \pi using N summations')
xlabel('Number of summations (N)') 
ylabel('Total Time (T_N)')
legend('T_N as a function of N','(T_N - a)/N as a function of N')

p = polyfit(1:n,telapsed,1);
slope=p(1)      % slope of t_N = a + b*N or b
intercept=p(2)  % y-intercept or a

, что дает следующий график

enter image description here

IЯ ожидаю, что значение (T_N - a) / N приблизится к константе.Из приведенного выше графика ясно видно, что значение приближается к точке пересечения y.Математика покажет мне, что

T_N = a + b*N => (T_N-a)/N = b

Итак, похоже, что корректировка, сделанная для

for jj=1:n
    ii=1:jj;
    f=[f 4*sum( ((-1).^(ii+1))./(2.*ii-1)  )];
    telapsed(jj) = toc;
    psum = polyfit(jj,toc,n);
    pintercept = psum(2);
    tsum(jj) = (telapsed(jj)-pintercept)/jj;
end

, верна.

...