Autor Beitrag
der auenländer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

WIN XP
Delphi 6 PE
BeitragVerfasst: Mi 06.12.06 17:19 
hallo zusammen.
ich hab mal wieder ne frage.

das Ziel ists, pi zu bestimmen. dazu wird in der theorie ein kreisausschnitt mit gleichbreiten rechtecken gefüllt, die ihn einmal grade ausfüllen, und einmal überschneiden. daraus wird dann der mittelwert bestimmt (kreisfläche A) und dann kann pi mit der formel A/r²=pi bestimmt werden.

Beispiel:

wenn man mit 5 rechtecken in einem viertel kreis mit radius 100 arbeitet. die punkte der rechtecke, die den kreis berühren nennen wir mal P.

dann kann man P über die formel y=wurzel aus(r(redius)²-x²) (entsprechener punkt auf der x-achse) bestimmt werden.

die punkte der rechtecke die den kreis überdecken nennen wir mal Q. sie liegen also praktisch immer auf der höhe P des letzten x wertes.

also hat P die koordinaten:
P1(20|Wurzel(100²-20²))
P2(40|Wurzel(100²-40²))
P3(60|Wurzel(100²-60²))
P4(80|Wurzel(100²-80²))
P5(100|Wurzel(100²-100²))

und Q die koordinaten:

Q1(20|Wurzel(100²-0²))
Q2(40|Wurzel(100²-20²))
Q3(60|Wurzel(100²-40²))
Q4(80|Wurzel(100²-60²))
Q5(100|Wurzel(100²-80²))

daraus kann man dann die allgemeine formel für k streifen mit n streifen insgesamt ableiten:

Pk(K r/n | wurzel( r²-(K r/n)²)

Qk(K r/n | wurzel r²-((k-1)*r/n)²)

so, das war dan die einführung, sorry, is leider en bisschen lang geworden.

die anzahl n der streifen soll in ein editfeld eintragbar sein, ausgabe soll durch ein memofeld erfolgen.

zuersteinmal geht es nur darum, den flächeninhalt A zu bestimmen, wobei der radius 100 vorgegeben ist.

jetzt hab ich einfach mal lustig drauflos versucht, wusste aber schon nach kurzer zeit nicht mehr weiter.
hier mal mein bisheriger programmtext.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.BtStartClick(Sender: TObject);
var AInnen, AAussen, k, n, Pk : double;
    x : int;
begin
k:=StrToFloat(EStreifen.text);
  for x:=0 to k do
    begin
      Pk:=sqrt (100*100-(k*100/n)*(k*100/n))
    end;
end;


falls irgendeiner diesem wirren erklärungsversuch iregendwie folgen konnte würde ich ich über den ein oder anderen tip riesig freuen!!

schonmal danke!

jannik


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Mi 06.12.2006 um 16:28
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 06.12.06 17:29 
Ich hab das "damals" so gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  R, X, Y: Integer;
  KTreff:  Real;
  QTreff:  Real;
begin
  R := 10000;

  KTreff := 0;
  QTreff := sqr(2 * R + 1);

  for X := -R to R do
    for Y := -R to R do
      if sqr(X) + sqr(Y) <= sqr(R) then
        KTreff := KTreff + 1;

  Label1.Caption := FloatToStr(4 * KTreff / QTreff);
end;

(Nur so als Alternative; Schnelligkeit ist hier sekundär :lol:)

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 06.12.06 17:34 
Und wenn man bei dem Rechteck-Verfahren bleibt, dann kann man den Originalcode so modifizieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var AInnen, AAussen, k, Pk : double;
    x,n : integer;
begin
  n := StrToInt(EStreifen.text);
  Pk := 0;
  for x:=0 to n do
    begin
      Pk := PK +  (sqrt(100*100-(x*100/n)*(x*100/n)) *  100/n)
    end;
  showmessage(FloatToStr(PK * 4));   // * 4 du nimmst hier ja nur einen Viertelkreis!
end;

Ich hoffe, die Änderungen sind verständlich, ansonsten nachfragen. Und dass dabei nicht Pi, sondern etwas knapp über 30000 rauskommt, liegt am Radius 100 ;-)

