begrenzung bei TChart?
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
begrenzung bei TChart?
Hallo,
ich arbeite gerade an einem Projekt wo auf der X-Achse die Zeit in sekunden stehen soll. Dabei habe ich t als Variable für die sekunden genommen und inkrementiert also mit einer FOR-Scheife von 1 bis 10000 zählen lassen. Aber ich kriege die Fehlermeldung "floating point overflow" auch die suche mit Google konnte mir nicht helfen.
mit ausprobieren habe ich herausgefunden dass Tchart die Funktion bis t=2514 ausführt.
gibt es eine automatische Begrenzung bei Tchart von der ich nichts weiß`?
ich danke euch im vorraus für eure hilfe.
ich arbeite gerade an einem Projekt wo auf der X-Achse die Zeit in sekunden stehen soll. Dabei habe ich t als Variable für die sekunden genommen und inkrementiert also mit einer FOR-Scheife von 1 bis 10000 zählen lassen. Aber ich kriege die Fehlermeldung "floating point overflow" auch die suche mit Google konnte mir nicht helfen.
mit ausprobieren habe ich herausgefunden dass Tchart die Funktion bis t=2514 ausführt.
gibt es eine automatische Begrenzung bei Tchart von der ich nichts weiß`?
ich danke euch im vorraus für eure hilfe.
-
- Beiträge: 90
- Registriert: Fr 2. Nov 2007, 13:32
- OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
- CPU-Target: 32Bit
- Wohnort: Ulm
Re: begrenzung bei TChart?
Kannst Du bitte mal den Codeabschnitt mit angeben.
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
Re: begrenzung bei TChart?
Ja klar:
wenn ich dann statt der 2400 z.B. 5000 eingebe kommt dieser Overflow fehler.
Achja und t ist von der form longint und Pg,Pzu, Pab von der form extended
Code: Alles auswählen
For t:=1 To 2400 do
begin
{Formeln zur Abschließenden Berechnung}
TK := TC+273.15;
Ter := (Pg*(t*0.001))/(md*cd);
Temp := TK+Ter;
RT := RSpeD*(1+alphaD*(Temp-293.15))*(l/A);
U := Ug;
I := U/RT;
Pzu := (U*U)/RT;
Pab := SBK*Ob*Temp*Temp*Temp*Temp;
Pg := Pzu-Pab;
PgSeries.Addxy(t,Pg);
PabSeries.Addxy(t,Pab);
PzuSeries.Addxy(t,Pzu);
Label15.caption:= FloattoSTrF(U,fffixed,8,10);
end;
wenn ich dann statt der 2400 z.B. 5000 eingebe kommt dieser Overflow fehler.
Achja und t ist von der form longint und Pg,Pzu, Pab von der form extended
Zuletzt geändert von Lori am Do 13. Dez 2012, 14:49, insgesamt 1-mal geändert.
Grund: Highlighter
Grund: Highlighter
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2823
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: begrenzung bei TChart?
Bitte poste den vollständigen Code (inkl. Definition aller Variablen) und das Ganze bitte im Highlighter.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
Re: begrenzung bei TChart?
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, TAGraph, TASeries, TALegendPanel, TASources,
TATools, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
ButtonSimuStart: TButton;
ButtonBeenden: TButton;
Chart1: TChart;
ComboBoxSpannung: TComboBox;
Label15: TLabel;
PzuSeries: TLineSeries;
PabSeries: TLineSeries;
PgSeries: TLineSeries;
ComboBoxMaterial: TComboBox;
EditTC: TEdit;
Editl: TEdit;
Editd: TEdit;
Label1: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Memo1: TMemo;
Shape1: TShape;
procedure ButtonBeendenClick(Sender: TObject);
procedure ButtonSimuStartClick(Sender: TObject);
procedure ComboBoxMaterialChange(Sender: TObject);
procedure ComboBoxSpannungChange(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
CONST
SBK = 0.000000056704 {Stefan-Boltzmann-Konstante in W/m^2*K^4};
Tck = 273.15 {Umrechnung von °C auf K};
deltat = 0.000001 {Zeitschritt in s};
Rhalte = 3.5 {Widerstand des Haltedrahtes in Ohm};
Pi = 3.14159265 {Kreiszahl Pi};
{Materialkonstanten Wolfram}
RspeW = 0.0000000528 {spezifischer Widerstand Wolfram in ohm/m bei 20°C};
rhodW = 19300 {spezifische Dichte von Wolfram in kg/m^3};
TschmelzW = 3695 {Schmelztemperatur Wolfram in K};
lambdaW = 170 {Wärmeleitfähigkeit Wolfram in W/m*K};
cW = 138 {spezifische Wärmekapazität Wolfram in J/kg*K};
TadkW = 0.0000045 {Temperaturausdehnungskoeffizient Wolfram in 1/K};
alphaW = 0.0044 {Temperaturkoeffizient Wolfram in 1/K};
{Materialkonstanten Platin}
RspeP = 0.000000105 {spezifischer Widerstand Platin in ohm/m bei 20°C};
rhodP = 21450 {spezifische Dichte von Platin in kg/m^3};
TschmelzP = 2041.4 {Schmelztemperatur Platin in K};
lambdaP = 72 {Wärmeleitfähigkeit Platin in W/m*K};
cP = 130 {spezifische Wärmekapazität Platin in J/kg*K};
TadkP = 0.0000088 {Temperaaturausdehnungskoeffizient Platin in 1/K};
alphaP = 0.0031 {Temperaturkoeffizient Platin in 1/K};
var
Form1: TForm1; {Wichtig, gibt an dass Formular1 zur Unit gehört}
{Spezifische Materialeigenschaften}
RspeD : single {spezifischer Widerstand Draht in ohm/m bei 20°C};
rhodD : integer {spezifische Dichte von Draht in kg/m^3};
TschmD : single {Schmelztemperatur Draht in K};
lambdaD: integer {Wärmeleitfähigkeit Draht in W/m*K};
cD : integer {spezifische Wärmekapazität Draht in J/kg*K};
TadkD : single {Temperaturausdehnungskoeffizient Draht in 1/K};
alphaD : single {Temperaturkoeffizient Draht in 1/K};
{Drahtgeometrie}
l : single {Länge Draht in m};
d : single {Durchmesser Draht in m};
Ob : single {Oberfläche Draht in m^2};
A : single {Querschnittsfläche Draht in m^2};
md : single {Masse Draht in kg};
{Elektrische Eigenschaften Draht}
Rd : single {Widerstand Draht in Ohm};
Rel : single {Elektrischer Widerstand Draht bei T};
RT : single {spezifischer elektrischer Widerstand Draht in Abhängigkeit von T};
{Temperatureigenschaften}
TC : single {Temperatur Raum/Draht in °C};
TK : single {Temperatur Draht in K};
Td : single {Temperaturdifferenz Raum-Draht in K};
Temp : single {Temperatur Draht in Abhängigkeit der Zeit};
Ter : single {Erwärmung Draht};
{Elektrische Eigenschaften}
Ug : single {Angelegte Spannung in V};
U : single {Spannung die am Draht anliegt in V};
I : single {Stromstärke die am Draht anliegt A};
Pzu : extended {Leistung im Draht in W};
Pab : extended {abgestrahlte Leistung in W};
Pg : extended {Aufgenommene Leistung ingesamt in W};
t : Longint {Zeitpunkt nach dem Einschalten in s};
implementation
{$R *.lfm}
{ TForm1 }
{SPANNUNGSEINGABE}
procedure TForm1.ComboBoxSpannungChange(Sender: TObject);
begin
begin
Case ComboboxSpannung.itemindex OF
0 : Ug := 1.5 ;
1 : Ug := 3 ;
2 : Ug := 6 ;
3 : Ug := 12 ;
4 : Ug := 20 ;
5 : Ug := 30 ;
6 : Ug := 40 ;
7 : Ug := 50 ;
8 : Ug := 60 ;
9 : Ug := 70 ;
10 : Ug := 80 ;
11 : Ug := 90 ;
12 : Ug := 100 ;
13 : Ug := 120 ;
14 : Ug := 150 ;
15 : Ug := 170 ;
16 : Ug := 200 ;
17 : Ug := 230 ;end;
end;
end;
{MATERIALEINGABE}
procedure TForm1.ComboBoxMaterialChange(Sender: TObject);
begin
If ComboBoxMaterial.itemindex = 0 Then
begin
RspeD := RspeW {spezifischer Widerstand Wolfram in ohm/m};
rhodD := rhodW {spezifische Dichte von Wolfram in kg/m^3};
TschmD := TschmelzW {Schmelztemperatur Wolfram in K};
lambdaD := lambdaW {Wärmeleitfähigkeit Wolfram in W/m*K};
cD := cW {spezifische Wärmekapazität Wolfram in J/kg*K};
TadkD := TadkW {Temperaturausdehnungskoeffizient Wolfram in 1/K};
alphaD := alphaW {Temperaturkoeffizient Wolfram in 1/K};
end;
If ComboboxMaterial.itemindex = 1 Then
begin
RspeD := RspeP {spezifischer Widerstand Platin in ohm/m};
rhodD := rhodP {spezifische Dichte von Platin in kg/m^3};
TschmD := TschmelzP {Schmelztemperatur Platin in K};
lambdaD := lambdaP {Wärmeleitfähigkeit Platin in W/m*K};
cD := cP {spezifische Wärmekapazität Platin in J/kg*K};
TadkD := TadkP {Temperaturausdehnungskoeffizient Platin in 1/K};
alphaD := alphaP {Temperaturkoeffizient Platin in 1/K};
end;
end;
{Aktion nach dem Drücken des "Beenden"-Buttons}
procedure TForm1.ButtonBeendenClick(Sender: TObject);
begin
application.terminate;
end;
{Aktion nach dem Drücken des "Simu. Start."-Buttons}
procedure TForm1.ButtonSimuStartClick(Sender: TObject);
begin
l := StrToFloat(Editl.text);
d := StrtoFloat(Editd.text);
TC := StrtoFloat(EditTC.text);
Ob := pi*(d*0.001)*(l*0.001);
Label9.Caption := FloattoStrF(Ob, fffixed,8,10);{Ausgabe mit 8 Stellen vor und 10 Stellen nach dem Komma}
A := pi*((d*0.001)/2)*((d*0.001)/2);
Label7.Caption := FloattoStrF(A, fffixed,8,10); {Ausgabe Querschnitt}
md :=rhodD*A*(l*0.001);
Label11.Caption := FloattoStrF(md, fffixed,8,10);{Augabe der Masse}
For t:=1 To 2400 do
begin
{Formeln zur Abschließenden Berechnung}
TK := TC+273.15;
Ter := (Pg*(t*0.001))/(md*cd);
Temp := TK+Ter;
RT := RSpeD*(1+alphaD*(Temp-293.15))*(l/A);
U := Ug;
I := U/RT;
Pzu := (U*U)/RT;
Pab := SBK*Ob*Temp*Temp*Temp*Temp;
Pg := Pzu-Pab;
PgSeries.Addxy(t,Pg);
PabSeries.Addxy(t,Pab);
PzuSeries.Addxy(t,Pzu);
Label15.caption:= FloattoSTrF(U,fffixed,8,10);
end;
end;
end.
Zuletzt geändert von Lori am Fr 14. Dez 2012, 15:20, insgesamt 1-mal geändert.
Grund: Und bitte den Highlighter verwenden.
Grund: Und bitte den Highlighter verwenden.
Re: begrenzung bei TChart?
Es wäre schön, wenn du auch die lfm-Datei posten würdest, damit würdest du den Leuten, die dir hier helfen wollen, die Sache viel einfacher machen. Warum packst du nicht die pas, lfm, lpr und lpi-Dateien in ein zip-Archiv and lädst da hoch? Dann kann jeder, der dir helfen will, dein Projekt in Lazarus laden und durchchecken.
Auf jeden Fall liegt dein Problem nicht an TAChart, da kannst du soviele Werte in eine Series einladen, bis der Speicher überläuft. Ich vermute eher, dass du irgendwo nicht initialisierte Variablen hast. Setze einen Breakpoint in der fraglichen Routine und schau nach, ob alle Variablenwerte vernünftig sind. Verfolge einige Durchläufe in der Schleife mit dem Debugger und prüfe wieder die Variablen.
Auf jeden Fall liegt dein Problem nicht an TAChart, da kannst du soviele Werte in eine Series einladen, bis der Speicher überläuft. Ich vermute eher, dass du irgendwo nicht initialisierte Variablen hast. Setze einen Breakpoint in der fraglichen Routine und schau nach, ob alle Variablenwerte vernünftig sind. Verfolge einige Durchläufe in der Schleife mit dem Debugger und prüfe wieder die Variablen.
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
Re: begrenzung bei TChart?
hi ich hab jetzt das projekt als zip. datei angehängt...
ich suche ja nach irgendwelchen fehlern, aber ich bin an einem punkt wo ich den wald vor bäumen nicht mehr sehe.
achja und einige Variablen hab ich noch nicht benutzt da das programm noch nicht komplett ist
ich suche ja nach irgendwelchen fehlern, aber ich bin an einem punkt wo ich den wald vor bäumen nicht mehr sehe.
achja und einige Variablen hab ich noch nicht benutzt da das programm noch nicht komplett ist
- Dateianhänge
-
Pascal Projekt.zip
- (6.81 MiB) 100-mal heruntergeladen
-
- Beiträge: 90
- Registriert: Fr 2. Nov 2007, 13:32
- OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
- CPU-Target: 32Bit
- Wohnort: Ulm
Re: begrenzung bei TChart?
Die Werte der Variablen Pzu und Pab gehen ziemlich schnell im Schleifendurchlauf auseinander, d.h. der eine geht gegen Null, der andere wird sehr stark Negativ.
Die Differenz Pg ist dann (auch für Extended) nicht mehr berechenbar --> geht gegen minus Unendlich
Da muss also noch was am Algorithmus getan werden, liegt also nicht an TChart.
Gruß Thomas
Die Differenz Pg ist dann (auch für Extended) nicht mehr berechenbar --> geht gegen minus Unendlich
Da muss also noch was am Algorithmus getan werden, liegt also nicht an TChart.
Gruß Thomas
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
Re: begrenzung bei TChart?
erstmal danke für deine schnelle antwort, aber selbst wenn ich nur einen der werte z.B. Pzu zeigen lassen will kommt ein floating point overflow
Re: begrenzung bei TChart?
Ich schließe mich Thomas B. an: das stimmt etwas mit dem Algorithmus nicht. Ohne mich jetzt groß in das Problem reinzudenken, würde ich mir vorstellen, dass irgendwann ein Gleichgewicht zwischen zugeführter und abgestrahlter Energie auftreten müsste, nämlich dann, wenn der Glühfaden konstant leuchtet. Bei deiner Rechnung nimmt jedoch Pg, die Differenz zwischen zugeführter und abgestrahlter Leistung, ständig ab, auch wenn sie schon negativ ist.
Zum Programm: Du solltest nur solche Variablen als Integer deklarieren, die es auch nur in ganzen Werten gibt. Bloß weil du bei der Dichte keine Dezimalstellen angibst, heißt das nicht, dass diese Größe keine hat. Im Vergleich zu Gleitkommazahlen haben Integer nur einen winzigen Wertebereich und es kann leicht zu Überläufen kommen. Auch deklarierst du einige Werte als single. Nimm lieber "double" oder gleich "extended" - diese haben einen größeren Wertebereich, damit geht dir dann bei ungeschickt gerechneten Zwischenergebnissen nicht gleich die Luft aus.
Generell deklarierst du alle Variablen global, das ist sehr ungeschickt und sehr fehlerträchtig. Besser wäre es nur die Konstanten global zu deklarieren und die Variablen soweit wie möglich lokal in den Prozeduren, wo du sie brauchst; das wäre bei dir die ButtonSimuStartClick Methode. Und auch die zwischen den einzelnen Prozeduren weitergerechneten Variablen würde ich nicht global deklarieren, sondern als Variablen im Formular.
Schön finde ich, dass du in Kommentaren hinter den Deklarationen die Einheiten angibst, damit kannst du in ein paar Monaten, wenn du die Details vergessen hast, die Rechnungen viel leichter nachvollziehen.
Zum Programm: Du solltest nur solche Variablen als Integer deklarieren, die es auch nur in ganzen Werten gibt. Bloß weil du bei der Dichte keine Dezimalstellen angibst, heißt das nicht, dass diese Größe keine hat. Im Vergleich zu Gleitkommazahlen haben Integer nur einen winzigen Wertebereich und es kann leicht zu Überläufen kommen. Auch deklarierst du einige Werte als single. Nimm lieber "double" oder gleich "extended" - diese haben einen größeren Wertebereich, damit geht dir dann bei ungeschickt gerechneten Zwischenergebnissen nicht gleich die Luft aus.
Generell deklarierst du alle Variablen global, das ist sehr ungeschickt und sehr fehlerträchtig. Besser wäre es nur die Konstanten global zu deklarieren und die Variablen soweit wie möglich lokal in den Prozeduren, wo du sie brauchst; das wäre bei dir die ButtonSimuStartClick Methode. Und auch die zwischen den einzelnen Prozeduren weitergerechneten Variablen würde ich nicht global deklarieren, sondern als Variablen im Formular.
Schön finde ich, dass du in Kommentaren hinter den Deklarationen die Einheiten angibst, damit kannst du in ein paar Monaten, wenn du die Details vergessen hast, die Rechnungen viel leichter nachvollziehen.
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
Re: begrenzung bei TChart?
Hi Leute ihr hattet Recht es lag an dem Algorithmus genauer gesagt an der Berechnung von Pg...Vielen Dank...nur wie das so ist taucht gleich das zweite Probelm auf...ich wollte den algorithmus nämlich nur so lange laufen lassen bis sich die Geraden von Pzu und Pab schneiden (also Pzu=Pab) setzen aber wenn ich es mit einer Repeat Schleife in FOrm von
mache stürzt das programm ab und ich muss es per hand beenden und es werden auch keine werte angezeigt.. Ich habe hundertpro einen fehler in der Formulierung aber ich sehe ihn nicht könnt ihr mir helfen?
Code: Alles auswählen
{Aktion nach dem Drücken des "Simu. Start."-Buttons}
procedure TForm1.ButtonSimuStartClick(Sender: TObject);
VAR t: Integer;
begin
t:=0 ;
Repeat
t:= t+1;
l := StrToFloat(Editl.text);
d := StrtoFloat(Editd.text);
TC := StrtoFloat(EditTC.text);
Ob := pi*(d*0.001)*(l*0.001);
Label9.Caption := FloattoStrF(Ob, fffixed,8,10);{Ausgabe mit 8 Stellen vor und 10 Stellen nach dem Komma}
A := pi*((d*0.001)/2)*((d*0.001)/2);
Label7.Caption := FloattoStrF(A, fffixed,8,10); {Ausgabe Querschnitt}
md :=rhodD*A*(l*0.001);
Label11.Caption := FloattoStrF(md, fffixed,8,10);{Augabe der Masse}
{Formeln zur Abschließenden Berechnung}
TK := TC+273.15;
Ter := (Pg*(t*0.001))/(md*cd);
Temp := TK+Ter;
RT := RSpeD*(1+alphaD*(Temp-293.15))*(l/A);
U := Ug;
I := U/RT;
Pg := U*I;
Pzu := 0.98*(U*U)/RT;
Pab := emgradD*SBK*Ob*Temp*Temp*Temp*Temp;
PgSeries.Addxy(t,Pg);
PzuSeries.Addxy(t,Pzu);
PabSeries.Addxy(t,Pab);
Label15.caption:= FloattoSTrF(U,fffixed,8,10);
Label16.caption:=Floattostrf(RT,fffixed,8,10);
Label17.caption:=Floattostrf(emgradD,fffixed,8,10);
until Pzu=Pab;
exit;
mache stürzt das programm ab und ich muss es per hand beenden und es werden auch keine werte angezeigt.. Ich habe hundertpro einen fehler in der Formulierung aber ich sehe ihn nicht könnt ihr mir helfen?
Zuletzt geändert von Lori am Sa 15. Dez 2012, 18:14, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter verwenden.
Grund: Bitte den Highlighter verwenden.
Re: begrenzung bei TChart?
Pzu und Pab werden sicher nie exakt gleich groß werden, du rechnest ja nur in diskreten Stufen. Ein sichereres Abbruchkriterium ist Pab >= Pzu.
Eins wolle ich gestern noch schreiben: Dein kleines Programm ist zwar nicht rechenzeitkritisch, aber ich würde die Terme, die sich in der Schleife nicht ändern, vor der Schleife berechnen: Die Anweisungen TK := TC + 273.15 und U := Ug musst du nur einmal ausführen. Auch sind die Anweisungen, die die Captions der Labels setzen in der Schleife unnötig, du kriegst die Zwischenwerte ja gar nicht zu Gesicht.
Eins wolle ich gestern noch schreiben: Dein kleines Programm ist zwar nicht rechenzeitkritisch, aber ich würde die Terme, die sich in der Schleife nicht ändern, vor der Schleife berechnen: Die Anweisungen TK := TC + 273.15 und U := Ug musst du nur einmal ausführen. Auch sind die Anweisungen, die die Captions der Labels setzen in der Schleife unnötig, du kriegst die Zwischenwerte ja gar nicht zu Gesicht.
-
- Beiträge: 18
- Registriert: Di 9. Okt 2012, 15:47
Re: begrenzung bei TChart?
ja du hattest Recht lag am Abbruchkriterium...vielen vielen Dank ich bin jetzt endlich mit dem Programm fertig!