begrenzung bei TChart?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

begrenzung bei TChart?

Beitrag von maschbau61 »

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.

Thomas B.
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?

Beitrag von Thomas B. »

Kannst Du bitte mal den Codeabschnitt mit angeben.

maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

Re: begrenzung bei TChart?

Beitrag von maschbau61 »

Ja klar:

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

Benutzeravatar
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?

Beitrag von m.fuchs »

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

maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

Re: begrenzung bei TChart?

Beitrag von maschbau61 »

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.

wp_xyz
Beiträge: 5193
Registriert: Fr 8. Apr 2011, 09:01

Re: begrenzung bei TChart?

Beitrag von wp_xyz »

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.

maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

Re: begrenzung bei TChart?

Beitrag von maschbau61 »

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
Dateianhänge
Pascal Projekt.zip
(6.81 MiB) 100-mal heruntergeladen

Thomas B.
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?

Beitrag von Thomas B. »

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

maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

Re: begrenzung bei TChart?

Beitrag von maschbau61 »

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

wp_xyz
Beiträge: 5193
Registriert: Fr 8. Apr 2011, 09:01

Re: begrenzung bei TChart?

Beitrag von wp_xyz »

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.

maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

Re: begrenzung bei TChart?

Beitrag von maschbau61 »

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

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.

wp_xyz
Beiträge: 5193
Registriert: Fr 8. Apr 2011, 09:01

Re: begrenzung bei TChart?

Beitrag von wp_xyz »

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.

maschbau61
Beiträge: 18
Registriert: Di 9. Okt 2012, 15:47

Re: begrenzung bei TChart?

Beitrag von maschbau61 »

ja du hattest Recht lag am Abbruchkriterium...vielen vielen Dank ich bin jetzt endlich mit dem Programm fertig!

Antworten