_________________
We are, we were and will not be.
der auenländer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

WIN XP
Delphi 6 PE
BeitragVerfasst: Mi 06.12.06 19:58 
hi, danke!!

hab das jetzt mal so gebaut, das klappt soweit auch, aber mein wert für pi ist jetzt bei rund 2 :roll:

fällt irgendeinem vll zufällig der fehler auf? ich konnt da nämlich nichts finden, wodurch die rechnung so abgeändert wird, das da ein mehr bei rauskommt...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.BtStartClick(Sender: TObject);
var AInnen, AAussen, AGesamt, pi, k, Qk, Pk : double;
    n, x : integer;
begin
  Memo1.lines.clear();
   n:=StrToInt(EStreifen.text);
  Pk:=0;
  Qk:=0;
  for x:=0 to n do
    begin
      Pk:=Pk+(sqrt (100*100-(x*100/n)*(x*100/n))*100/n);
      Qk:=Qk+(sqrt (100*100-((n-1)*100/n)*((n-1)*100/n))*100/n);
    end;
   AInnen:=Pk*4;
   AAussen:=Qk*4;
   AGesamt:=(AInnen+AAussen)/2;
   pi:=AGesamt/10000;
   //Memo1.Lines.Add('AAussen'+FloatToStr(AAussen));
   //Memo1.Lines.Add('AInnen'+FloatToStr(AInnen));
   Memo1.Lines.Add('A='+FloatToStr(AGesamt)+' '+'pi='+FloatToStr(pi));
end;


danke,
der jannik
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 06.12.06 20:06 
Größerer Radius probiert?

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 06.12.06 20:08 
Probier mal so.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.BtStartClick(Sender: TObject);
var AInnen, AAussen, AGesamt, pi, k, Qk, Pk : double;
    n, x : integer;
begin
  Memo1.lines.clear();
   n:=StrToInt(EStreifen.text);
  Pk:=0;
  Qk:=0;
  for x:=0 to n do
      Pk:=Pk+(sqrt (100*100-(x*100/n)*(x*100/n))*100/n);
  for x:=1 to n+1 do
      Qk:=Qk+(sqrt (100*100-((x-1)*100/n)*((x-1)*100/n))*100/n);

   AInnen:=Pk*4;
   AAussen:=Qk*4;
   AGesamt:=(AInnen+AAussen)/2;
   pi:=AGesamt/10000;
   //Memo1.Lines.Add('AAussen'+FloatToStr(AAussen));
   //Memo1.Lines.Add('AInnen'+FloatToStr(AInnen));
   Memo1.Lines.Add('A='+FloatToStr(AGesamt)+' '+'pi='+FloatToStr(pi));
end;

_________________
We are, we were and will not be.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 06.12.06 21:44 
@Gausi: Deine Obersumme ist jetzt gleich der Untersumme.

So finde ich es sauberer und klarer:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
const
  R = 1;
  N = 100;
var
  i: integer;
  os, us, dx: Extended;
begin
  os := 0;
  us := 0;
  dx := R/n; // Breite der Rechtecke

  // Summe über Viertelkreis
  for i := 0 to n-1 do
  begin
    os := os + sqrt(sqr(R)-sqr(i*dx)) * dx; // Rechteck: Breite * Höhe
    us := us + sqrt(sqr(R)-sqr((i+1)*dx)) * dx;
  end;
  ShowMessage(Format('pi obersumme: %.4f'#13+
                     'pi untersumme: %.4f'#13+
                     'pi durchschnitt: %.4f',[4*os/sqr(R),4*us/sqr(R),4*(os+us)/2/sqr(R)]));
  // Ausgabe:
  // pi obersumme: 3.1604
  // pi untersumme: 3.1204
  // pi durchschnitt: 3.1404
end;

Das R kürzt sich natürlich gleich weg, kann man auch grad weglassen. Pi ist die Fläche im Einheitskreis, wieso also nicht grad die Berechnung am Einheitskreis?
der auenländer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

WIN XP
Delphi 6 PE
BeitragVerfasst: Do 07.12.06 17:01 
hey super! danke, jetzt klappts und ich komm auch auf 3,14... :D

bis denne,
jannik