Autor Beitrag
n-regen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202
Erhaltene Danke: 2



BeitragVerfasst: Di 03.02.09 17:51 
Hallo!

Ich soll für Physik ein Programm schreiben, das eine harmonische Schwingung simuliert (also eine Wertetabelle mit den Ergebnissen der Formeln weiter unten erstellt).
Das ganze Drumherum (Graph, Wertetabelle...) funktionieren, aber meine Funktionen spucken völlig realitätsfremde (weil exorbitant hohe) Werte aus.
Das sind meine Funktionen:
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:
26:
27:
function TForm1.a(t:double):double;
begin
 if arresults[round(t / strtofloat(eddt.Text))].a = -1 then begin
  result := -1 * strtofloat(edk.Text) * x(t) / strtofloat(edm.text);
  a2ar(t, result);
 end else result := arresults[round(t / strtofloat(eddt.Text))].a;
end;
/////
function TForm1.v(t:double):double;
begin
 if arresults[round(t / strtofloat(eddt.Text))].v = -1 then begin
  if t = 0
  then result := 0
  else result := v(t-strtofloat(eddt.Text)) + (a(t-strtofloat(eddt.Text)) * strtofloat(eddt.Text));
  v2ar(t, result);
 end else result := arresults[round(t / strtofloat(eddt.Text))].v;
end;
/////
function TForm1.x(t:double):double;
begin
 if arresults[round(t / strtofloat(eddt.Text))].x = -1 then begin
  if t = 0
  then result := edx0.Value
  else result := x(t-strtofloat(eddt.Text)) + ( ( ( v(t-strtofloat(eddt.Text)) + v(t) ) / 2) * strtofloat(eddt.Text) );
  x2ar(t, result);
 end else result := arresults[round(t / strtofloat(eddt.Text))].x;
end;

Die 2ar-Funktionen schreiben die Ergebnisse in die Wertetabelle, arResults ist die Wertetabelle (ein Array of Record mit den Werten t, a, v, und x) und ed* sind Edits mit den Eingabewerten:

  • eddt(Zeitschritte): 0,5;
  • edm(Masse des schwingenden Gewichts): 1;
  • edk(Federhärte): 5;
  • edx0(Startauslenkung des Pendels): 1;
  • edn(Interationsanzahl): 240)

