der auenländer - Mi 06.12.06 17:19
Titel: pi-bestimmung
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.
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
Christian S.: Topic aus VCL (Visual Component Library) verschoben am Mi 06.12.2006 um 16:28
Gausi - Mi 06.12.06 17:34
Und wenn man bei dem Rechteck-Verfahren bleibt, dann kann man den Originalcode so modifizieren:
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)); 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 ;-)
der auenländer - 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...
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('A='+FloatToStr(AGesamt)+' '+'pi='+FloatToStr(pi)); end; |
danke,
der jannik
delfiphan - Mi 06.12.06 21:44
@Gausi: Deine Obersumme ist jetzt gleich der Untersumme.
So finde ich es sauberer und klarer:
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; for i := 0 to n-1 do begin os := os + sqrt(sqr(R)-sqr(i*dx)) * dx; 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)])); 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?