PI

Wie lässt sich die Kreiszahl Pi bestimmen?

Umfang

Eine alte Methode ist, den Kreis mit regelmäßigen Vielecken der Kantenanzahl 4,8,16,... zu beschreiben. Je größer die Anzahl der Ecken wird, desto besser die Annäherung an einen Kreis. Dabei kann man sich sowohl von innen, als auch von außen dem Kreis annähern. Angenommen wird nun ein Einheitskreis mit Radius=1. Kenn man die Kantenlänge für einen Innen Vieleck mit n Ecken, so läßt sich die Kantenlänge mit 2*n Ecken bestimmen. Da der Umfang des Kreises mit 2* Pi * r bestimmt wird kann man Pi = 1/2 * Umfang Vieleck bestimmen. Und der Umfang des Vielecks ist einfach die Kantenlänge man Anzahl der Ecken. Zur Berechnung der Kantenlänge gibt es eine Form, welche die neue Kantenlänge bei Verdoppelung der Ecken Anzahl aus der bestehenden Kantenlänge bestimmen kann:
x' = sqrt(2-sqrt(4 - x²))


oder noch einfacher geht es mit Trigonometie, aber da müßte man die Sinus Werte kennen oder deren Reihenentwicklung.
Ecken		Winkel		1/2 Kantenlänge=sin(Winkel)
4		45		0,707106781
8		22,5		0,382683432
16		11,25		0,195090322
32		5,625		0,09801714
64		2,8125		0,049067674
128		1,40625		0,024541229
256		0,703125	0,012271538


Eine einfache Methode, welche sich aber nur langsam dem richtigen Wert annähert. Die Probleme dabei sind:
  1. Je größer die Eckenanzahl wird, desto winziger wird die Kantenlänge. Das Produkt aus Eckenzahl und Kantenzahl nähert sich unendlich mal 0.
  2. Bald wird die Genauigkeit des Datentyp double nicht mehr ausreichend sein, um noch bessere Werte zu bestimmen.

Fläche

Eine andere sehr nette Methode ist es über die Fläche zu gehen: Die Kreisfläche ist Pi * r². Nimmt man nun ein Raster mit Kantenlänge 1 und zeichnet einen Kreis mit r>>1, dann braucht man nur die Punkte innerhalb des Kreises zu zählen und diese durch r² zu teilen und erhält damit einen Näherungswert für Pi. Von Hand und auch für den Computer kommt man schnell an Grenzen.
r	Pi
1	1.0
2	2.25
4	2.8125
8	3.015625
16	3.09765625
32	3.1298828125
64	3.136962890625
128	3.13897705078125
256	3.1411285400390625
512	3.141284942626953


Innen Kreis
1 a b x/2 x' U = 2 * Pi * r ; r=1 ; Pi = U/2
Näherungsverfahren für den Umfang U:
Wir starten mit einem Quadrat mit der Kantenlänge x und wir verdoppeln die Anzahl der Ecken. Nun gilt es dei Kantenlänge x' zu bestimmen:

x = sqrt(2)

a = sqrt(1-x²/4)
b = 1 - a
x' = sqrt(b² + x²/4)
x' = sqrt(1- 2a+a² + x²/4)
x' = sqrt(1- 2*sqrt(1-x²/4) + 1 -x²/4 + x²/4)
x' = sqrt(2- sqrt(4-x²))

Und für weiter Kantenanzahl gilt:
4 Ecken: Pi ~ 2 * x
8 Ecken: Pi ~ 4 * x'
16 Ecken: Pi ~ 8 * x'' ...
Aussen Kreis
1 x/2 x' c hier gilt:

x/2 / x' = x' / c
c = 2 * x'* x' / x

Und hier gilt:
4 Ecken: Pi ~ 2 * c
8 Ecken: Pi ~ 4 * c'
16 Ecken: Pi ~ 8 * c'' ...

Nilakantha series