Die Berechnung wird gestartet, indem x(eddt.Text*edn.Text) aufgerufen wird.
Fehler treten keine auf, aber es werden folgende x-Werte ausgegeben:
ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
0=1
0,5=0,375
1=-1,109375
1,5=-2,134765625
2=-1,132568359375
2,5=1,91171264648438
3=4,46902847290039
3,5=3,03838109970093
4=-3,08439725637436
4,5=-9,17841551452875
5=-7,6081757908687
5,5=4,45368349866476
6=18,4871004708257
6,5=18,1825274620551
7=-5,040563004766
7,5=-36,4773812573928
8=-41,9654843461703
8,5=1,57320356727908
9=70,3570669675355
9,5=94,1845112835327
10=15,1734691926124
10,5=-132,186310695899
11=-206,413064644856
11,5=-69,0152090058414
12=240,525317664859
12,5=442,872026423673
13=218,095395127155
13,5=-419,785874638631
14=-931,610594709744
14,5=-598,812521438123
15=690,499999425914
15,5=1922,50784654758
16=1521,38578993582
16,5=-1032,16978947808
17=-3891,48536917805
17,5=-3673,51647471795
18=1272,57857217715
18,5=7719,25980816026
19=8546,04205643248
19,5=-792,989360665761
20=-14977,6787126182
20,5=-19305,7005187682
21=-2206,61030530165
21,5=28337,6741732085
22=42550,0437342769
22,5=12457,5896031669
23=-52014,6353638454
23,5=-91763,7067304337
24=-41651,3142880974
24,5=91845,4662908207
25=193970,901868037
25,5=117461,107345967
26=-153693,692934855
26,5=-402203,127222622
27=-303277,048911966
27,5=236574,139482808
28=818114,646270806
28,5=740474,661962795
29=-311283,639991217
29,5=-1631286,33067746
30=-1737182,78969579
30,5=262213,951519173
31=3183466,21659452
31,5=3951168,3765988
32=259723,915857265
32,5=-6063528,22766932
33=-8759402,67631336
33,5=-2190945,30996824
34=11221479,5478029
34,5=18989820,5069274
35=7876098,93184542
35,5=-20028822,2924695
36=-40338291,4163944
36,5=-22918314,4722793
37=34037041,1522568
37,5=84043192,601807
38=60249197,9550673
38,5=-53727540,7897187
39=-171780315,262848
39,5=-148890679,703123
40=74418327,7103339
40,5=344272555,119283
41=352444980,759722
41,5=-74831053,5242177
42=-675615792,330348
42,5=-807371252,477374
43=-12259809,6195746
43,5=1295121047,04882
44=1800713630,32393
44,5=371409540,241079
45=-2415471531,44491
45,5=-3924813858,6285
46=-1471477817,01622
46,5=4354540521,87402
47=8378644670,22813
47,5=4444508073,51839
48=-7504098988,03292
48,5=-17540461728,0127
49=-11923974020,4639
49,5=12107786029,8827
50=36024663574,3426
50,5=29858760116,1616
51=-17484283148,5844
51,5=-72561374518,0662
52=-71359929845,8914
52,5=19792330053,7569
53=143174339823,489
53,5=164702180919,943
54=-6192803448,24879
54,5=-276156148736,249
55=-369651398908,938
55,5=-59516931803,3853
56=518847741997,37
56,5=810130659426,884
57=270802075966,24
57,5=-944109467115,107
58=-1738203890728,41
58,5=-855852465689,518
59=1647784182110,58
59,5=3656463507147,52
60=2349988026398,14
60,5=-2710519662817,27
61=-7545695079270,73
61,5=-5970736281919,18
62=4051992116176,05
62,5=15273935617860,7
63=14417174285772,4
63,5=-4996530736086,61
64=-30298137976499,3
64,5=-33540577271545,8
65=3116180463435,89
65,5=58788186203486,3
66=75769962776710,3
66,5=8652896237311,49
67=-111228457185851
67,5=-167000085016176
68=-48878873970234,5
68,5=204166686442214
69=360157364059675
69,5=163445510113456
70=-360518140190971
70,5=-761311396696950
71=-460961192647980
71,5=603309379741572
72=1,57861233519763E15
72,5=1,19021421881668E15
73=-928700493823205
73,5=-3,21106128458402E15
74=-2,90607096384032E15
74,5=1,22212701216859E15
75=6,40278995797233E15
75,5=6,81787979743799E15
76=-1,0299489602278E15
76,5=-1,249523449115E16
77=-1,5507280364961E16
77,5=-1,01775445370272E15
78=2,37999182192204E16
78,5=3,4378738538695E16
79=8,59589838447243E15
79,5=-4,40460898467298E16
80=-7,45317084140211E16
80,5=-3,09062030683432E16
81=7,86179969538124E16
81,5=1,5832232579755E17
82=8,99389529216858E16
82,5=-1,33607719153701E17
83=-3,29861412334078E17
83,5=-2,36446898334593E17
84=2,1091030983281E17
84,5=6,74227885813828E17
85=5,84334089515697E17
85,5=-2,92160941363388E17
86=-1,35126418983767E18
86,5=-1,38322673131129E18
87=2,93867552933189E17
87,5=2,65181132366397E18
88=3,16870579652153E18
88,5=4,77770692631485E16
89=-5,08345344911066E18
89,5=-7,06738623007978E18
90=-1,45704421155487E18
90,5=9,48106683299169E18
91=1,54041637391402E19
91,5=5,77399153770633E18
92=-1,70925277117567E19
92,5=-3,28849618524382E19
93=-1,74414650154979E19
93,5=2,94560486139024E19
94=6,88444474943E19
94,5=4,67950363070711E19
95=-4,75290522560148E19
95,5=-1,41394380851011E20
96=-1,17182563754116E20
96,5=6,86398437209834E19
97=2,8480145121679E20
97,5=2,80062249376489E20
98=-7,77167653346122E19
98,5=-5,61961707571886E20
99=-6,46407604242598E20
99,5=2,43773189707421E19
100=1,08393117047899E21
100,5=1,45079221608116E21
101=2,33451145083231E20
101,5=-2,03654202664244E21
102=-3,17960339739361E21
102,5=-1,06257387812224E21
103=3,70581643834653E21
103,5=6,82218015467512E21
104=3,35854600036518E21
104,5=-6,46804200084495E21
105=-1,43511950017552E22
105,5=-9,22232487604039E21
106=1,06399951732967E22
106,5=2,96162712868486E22
107=2,34323808628097E22
107,5=-1,59069171547657E22
108=-5,99496299898685E22
108,5=-5,6582000859575E22
109=1,96178975516207E22
109,5=1,18920360530288E23
110=1,31636412207762E23
110,5=-1,22455190760448E22
111=-2,30746758567175E23
111,5=-2,97377824531293E23
112=-3,39310260588683E22
112,5=4,36583804032407E23
113=6,55440647890221E23
113,5=1,91782209296392E23
114=-8,0139051503907E23
114,5=-1,41355804828536E24
115=-6,41382729453879E23
115,5=1,41513057546462E24
116=2,98805147662641E24
116,5=1,8089835952313E24
117=-2,36823120607488E24
117,5=-6,19591625060382E24
118=-4,67100913470858E24
118,5=3,64572634700691E24
119=1,26032635710359E25
119,5=1,14051820962882E25
120=-4,79817792053715E24

