Longitud de una Circunferencia: Aproximación Numerica Iterativa

La ecuación general de una circunferencia centrada en el punto y de radio r es
.
Su longitud es conocida y vale . Queremos aproximar esta longitud por el perímetro del polígono de n lados inscrito en ella.

Aproximación iterativa

Podemos ilustrar la idea con la siguiente figura:

Generación de los puntos del polígono inscrito

Vamos a usar cordenadas polares para generar los puntos sobre la circunferencia:
con
r = 1;
numPoints = 10;
ang=0;
pasAng=2*pi/numPoints;
for i = 1:numPoints
x(i) = r*cos(ang);
y(i) = r*sin(ang);
ang=ang+pasAng;
end
points=[x',y'];
points=[points;x(1),y(1)]; %para cerrar el polígono
% Dibujar el polígono inscrito
angC=0:0.05:2*pi; %tomamos más puntos para dibujar la circunferencia
xx=cos(angC);
yy=sin(angC);
xx=[xx,xx(1)]; % cerramos la circunferencia
yy=[yy,yy(1)];
plot(xx,yy,'b'); %dibujamos la circunferencia
hold on;
plot(points(:,1), points(:,2),'r'); %dibujamos el polígono
hold off;
axis equal
Ahora calculamos el perímetro del polígono sumando la longitud de sus aristas.
Cada arista entre los puntos tiene longitud:
perimeter = 0;
for i = 1:numPoints
perimeter = perimeter+norm(points(i+1,:)-points(i,:));
end

Comprovación del error

Finalmente, el error obtenido para nuestra aproximación es:
actualLength = 2*pi*r;
absError = abs(perimeter-actualLength);
relError = absError/actualLength;
fprintf('nPoints= %d, perimetro = %e, absErr= %e, relErr= %e \n',numPoints,perimeter,absError,relError);
nPoints= 10, perimetro = 6.180340e+00, absErr= 1.028454e-01, relErr= 1.636836e-02

Ejercicio 1:

Construir una función que devuelva una matriz con las coordenadas de los puntos del polígono inscrito a partir del radio y el número de puntos.
function points = generatePolygonPoints(r,numPoints)

Ejercicio 2:

Experimentar con distinto número de puntos para ver cómo mejora la aproximación.

Ejercicio 3: Aproximar la longitud de la circunferencia hasta una determinada precisión.

La cuestión es ahora calcular la longitud de la circunferencia hasta una determinada precisión. La pregunta es cuantos puntos debe tener el polígono inscrito para que su perímetro sea una aproximación suficiente de la longitud de la circunferencia?
Para esto se debe usar una modificación del script anterior, siguiendo los pasos:
Paso 1: Definir una variable de la tolerancia en el cálculo, tol = 1.e-5
Inicializar la variable del número de puntos numPoints, por ejemplo a 8.
Paso 2: Usar un bucle while hasta que el absError sea menor que la tolerancia
while(absError > tol)
generar los puntos
calcular el perímetro actual
calcular el absError
incrementar numPoints
end
Paso 3:
Mostrar por pantalla los valores calculados para cada valor de numPoints
Solución= For radious r = 10 and tol = 1.e-5, numPoints= 3215 are needed