Pi = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) - 4/(8*9*10) + 4/(10*11*12) - 4/(12*13*14) ...

John Machin

PI / 4 = 4 * arctan(1/5) - arctan(1/239)

Computer Berechnungen

den eigenen Computer rechnen lassen

Download class file and execute it like this: "java Pi"
Download Code listing

import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import java.math.BigInteger;

/**
 *
 * @author Rolf
 */
public class Pi {

    //--------------------------------------------------------------------------
    static String niceNumber(int x) {
        String NS = "                     " + x;
        int l = NS.length();
        return NS.substring(l - 12);
    }

	//--------------------------------------------------------------------------
	static String nice(double x) {
		String NS = x+"                           ";
        return NS.substring(0, 16);
    }


    //--------------------------------------------------------------------------
    static double doit(double x) {
      // return sqrt(2.0 - sqrt(4.0 - x * x));
        
      // improved formula with less errors summary 
         return x/sqrt(2.0 + sqrt(4.0 - x * x));    
    }

    //--------------------------------------------------------------------------

    public static void out(BigInteger X) {
        String s = X.toString();
        int n = s.length();
        for (int i = 0; i < n; i += 80) {
            int max = i + 81;
            if (max > n) {
                max = n;
            }
            System.out.println(s.substring(i, max));
        }
    }

    //--------------------------------------------------------------------------
    public static void main(String[] args) {
        System.out.println("start to calc PI");
        double pi, x,xx, PiOut;
        x = sqrt(2.0);
        System.out.println("   # corners  \tinner approx. PI\t\tquality\t\touter appox. Pi");
        for (int i = 2; i < 24; i++) {
			xx = doit(x);
			PiOut=	pow(2,i)*2.0*xx*xx/x;
			x=xx;
            pi = pow(2, i) * xx;
            System.out.println(niceNumber((int) pow(2, i + 1)) + 
					"\t" + nice(pi) + 
					"\t\t" + (int) Math.abs(Math.log10(Math.abs(Math.PI - pi))) +
					"\t\t" +nice(PiOut)
					);
        }
        System.out.println("\nreal Math.pi\t" + nice(Math.PI)+"\n\n");

        System.out.println("\n\nNilakantha series. ");
        System.out.println("calculat according to PI = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) - 4/(8*9*10) + 4/(10*11*12) - 4/(12*13*14) ...");
        /*
         Nilakantha series. 
         This is another infinite series to calculate pi that is fairly easy to understand. 
         While somewhat more complicated, it converges on pi much quicker than the Leibniz formula.
         π = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) - 4/(8*9*10) + 4/(10*11*12) - 4/(12*13*14) ...
         */
        BigInteger PI = new BigInteger("0");
        BigInteger b4 = new BigInteger("400000000000000000");
        BigInteger d2 = new BigInteger("0");
        BigInteger d3 = new BigInteger("0");
        BigInteger d4 = new BigInteger("2");

        int maxIter =5000;
        //X=X.add(b4).add(b4).add(b4); //   + 4/(2*4*4);
        for (int i = 1; i < maxIter; i++) {
            d2 = d4;
            d3 = d2.add(new BigInteger("1"));
            d4 = d3.add(new BigInteger("1"));
            PI = PI.add(b4.divide(d2.multiply(d3).multiply(d4)));

            d2 = d4;
            d3 = d2.add(new BigInteger("1"));
            d4 = d3.add(new BigInteger("1"));
            PI = PI.subtract(b4.divide(d2.multiply(d3).multiply(d4)));
            
        }
        System.out.println("maxIter = "+(2*maxIter)+" steps later:");
        System.out.print("\t\t3.");out(PI);
		System.out.println("according to wikipedia...");
        System.out.println("\t\t3,141592653589793238462643....");
    }
}
on Zotac

Rolf LANG - Remsstr. 39 - 71384 Weinstadt | 07:26:16 up 29 days, 9:53, 1 user, load average: 0.14, 0.13, 0.10