Eigentlich sollte alle paar Sekunden wieder der gleiche Wert rauskommen.

Könnt ihr irgendwo einen Fehler in meinen Funktionen oder meinen Eingabewerten finden (ich habe jedenfalls erfolglos ausprobiert, was man anders machen könnte)?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 03.02.09 19:42 
Falls es kein Fehler im Code ist hast du dt einfach (viel!) zu grob gewählt. Das ist das typische Verhalten von expliziten Integrationsmethoden. Dass es bei dt=0.5 nicht klappt, erstaunt mich jedenfalls nicht ;) vor allem, wenn du zweifach integrierst...
n-regen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202
Erhaltene Danke: 2



BeitragVerfasst: Di 03.02.09 20:33 
Mit dt = 0,01 funktioniert es aber auch nicht (und da gibt es irgendwo einen ziemlich unschönen Rundungsfehler).
Die 0,5 sind noch vom letzten Projekt - einem simulierten Fallschirmsprung - das allerdings funktioniert hat. Von dieser Simulation habe ich auch das gesamt Programm übernommen und nur die Formeln angepasst.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 03.02.09 21:31 
Ohne funktionierenden/vollständigen Code wird's schwer. Ich weiss weder was a2ar, v2ar, x2ar tun noch versteh ich, weshalb edx0.Value von Typ Double ist, wenn es ein Edit ist. Die vielen ifs machen den Code auch nicht lesbarer.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mi 04.02.09 15:25 
Hallo,

Deine Schrittweite ist immer noch viel zu groß.
Ausserdem kann man die Berechnung leicht zusammenfassen.
Dieses ständige StrToFloat und umgekehrt ist ja ein Graus...
Ich habe das mal hier zu verdeutlichen versucht:

EDIT: Eine Version mit Heun und Runge-Kutta
ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
program Schwingung;
{$apptype console}

type
  tParameter = record
                 masse,      //Masse in Kg               //C Kondensator=Masse
                 C,          //Federkonstante in N/m     //Spule= Feder
                 cm,         //Zusammenfassung zu einem Term c/m //L/C
                 //b,          //Stoßdämpfer ~Geschwindigkeit // Widerstand
                             // hier ungedämpfte Schwingung
                 h :double; //Zeitschritt
               end;

  Tresults  = record
                 x,          //Momentane Auslenkung      //Ladung-> Spannung U= C*Q(=x)
                 v,          //Momentane Geschwindigkeit //Strom -> Spannung U=R*I(=v) mit Widerstand
                 a,          //Momentane Beschleunigung  //Änderung des Stroms U =-L*di/dt(=a)
                 t : double; //Gesamtzeit
              end;
const
  g = 9.81; //Erdbeschleunigung m/s^2

 // Es müsste dann bei einer ungedämpften Schwingung wieder die Startwerte erreicht werden
 // also X = 1,v= 0  und a = -5 das lässt sich besser kontrollieren
  MaxZeit = 85*2*Pi/sqrt(5);// Das sind 85 Schwingungen = 238.8437 Sekunden

function Energie(const inWerte: TResults;var Parameter:tParameter):double;
begin
   with Parameter do
     result := 0.5*(sqr(inWerte.v)*masse+sqr(inWerte.x)*C);
end;

function deltaVektor(const inWerte: TResults;var Parameter:tParameter):tResults;
//Hier passiert die eigentliche Berechnung der Werte
//praktisch die Aenderungswerte für die einzelnen Anteile
begin
  with Parameter do
    begin
    result.a :=  -inWerte.x*cm;//+g //Federkraft+GewichtsKraft (Kraft= m*a => a =x*C/Masse)
                               // (-) weil Federkraftrichtung entgegen dem zusammendrücken wirkt
    result.v :=  result.a;     //Geschwindigkeitsänderung durch Beschleunigung
    result.x :=  inWerte.v     //Wegänderung durch Geschwindigkeit
    end;
end;

