![]() |
MONTE-CARLO-METHODE
:(
hallo, ich soll für mein dämliches studium ein beleg schreiben in delphi, nur blöd wenn man das nie hatte... ich hba ma angefangen komm aba so richtig nich weiter wenn sich jmd damit auskennt, der möge sich bitte melden
Delphi-Quellcode:
danke
unit beleg;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; START: TButton; ENDE: TButton; x: TLabel; Edit5: TEdit; procedure ENDEClick(Sender: TObject); procedure STARTClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} FUNCTION FKT(a,b,n,x:real):real; begin fkt:=a*exp (- x); end; procedure TForm1.ENDEClick(Sender: TObject); begin close end; procedure TForm1.STARTClick(Sender: TObject); var a,b,n,fi,x,y1,ymax: real; fc,i,int: integer; begin if (a<1) then begin messagedlg( 'untere grenze a muss groesser 1 sein!', mtError,[mbOK],0); Edit1.text:='a'; Edit1.setfocus; exit; end; if (b<=a) then begin messagedlg( 'obere grenze b muss groesser untere grenze a sein!', mtError,[mbOK],0); Edit2.text:='b'; Edit2.setfocus; exit; end; begin int :=Random(100); if (int>a) and (int<b)then begin y1:= a*exp(int)-int; end; begin i :=Random(100); if (i>=0) and (i<ymax) and (i<=y1)then begin i:=1+random(100); end; a:= StrToInt(Edit1.Text); x:= StrToInt(Edit5.Text); b:= StrToInt(Edit2.Text); n:= StrToInt(Edit3.Text); ymax:=a*exp(b)-b; fi:=(b-a)*ymax/n; Edit4.Text := FloatToStr(fi); end; end. [edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit] |
Könntest du uns eventuell einen kleinen Tipp geben, damit wir wemfalls den Hauch einer Chance haben dir zu helfen? :roll:
Ein Tipp in form von: Was soll das Programm machen? Was macht dein Code statt dessen? Kommt eine fehlermeldung? Wenn ja welche? Und eventeull noch eine kleine Beschreibung, was die MONTE-CARLO-METHODE eigentlich ist. |
Hallo vicii,
zunächst einmal herzlich willkommen im Delphi-PRAXIS Forum. Wir können dir sicher helfen. Ein Studium ist doch in der Regel freiwillig, wie kann es denn dann dämlich sein? Doch nur, wenn du ein dämliches Studium gewählt hast. :mrgreen: Also nun zu deinem Beleg: Kannst du die Aufgabe etwas genauer schildern? Und wo liegt im abgedruckten Code das Problem? |
Moin Luckie,
John von Neumanns Monte-Carlo-Methode ist ein Verfahren zu Berechnung von Flächeninhalten unregelmässig begrenzter Flächen. Hierzu wird diese Fläche mit einer leicht berechenbaren Begrenzung umgeben (z.B. ein Rechteck). Anschliessend werden über diesen Fläche dann zufällig (daher Monte-Carlo Methode (wegen des Casinos)) Punkte verteilt. Dann/dabei werden die Punkte innerhalb der zu berechnenden Fläche gezählt (ob die Begrenzung mit dazugerechnet wird ist defninitionssache), sowie natürlich die Gesamtzahl der verteilten Punkte. Die Anzahl Punkte in der Fläche verhalten sich dann zur Gesamtzahl der Punkte wie der Flächeninhalt zum Gesamtflächeninhalt. Es lässt sich jetzt also über einen Dreisatz ganz leicht der unbekannte Flächeninhalt berechnen. Die Genauigkeit hängt natürlich ganz extrem von der Anzahl der gesetzten Punkte ab. |
ohh is das alles super
so viel hilfe! also hier ma die konkrete aufgabe eine technik zu rberechnung der fläche unter einer kurve ist die monte-carle-methode mit zufallszahlen. die kurve y=f(x) sei für einen wert x innerhalb der angegebenenen oberen und unteren grenzen poritiv. der größte wert von y in diesen grenzen soll y max sein. die m-c-methode läuft folgendermaßen ab: 1)setzen eines zählers auf null 2)erzeugen einer zufallszahl xz deren wert innerhalb der grenzen a und b liegt 3)berechnung von f(xz) 4)erzeugung einer zweiten zufalklszahl yz deren wert zw. 0 und ymax liegt. 5)vergleichen von yz und y(xz). wenn yz kleiner oder gleich y(xz) ist, dann liegt dieser punkt unter oder auf der kurve, und der zähler wird um 1 erhöht. 6)n-malige wiederholung der schritte 2 bis 5. n ist eine eingabegröße und sollte ziemlich groß gewählt werden, 7)nach ausführung der vorg. zyklusanzahl erfolgt die bestimmung des bruchteils f von punkten, di eauf oder unter der kurve liegen, und die ermittlung der fläche. f=zähler/zyklusanzahl und a=Fymax(b-a) schreiben sie eine routine, die diese strategie realisiert. testen sie die routine in einem programm mit der fkt. y=ae*-x mit a >1. jo das is alles und es wär mächtig nett wenn ihr mir helfen könntet DANKE sagt vici |
Na bitte, damit läßt sich doch schon mal was anfangen.
|
WAHHHHHHNSINNNNNNN!
also ich danke jetzzzz schonma, auch wenns nix wird.... :D |
Moment nicht zu früh freuen. Mein Kommentar bezog sich auf das Posting von Christian. Durch deinen Aufgabentext steige ich eigentlich nicht durch.
Aber so viel habe ich schon gesehen: Du benutzt Random() ohne zuvor den Zufallsgenerator von Delphi mit Randomize initialisiert zu haben. Könntest du evnetuell auch etwas genauer werden, was bei deinem Code nicht klappt? |
also ne fehlermeldung kommt nur beim letzten end.
keine ahnung warum jo wo setz ich randomize ein? und wie krieg ichs programm dazu, dass i#die schritte wiederholt werden falls ein zuallswert nicht in den grenzen liegt? |
Hallo und herzlich Willkommen im Forum!
Zitat:
Zitat:
Grüsse, Daniel :hi: |
Delphi-Quellcode:
So läuft das Ding zu mindest schon mal. Ob es stimmt oder nicht, das sagt dir das Licht.
function FKT(a, b, n, x: real): real;
begin fkt := a * exp(-x); end; procedure TForm1.STARTClick(Sender: TObject); var a, b, n, fi, x, y1, ymax: real; i, int: integer; begin a := StrToFloat(Edit1.Text); if (a < 1) then begin messagedlg( 'untere grenze a muss groesser 1 sein!', mtError, [mbOK], 0); Edit1.setfocus; exit; end; b := StrToFloat(Edit2.Text); if (b <= a) then begin messagedlg( 'obere grenze b muss groesser untere grenze a sein!', mtError, [mbOK], 0); Edit2.setfocus; exit; end; for i := 0 to 100 do begin int := Random(100); if (int > a) and (int < b) then begin y1 := a * exp(int) - int; end; end; a := StrToInt(Edit1.Text); x := StrToInt(Edit5.Text); b := StrToInt(Edit2.Text); n := StrToInt(Edit3.Text); ymax := a * exp(b) - b; fi := (b - a) * ymax / n; Edit4.Text := FloatToStr(fi); end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize(); end; [edit=Daniel B]Doppel-Post gelöscht. MfG Daniel B.[/edit] |
huhu daniel,
tjo es hapert ja schon daran, dass ich ncih ma weiß wo oncreate is.... hehe oh mann bin ich dumm |
Hi,
du klickst an irgendeiner stelle auf das Formular oder wählst links im Objektinspektor (Fenster mit den Eigenschaften der Objekte) Form1 aus. Dann klickst du im Objektinspektor auf die Lasche Ereignisse. Jetzt muss du nur noch einen Doppelklick in die Combobox neben dem Ereigniss OnCreate machen. Schon bist du in der Ereignis-Procedure. Und dort tippst du jetzt zwischen Begin und End
Delphi-Quellcode:
ein
randomize;
MFG Thomas |
ohh danke danke danke
danke herzlichen dank.... irgendwie rechnet er was.... obs stimmt weiß ich selber nicht aba es is TOLL |
Noch mal ein paar Dinge, die mir aufgefallen sind:
Mehr kann ich dir im Moment auch nicht helfen. Der Rest ist nur die Umsetztung des Algorithmuses und das hat mehr mit Mathematik und Logik als mit Delphi zu tun. |
also programmiern is nich meine stärke
habe heute damit angefangen neben mir leigt die aufgabe und ein lustiges delphi buch mehr hab ich nich, kein grundwissen, nix und trotzdem scheints zu funktioniern hehe, ich bin mächtig stolz auf mich...und danke für die hilfe momentan siehts so aus
Delphi-Quellcode:
mfg
unit beleg;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; START: TButton; ENDE: TButton; x: TLabel; Edit5: TEdit; procedure ENDEClick(Sender: TObject); procedure STARTClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.ENDEClick(Sender: TObject); begin close end; FUNCTION FKT(a,b,n,x:real):real; begin fkt:=a*exp (- x); end; procedure TForm1.STARTClick(Sender: TObject); var a,b,n,fi,x,y1,ymax: real; fc,i,int: integer; begin a := StrToFloat(Edit1.Text); b := StrToFloat(Edit2.Text); if (a<1) then begin messagedlg( 'untere grenze a muss groesser 1 sein!', mtError,[mbOK],0); Edit1.setfocus; exit; end; if (b<=a) then begin messagedlg( 'obere grenze b muss groesser untere grenze a sein!', mtError,[mbOK],0); Edit2.setfocus; exit; end; for i := 0 to 100 do begin int := Random(100); if (int > a) and (int < b) then begin y1 := a * exp(int) - int; end; end; begin i :=Random(100); if (i>=0) and (i<ymax) and (i<=y1)then begin i:=1+random(100); end; a:= StrToInt(Edit1.Text); x:= StrToInt(Edit4.Text); b:= StrToInt(Edit2.Text); n:= StrToInt(Edit3.Text); ymax:=a*exp(b)-b; fi:=(b-a)*ymax/n; Edit5.Text := FloatToStr(fi); Edit5.Text:= Format('A= %10.3f FE',[fi]); end; end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; end; end. [edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit] [edit=Luckie]War kaputt. Und mIchael hat es wieder heile gemacht. Mfg, Luckie[/edit] |
Ich farge dich noch mal. Was soll das bitte sehr geben?
Delphi-Quellcode:
Warum werden a und b noch mal die Werte aus den Edits zugewiesen? Nur diesmal nicht in ein Float, sondern in ein Integer kovertiert.
a:= StrToInt(Edit1.Text);
...; b:= StrToInt(Edit2.Text); Und y1 wird immer noch nicht benutzt aber berechnet. Was soll das? Kleiner Tipp: Schalt mal den Rechner aus, nimm dir Papier und Bleistift und schreib dir mal in Worten auf, was da passieren soll und zeichne dir das ganze mal grafisch mit einem Flußdiagramm oder so auf. Dann setzt du dich hin und programmierst das noch mal von vorne und laß erstmal alle Sicherheitsabfragen weg, das macht das ganze etwas übersichtlicher. Wenn du das dann hast, kannst du dich um die Feinheiten kümmern. |
tjo wie´s aussieht, gibtz keinerlei fehlermeldungen. aba irgendwie kommtz mir so vor, als ob immer die gleiche zufallszahl kommt und die anweisung nicht wiederholt wir für for i:=1 to n do. wobei n ne eingabegröße is....
Delphi-Quellcode:
[Edit=Sakura]DELPHI-Tags eingefügt. BITTE IN ZUKUNFT SELBST MACHEN! MfG.[/Edit]
unit montecarlo;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; START: TButton; ENDE: TButton; procedure ENDEClick(Sender: TObject); procedure STARTClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.ENDEClick(Sender: TObject); begin close end; procedure TForm1.STARTClick(Sender: TObject); var a,b,d,fi,f,xz,yxz,yz,ymax: real; zaehler,i,n:integer; begin a:=StrToFloat(Edit2.Text); b:=StrToFloat(Edit3.Text); n:=StrToInt(Edit4.Text); d:=b-a; ymax:=a*exp(b)-b; zaehler:=0; xz:= Random; yxz:=a*exp(xz)-xz; for i:=1 to n do begin zaehler:=0; randomize; xz:=Random; if (xz>a) and (xz<b) then yxz:=a*exp(xz)-xz; randomize; yz:=Random; if (yz<=yxz) then zaehler:=zaehler+1; end; f:=zaehler/n; fi:=(ymax*f*d)/n; Edit5.Text := FloatToStr(fi); Edit5.Text:= Format('= %10.2f FE',[fi]); end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; end; end. |
Randomize darfst du nur einmal auf rufen und schon gar nicht innerhalb einer Schleife kurz vor Random.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz