Ранее я задавал этот вопрос, в котором упоминалось суммирование ряда для вычисления числа Пи по формуле
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](https://i.stack.imgur.com/iSo41.png)
Итак, этот код возвращает значения 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](https://i.stack.imgur.com/eNUki.png)
Это не может быть правильным способом построения графика (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