function NextStep(const inWerte,dVektor : TResults;var Parameter:tParameter):tResults;
//Aus Ursprungswerten und Aenderungswerten den neuen Wert bestimmen
begin
  with Parameter,dVektor do
    begin
    result.a :=  dVektor.a;
    result.v :=  inWerte.v + dVektor.v*h;
    result.x :=  inWerte.x + dVektor.x*h;

    result.t :=  inWerte.t +   h;
    end;
end;

function EulerCauchy(const inWerte: TResults;var Parameter:tParameter):tResults;
var
  deltaV: TResults;
begin
  deltaV := deltaVektor(inWerte,Parameter);
  result := NextStep(inWerte,deltaV,Parameter)
end;

function Heun(const inWerte: TResults;var Parameter:tParameter):tResults;
var
  deltaV  : TResults;
  Zwischenschritt :TResults;
  f  : double;
begin
  f := Parameter.h;
  //Punkt in der Mitte des Intervals
  Parameter.h := f*0.5;
  deltaV := deltaVektor(inWerte,Parameter);
  Zwischenschritt:=NextStep(inWerte,deltaV,Parameter);
  //Steigungen in der Mitte
  Parameter.h := f;
  deltaV := deltaVektor(Zwischenschritt,Parameter);
  //Neuer Punkt mit Steigung in der Mitte rechnen
  result := NextStep(inWerte,deltaV,Parameter);
  result.t := inWerte.t+Parameter.h;
end;

function RungeKutta4(const inWerte: TResults;var Parameter:tParameter):tResults;
var
  D1,
  D2,
  D3,
  D4,
  Zwischenschritt : TResults;
  f : double;

  function deltaV4Mitteln:tResults;
    const
      f = 1/6;
    begin
    result.a := ((D2.a+D3.a)*2+D1.a+D4.a)*f;
    result.v := ((D2.v+D3.v)*2+D1.v+D4.v)*f;
    result.x := ((D2.x+D3.x)*2+D1.x+D4.x)*f;
    end;

begin
  f := Parameter.h;
  //Steigungswerte im Ausgansgpunkt
  d1 := deltaVektor(inWerte,Parameter);
  //Punkt in der Mitte des Intervals
  Parameter.h := f*0.5;

  Zwischenschritt:=NextStep(inWerte,d1,Parameter);
  d2 := deltaVektor(Zwischenschritt,Parameter);
  //Mit dessen Steigungswerten wieder einen Punkt in der Mitte
  Zwischenschritt:=NextStep(inWerte,d2,Parameter);
  d3 := deltaVektor(Zwischenschritt,Parameter);

  //Mit dessen Steigungswerten einen Punkt am Intervallende
  Parameter.h := f;
  Zwischenschritt:=NextStep(inWerte,d3,Parameter);
  d4 := deltaVektor(Zwischenschritt,Parameter);

  d1 := deltaV4Mitteln;

  result := NextStep(inWerte,d1,Parameter);
  result.t := inWerte.t+f;
end;

var
  Parameter  : tParameter;
  Werte1,
  Werte0,
  Werte      : tResults;
  ArrResults : array of tResults;

  deltaT,
  dt05,
  Omega,
  UmlaufZeit : double;

  i : integer;

begin
  With Parameter do
    begin
    masse := 1;//strtofloat(edm.text);
    C :=     5;//strtofloat(edm.text);
    cm := c/Masse; //Zusammenfassung für weinger Rechnerei
    h := 1/64;//strtofloat(eddt.Text);
    end;
Omega := sqrt(Parameter.cm);
UmlaufZeit := 2*pi/Omega;
writeln('Eigenkreisfrequenz :', Omega);
writeln('Schwingungsdauer : ', Umlaufzeit:6:4,' Sekunden pro Schwingung');
writeln;
// Teile eine Schwingung in gleich Teile
deltaT := UmlaufZeit/16;
// Veranschaulichung des Einflusses der Schrittweite deltaT
repeat
  //StartWerte
  dt05 := DeltaT*0.5;
  Parameter.h := DeltaT;//strtofloat(eddt.Text);
  With Werte do
    begin
    x := 1.0;//strtofloat(edx0.text);//
    v := 0.0;
    a := 0.0;
    t := 0.0;
    end;
  setlength(ArrResults,0);
  // setlength(ArrResults,Round(MaxZeit/Parameter.dt)+1);
  i := 0;
  Werte0:= Werte;
  Werte1:= Werte;
  writeln('Delta-t:',DeltaT:10:6,' Abschnitte pro Schwingung : ',UmlaufZeit/DeltaT:0:1 );
  While (MaxZeit - Werte.t-Dt05) > 0 do
    begin
    Werte:= EulerCauchy(Werte,Parameter);
    Werte0:= Heun(Werte0,Parameter);
    Werte1:= RungeKutta4(Werte1,Parameter);

    //ArrResults[i] := Werte;
    inc(i);
    end;
  with Werte  do writeln('EulerCauchy',t:10:5,x:10:3,v:10:3,a:10:3,Energie(Werte,Parameter):15:7);
  with Werte0 do writeln('Heun       ',t:10:5,x:10:3,v:10:3,a:10:3,Energie(Werte0,Parameter):15:7);
  with Werte1 do writeln('RungeKutte4',t:10:5,x:10:3,v:10:3,a:10:3,Energie(Werte1,Parameter):15:7);
  writeln;

  deltaT := dt05;
