Approximating Pi using a series

조회 수: 11 (최근 30일)
Chewystein
Chewystein 2017년 9월 9일
댓글: Jose Marques 2017년 9월 9일
So I have no idea where to start. The problem is approximating pi using (-1^(n+1))*((x^(2*n-1))/(2*n-1)) and the first 10 values in the series. Here is what I have:
function y=f(x)
y=(-1^(n+1))*((x^(2*n-1))/(2*n-1));
end
x=0;
z=10;
N=1000000;
sum=0;
deltax=(z-x)/N;
for i=1:N;
xeval1=x+(i-1)*deltax;
xeval2=x+(i)*deltax;
sum=sum+0.5*(f(xeval1)+f(xeval2))*deltax;
end
fprintf('The approximate vaule of pi %15.10f.\n',sum)
I also have to do this using Machin's formula with the first 10 values in a power series

답변 (2개)

Jose Marques
Jose Marques 2017년 9월 9일
PI=0;
N=10; %qty of elements in the serie
v=zeros(N+1,1);
for n=0:N
PI=PI+4*(((-1)^n)/(2*n+1));
v(n+1)=PI;
PI
end
  댓글 수: 1
Jose Marques
Jose Marques 2017년 9월 9일
function [y] = f(x,n)
y=(-1^(n+1))*((x^(2*n-1))/(2*n-1));
end
I forgot the function

댓글을 달려면 로그인하십시오.


John D'Errico
John D'Errico 2017년 9월 9일
편집: John D'Errico 2017년 9월 9일
Ok. So you made an effort. Not terrible, but there are some problems.
NEVER use a variable named sum. If you do, then the function sum is now useless.
Next, it looks like your function f(x) tries to return the nth term of the atan function.
http://mathworld.wolfram.com/MachinsFormula.html
https://www.craig-wood.com/nick/articles/pi-machin/
It will not work correctly, because you never pass in the value of n. Instead, try this:
machterm = @(x,n) (-1).^(n+1).*((x.^(2*n-1))./(2*n-1));
Note that I was careful to put parens around -1 there. There is a difference between -1^4 and (-1)^4.
So Machin's formula tells us that
4*atan(1/5) - atan(1/239)
is pi/4. Lets first see if the formula computes accurate values of the arctan.
atan(1/5)
ans =
0.197395559849881
sum(machterm(1/5,1:10))
ans =
0.197395559849881
machterm(1/5,1:10)
ans =
Columns 1 through 6
0.2 -0.00266666666666667 6.4e-05 -1.82857142857143e-06 5.68888888888889e-08 -1.86181818181818e-09
Columns 7 through 10
6.30153846153847e-11 -2.18453333333334e-12 7.71011764705883e-14 -2.75941052631579e-15
As you can see, machterm is set up so that we can generate all the terms at once.
4*sum(machterm(1/5,1:10)) - sum(machterm(1/239,1:10))
ans =
0.785398163397448
pi/4
ans =
0.785398163397448
As you can see, it does a pretty good job of approximating pi/4.
I suppose, given that this is homework, you are not allowed to use the vectorized solution I give here. But nothing stops you from using a loop.
machterm = @(x,n) (-1).^(n+1).*((x.^(2*n-1))./(2*n-1));
at1 = 0;
at2 = 0;
for n = 1:10
at1 = at1 + machterm(1/5,n);
at2 = at2 + machterm(1/239,n);
end
piapprox = (4*at1) - at2; % yielding pi/4
piapprox = 4*piapprox
piapprox =
3.14159265358979
pi
ans =
3.14159265358979
As you can see, it did well, as we would expect.
How might you build a direct power series approximation for pi? I would note that atan(1)=pi/4. This is the classic, basic series solution. We can test that by:
atan(1)*4
ans =
3.14159265358979
So, now just use
4*sum(machterm(1,1:10))
ans =
3.0418396189294
>> 4*sum(machterm(1,1:100))
ans =
3.13159290355855
>> 4*sum(machterm(1,1:1000))
ans =
3.14059265383979
>> 4*sum(machterm(1,1:10000))
ans =
3.14149265359003
>> 4*sum(machterm(1,1:100000))
ans =
3.14158265358979
>> 4*sum(machterm(1,1:1000000))
ans =
3.14159165358978
>> 4*sum(machterm(1,1:10000000))
ans =
3.14159255358974
As you can see, even taking 10 million terms in the simple power series for atan(1), we get a pretty darn poor approximation for pi. But that series converges quite slowly, so what can you expect?

카테고리

Help CenterFile Exchange에서 Linear Algebra에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by