until deltaT < 5e-3;
writeln;
writeln('Fertig');

readln
end.
{
Eigenkreisfrequenz : 2.23606797749979E+000
Schwingungsdauer : 2.8099 Sekunden pro Schwingung

              Zeit    Auslenkung   Geschw.  Beschleu.    Energie (2.5 Joule)

Delta-t:  0.175620 Abschnitte pro Schwingung : 16.0
EulerCauchy 238.84370 2.26017009992116E+042 1.54314863368898E+041-9.673561557085
22E+042 1.27828287399723E+085
Heun        238.84370    49.617   -59.543  -274.610   7927.2765658
RungeKutte4 238.84370     0.962     0.216    -4.592      2.3357922

Delta-t:  0.087810 Abschnitte pro Schwingung : 32.0
EulerCauchy 238.8437020066453768428400000000.00020343372798067000000000.000-8800
7525635442000000000.000 1.21358282550175E+045
Heun        238.84370    -1.606     0.916     8.232      6.8676188
RungeKutte4 238.84370     0.999     0.015    -4.959      2.4946199

Delta-t:  0.043905 Abschnitte pro Schwingung : 64.0
EulerCauchy 238.84370-28882113025.294474798359855.733246267299095.06411480218239
2862000000000.0000000
Heun        238.84370     0.699    -1.798    -3.692      2.8366636
RungeKutte4 238.84370     1.000     0.001    -4.992      2.4998311

Delta-t:  0.021953 Abschnitte pro Schwingung : 128.0
EulerCauchy 238.84370441358.337450636.777-2152142.821588529707020.7400000
Heun        238.84370     0.985    -0.479    -4.951      2.5397944
RungeKutte4 238.84370     1.000     0.000    -4.998      2.4999947

Delta-t:  0.010976 Abschnitte pro Schwingung : 256.0
EulerCauchy 238.84370   696.664   167.640 -3472.0301227404.7741711
Heun        238.84370     1.000    -0.120    -5.001      2.5049400
RungeKutte4 238.84370     1.000     0.000    -4.999      2.4999998

Delta-t:  0.005488 Abschnitte pro Schwingung : 512.0
EulerCauchy 238.84370    26.481     1.588  -132.339   1754.3109559
Heun        238.84370     1.000    -0.030    -5.001      2.5006170
RungeKutte4 238.84370     1.000     0.000    -5.000      2.5000000


Fertig
}

Das Verfahren nach Heun ist schon ein mächtiger Fortschritt

Das lässt sich sicher leicht in Dein Programm übertragen .

Gruß Horst
EDIT:
Runge Kutta ist erheblich schneller genau, Heun ist auch nicht zu verachten, man muss ja auch nur wesentlich weniger oft die Funktion berechnen.
Man sieht schön, dass EulerCauchy sehr viel und Heun etwas Energie ins System pumpt.


Zuletzt bearbeitet von Horst_H am Mi 04.02.09 22:06, insgesamt 1-mal bearbeitet
n-regen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202
Erhaltene Danke: 2



BeitragVerfasst: Mi 04.02.09 18:30 
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Ohne funktionierenden/vollständigen Code wird's schwer. Ich weiss weder was a2ar, v2ar, x2ar tun [...]

user profile iconn-regen hat folgendes geschrieben Zum zitierten Posting springen:
Die 2ar-Funktionen schreiben die Ergebnisse in die Wertetabelle [...]

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
[...] noch versteh ich, weshalb edx0.Value von Typ Double ist, wenn es ein Edit ist. Die vielen ifs machen den Code auch nicht lesbarer.

Da war ich nicht präzise genug: Das sind JvSpinEdits, deren Value-Eigenschaft ein Extended-Wert ist.

@user profile iconHorst_H: Ich schaue mal, ob ich deinen Code irgendwo um- und einbauen kann.