Volumenberechnung liegender Zylinder

Hallo Leute,

ich habe mich schon die Tage an der Volumenberechnung eines liegenden Zylinders gemacht.

Leider bekomme ich immer noch unplausible Werte heraus.
Bei einem vollen Tank müssten um die 1.800 Liter rauskommen.
Als Ergebnis bekomme ich aber 136002 Liter. :confused:

double volumen = 0 ;
double L = 1.97 ;
double r = 1.08 ;
double h = 1.08 ;

double a = 0 ;
double b = 0 ;
double c = 0 ;
double d = 0 ;
double e = 0 ;


void setup() {
 
 Serial.begin(9600);

   Serial.print("r quadrat * L : "); 
   a = (square (r) * L);
   Serial.println(a);   // Ergebnis ok
   
   Serial.print("acos ((r-h)/r) : ");
   b = (acos((r - h) / r));
   Serial.println(b);   // Ergebnis  nicht ok

   Serial.print("(r-h) : ");
   c = (r - h);
   Serial.println(c);   // Ergebnis ok

   Serial.print("((Wurzel aus 2 * r * h - h2) / r2) : ");
   d = (sqrt (2 * r * h - square (h)));
   Serial.println(d);   // Ergebnis ok

   Serial.print("(d) / r2) : ");
   e = (d / square (r));
   Serial.println(e);   // Ergebnis ok

   Serial.print("Volumen : ");
   volumen = (a*(b-c*d));
   Serial.println(volumen);

Der Serialmonitor wirft mir folgende Ergebnisse heraus:

r quadrat * L : 2.30
acos ((r-h)/r) : 591.88
(r-h) : 0.00
((Wurzel aus 2 * r * h - h2) / r2) : 1.08
(d) / r2) : 0.93
Volumen : 1360.02

Hier nochmal die Formel die angewandt werden soll:

Hat jemand schon einmal so etwas berechnet oder kann mit jemand schon so auf die Sprünge helfen?

Ich erhalte

r quadrat * L : 2.30
acos ((r-h)/r) : 1.57
(r-h) : 0.00
((Wurzel aus 2 * r * h - h2) / r2) : 1.08
(d) / r2) : 0.93
Volumen : 3.61

Ich kann daran nichts ungewöhnliches entdecken.

Der volle Zylinder hätte ein Volumen von 1.082 * 3.14 * 1.97 = 7.22,
der halb volle hat also 3.61.

double r = 1.08 ;

1,08m sind nicht der Radius sondern der Durchmesser des Zylinders.
Wenn Du mit 0,54 als r rechnest dann kommt 1800l heraus.

Grüße Uwe

uwefed:
1,08m sind nicht der Radius sondern der Durchmesser des Zylinders.
Wenn Du mit 0,54 als r rechnest dann kommt 1800l heraus.

Grüße Uwe

Ein Zylinder der Abmessung von 1.97 * 1.08 (etwa 2 * 1) kann kein Volumen von über 1000 haben.

Wie könnt ihr solche irren Werte für plausibel halten?

Der springende Punkt ist die falsche Berechnung des arccos

acos ((r-h)/r) : 591.88
(r-h) : 0.00

acos(0) ist 1/2 Pi also etwa 1.57, nicht 591.88.

180px-Arcsine_Arccosine.svg.png

Wenn jemand bei einem Zylinder eine Variable mit r bezeichnet und damit den Durchmesser meint, betrachte ich das als krank.
Wieder mal ein schönes Beispiel, wie blöd solche unsprechenden Variablennamen sind.

Gruß Tommy

Tommy56:
Wenn jemand bei einem Zylinder eine Variable mit r bezeichnet und damit den Durchmesser meint, betrachte ich das als krank.

Das ist so krank, das es nicht einmal gemacht wurde.

Aus der Grafik geht klar hervor dass der Durchmesser 2r ist, wie üblich.
Das h gleich r ist, ist bei einem halb gefüllten Zylinder vollig korrekt.

Stimmt, da lag Uwe daneben und hat mich verwirrt. Dann stimmen die 7,22 m³ (wenn das Meter sind) für den vollen Tank.

Gruß Tommy

Ja, ist völlig plausibel.

Bei mir gibt der Kode auch ein völlig anderes Ergebnis aus, siehe oben.

Überschlagsmäßig betrachtet passt der Zylinder in einen 3x3x3 Würfel mit Volumen von 27 und viel leerem Raum.

Jedes drei- (oder sogar vier-) stellige Ergebnis kann dann einfach nicht stimmen.

Es sei denn jemand betrachtet es als Liter und nicht als m³, wobei dann 7,22 m³ eben 7200 Liter sind.

Gruß Tommy

Na ja, ein acos Wert von 591.88 muss einfach falsch sein, der Wertebereich geht von 0 bis Pi…

Ein falsch errechnetes Ergebnis in m3 durch Anhängen von zwei Stellen zu Litern zu machen,
ist auch etwas, sagen wir ungewöhnlich.

Fritz911:
Als Ergebnis bekomme ich aber 136002 Liter. :confused:

double L = 1.97 ;

double r = 1.08 ;
double h = 1.08 ;

r quadrat * L : 2.30
acos ((r-h)/r) : 591.88
(r-h) : 0.00
((Wurzel aus 2 * r * h - h2) / r2) : 1.08
(d) / r2) : 0.93
Volumen : 1360.02

Fritz911:
Bei einem vollen Tank müssten um die 1.800 Liter rauskommen.

Bei mir nicht, es müssten etwa 7218.8 Liter sein, oder 7.2188 m3.

Ich lese aus der Zahl “1.800” auch nur widerwillig 1800.0

Whandall:
Ich lese aus der Zahl "1.800" auch nur widerwillig 1800.0

Wieso das? Der Punkt ist hierzulande nunmal das Tausender-Trennzeichen. Und ein Komma ist ein Komma.

Gruß

Gregor

gregorss:
Und ein Komma ist ein Komma.

Es sei denn es geht um Trennzeichen in Floats die in der Programmierung verwendet werden,
da ist das deutesche Komma ein Punkt, jedenfalls für den Kompiler.

Fritz911:
Bei einem vollen Tank müssten um die 1.800 Liter rauskommen.

double volumen = 0 ;

double L = 1.97 ;
double r = 1.08 ;
double h = 1.08 ;

Whandall:
Ein Zylinder der Abmessung von 1.97 * 1.08 (etwa 2 * 1) kann kein Volumen von über 1000 haben.

Jetzt verstehe ich Euch nicht.
Annahme1)
Die 1,08m sind der Durchmesser und die Länge ist 1.97m. Das Volumen ist 1800 l = 1,8m^3
V= rrPilänge = 0,54m0,54m* 3,14*1,97m = 1,804m^3
also ist der Durchmesser falsch undd as angegebene Volumen stimmt laut ersten Post.

Annahme2)
Die 1,08m sind der Radius und die Länge ist 1.97m. Das Volumen ist 1800 l = 1,8m^3
V= rrPilänge = 1,08m1,08m* 3,14*1,97m = 7,215m^3
also ist das Volumen falsch angegeben.

Grüße Uwe

Ich habe mich wirklich in der Angabe um den Radius versehen.

Es müsste natürlich ein Radius von 0,54 m sein.
Muss ich das generell eigentlich mit 0.54 oder mit 54 im Sketch angeben ?

Trotzdem bekomme ich als Ergebnis bei vollem Tank : Volumen : 340.00 heraus ?!?

Eingestellte Parameter sind jetzt :

double volumen = 0 ;
double L = 1.97 ;
double r = 0.54 ;
double h = 1.08 ;

Trotzdem bekomme ich als Ergebnis bei vollem Tank : Volumen : 340.00 heraus ?!?

Kommt darauf an.
Wenn Du die Abmessungen in m angibst dann kommen m^3 heraus; bei dm dann dm^3 = Liter, bei cm dann cm^3.
Grüße Uwe

Fritz911:
Muss ich das generell eigentlich mit 0.54 oder mit 54 im Sketch angeben ?

Generell sollte man -wenn möglich- mit SI-Basiseinheiten (Meter, Volt, Amepere, Sekunde) rechnen. Auch sinnvolle Bezeichner wie r für Radius gehören dazu. Das hat den Vorteil, dass man keine Umrechnungsfaktoren beim Ergebnis berücksichtigen muss. Gerade mit Quadrieren und Wurzeln kann man sich Fehler hereinholen. Erst das Ergebnis sollte dann in die gewünschte Einheit umgerechnet werden z.B. Liter, Milliampere usw.
Spätestens wenn weitere physikalische Größen dazu kommen, dann wird es ohne SI-Basiseinheiten sehr unübersichtlich und fehlerträchtig.

Im Computer muss man schon mal eine Ausnahme machen, wenn man Integer-Arithmetik benutzen will. Dann muss man aber doppelt und dreifach aufpassen, sich nicht mit dem Komma und den Potenzen zu verhauen.

Whandall:
Es sei denn es geht um Trennzeichen in Floats die in der Programmierung verwendet werden,
da ist das deutesche Komma ein Punkt, jedenfalls für den Kompiler.

Das Blöde ist, dass manchmal nicht klar ist, ob das Code-Komma oder das andere gemeint ist. Ich verstehe 1.800 zuerst als 1800, bis klar ist, welche Komma-Sorte gemeint ist. Es ist blöd, dass sich das manchmal erst aus dem folgenden Text erschließt. Wenn dann die andere Sorte gemeint ist, nervt mich, dass ich die bislang gelesenen Sachen im Kopf „konvertieren“ muss. Ich höre dann oft einfach mit dem Lesen auf.

Gruß

Gregor

Fritz911:
Trotzdem bekomme ich als Ergebnis bei vollem Tank : Volumen : 340.00 heraus ?!?

Du hast bei d und e einen Fehler, so daß eine falsche Berechnung entsteht. Mit UNO berechnet:

const double L = 1.97 ;
const double r = 0.54 ;

void setup() {
  Serial.begin(9600);
  for (double fuellhoehe = 0; fuellhoehe <= (2 * r); fuellhoehe += r / 5) {
    berechnung(fuellhoehe);
  }
}
void berechnung(double h)
{
  double volumen = 0 ;
  double a = 0 ;
  double b = 0 ;
  double c = 0 ;
  double d = 0 ;
  double e = 0 ;

  Serial.print("r quadrat * L : ");
  a = (square (r) * L);
  Serial.print(a);

  Serial.print("\tacos ((r-h)/r) : ");
  b = (acos((r - h) / r));
  Serial.print(b);

  Serial.print("\t(r-h) : ");
  c = (r - h);
  Serial.print(c);

  Serial.print("\t((Wurzel aus 2 * r * h - h2) / r2) : ");
  d = (sqrt (2 * r * h - square (h)));
  Serial.print(d);

  Serial.print("\t(r2) : ");
  e = (square (r));
  Serial.print(e);

  Serial.print("\tHoehe : ");
  Serial.print(h, 5);
  Serial.print("\tVolumen : ");
  volumen = (a * (b - c * d / e));
  Serial.println(volumen, 4);
}
void loop() {}
/*
r quadrat * L : 0.57 acos ((r-h)/r) : 0.00 (r-h) : 0.54 ((Wurzel aus 2 * r * h - h2) / r2) : 0.00 (r2) : 0.29 Hoehe : 0.00000 Volumen : 0.0000
r quadrat * L : 0.57 acos ((r-h)/r) : 0.64 (r-h) : 0.43 ((Wurzel aus 2 * r * h - h2) / r2) : 0.32 (r2) : 0.29 Hoehe : 0.10800 Volumen : 0.0939
r quadrat * L : 0.57 acos ((r-h)/r) : 0.93 (r-h) : 0.32 ((Wurzel aus 2 * r * h - h2) / r2) : 0.43 (r2) : 0.29 Hoehe : 0.21600 Volumen : 0.2569
r quadrat * L : 0.57 acos ((r-h)/r) : 1.16 (r-h) : 0.22 ((Wurzel aus 2 * r * h - h2) / r2) : 0.49 (r2) : 0.29 Hoehe : 0.32400 Volumen : 0.4554
r quadrat * L : 0.57 acos ((r-h)/r) : 1.37 (r-h) : 0.11 ((Wurzel aus 2 * r * h - h2) / r2) : 0.53 (r2) : 0.29 Hoehe : 0.43200 Volumen : 0.6741
r quadrat * L : 0.57 acos ((r-h)/r) : 1.57 (r-h) : 0.00 ((Wurzel aus 2 * r * h - h2) / r2) : 0.54 (r2) : 0.29 Hoehe : 0.54000 Volumen : 0.9023
r quadrat * L : 0.57 acos ((r-h)/r) : 1.77 (r-h) : -0.11 ((Wurzel aus 2 * r * h - h2) / r2) : 0.53 (r2) : 0.29 Hoehe : 0.64800 Volumen : 1.1306
r quadrat * L : 0.57 acos ((r-h)/r) : 1.98 (r-h) : -0.22 ((Wurzel aus 2 * r * h - h2) / r2) : 0.49 (r2) : 0.29 Hoehe : 0.75600 Volumen : 1.3493
r quadrat * L : 0.57 acos ((r-h)/r) : 2.21 (r-h) : -0.32 ((Wurzel aus 2 * r * h - h2) / r2) : 0.43 (r2) : 0.29 Hoehe : 0.86400 Volumen : 1.5477
r quadrat * L : 0.57 acos ((r-h)/r) : 2.50 (r-h) : -0.43 ((Wurzel aus 2 * r * h - h2) / r2) : 0.32 (r2) : 0.29 Hoehe : 0.97200 Volumen : 1.7108
r quadrat * L : 0.57 acos ((r-h)/r) : 3.14 (r-h) : -0.54 ((Wurzel aus 2 * r * h - h2) / r2) : 0.00 (r2) : 0.29 Hoehe : 1.08000 Volumen : 1.8047
*/

Zur Überprüfung eine Kalkulationstabelle. *.ods kann man leider nicht hochladen.

Volumenberechnung liegender Zylinder.pdf (64.4 KB)

@ agmue super Ausarbeitung :slight_smile:

agmue:
Du hast bei d und e einen Fehler, so daß eine falsche Berechnung entsteht. Mit UNO berechnet:

const double L = 1.97 ;

const double r = 0.54 ;

void setup() {
  Serial.begin(9600);
  for (double fuellhoehe = 0; fuellhoehe <= (2 * r); fuellhoehe += r / 5) {
    berechnung(fuellhoehe);
  }
}
void berechnung(double h)
{
  double volumen = 0 ;
  double a = 0 ;
  double b = 0 ;
  double c = 0 ;
  double d = 0 ;
  double e = 0 ;

Serial.print("r quadrat * L : ");
  a = (square (r) * L);
  Serial.print(a);

Serial.print("\tacos ((r-h)/r) : ");
  b = (acos((r - h) / r));
  Serial.print(b);

Serial.print("\t(r-h) : ");
  c = (r - h);
  Serial.print(c);

Serial.print("\t((Wurzel aus 2 * r * h - h2) / r2) : ");
  d = (sqrt (2 * r * h - square (h)));
  Serial.print(d);

Serial.print("\t(r2) : ");
  e = (square (r));
  Serial.print(e);

Serial.print("\tHoehe : “);
  Serial.print(h, 5);
  Serial.print(”\tVolumen : ");
  volumen = (a * (b - c * d / e));
  Serial.println(volumen, 4);
}
void loop() {}





/*
r quadrat * L : 0.57 acos ((r-h)/r) : 0.00 (r-h) : 0.54 ((Wurzel aus 2 * r * h - h2) / r2) : 0.00 (r2) : 0.29 Hoehe : 0.00000 Volumen : 0.0000
r quadrat * L : 0.57 acos ((r-h)/r) : 0.64 (r-h) : 0.43 ((Wurzel aus 2 * r * h - h2) / r2) : 0.32 (r2) : 0.29 Hoehe : 0.10800 Volumen : 0.0939
r quadrat * L : 0.57 acos ((r-h)/r) : 0.93 (r-h) : 0.32 ((Wurzel aus 2 * r * h - h2) / r2) : 0.43 (r2) : 0.29 Hoehe : 0.21600 Volumen : 0.2569
r quadrat * L : 0.57 acos ((r-h)/r) : 1.16 (r-h) : 0.22 ((Wurzel aus 2 * r * h - h2) / r2) : 0.49 (r2) : 0.29 Hoehe : 0.32400 Volumen : 0.4554
r quadrat * L : 0.57 acos ((r-h)/r) : 1.37 (r-h) : 0.11 ((Wurzel aus 2 * r * h - h2) / r2) : 0.53 (r2) : 0.29 Hoehe : 0.43200 Volumen : 0.6741
r quadrat * L : 0.57 acos ((r-h)/r) : 1.57 (r-h) : 0.00 ((Wurzel aus 2 * r * h - h2) / r2) : 0.54 (r2) : 0.29 Hoehe : 0.54000 Volumen : 0.9023
r quadrat * L : 0.57 acos ((r-h)/r) : 1.77 (r-h) : -0.11 ((Wurzel aus 2 * r * h - h2) / r2) : 0.53 (r2) : 0.29 Hoehe : 0.64800 Volumen : 1.1306
r quadrat * L : 0.57 acos ((r-h)/r) : 1.98 (r-h) : -0.22 ((Wurzel aus 2 * r * h - h2) / r2) : 0.49 (r2) : 0.29 Hoehe : 0.75600 Volumen : 1.3493
r quadrat * L : 0.57 acos ((r-h)/r) : 2.21 (r-h) : -0.32 ((Wurzel aus 2 * r * h - h2) / r2) : 0.43 (r2) : 0.29 Hoehe : 0.86400 Volumen : 1.5477
r quadrat * L : 0.57 acos ((r-h)/r) : 2.50 (r-h) : -0.43 ((Wurzel aus 2 * r * h - h2) / r2) : 0.32 (r2) : 0.29 Hoehe : 0.97200 Volumen : 1.7108
r quadrat * L : 0.57 acos ((r-h)/r) : 3.14 (r-h) : -0.54 ((Wurzel aus 2 * r * h - h2) / r2) : 0.00 (r2) : 0.29 Hoehe : 1.08000 Volumen : 1.8047
*/



Zur Überprüfung eine Kalkulationstabelle. *.ods kann man leider nicht hochladen.

Ich werde es heute abend gleich mal ausprobieren :smiley:

Habe die überarbeitete Formel von agmue gerade ausprobiert.

Es läuft super :slight_smile: vielen dank noch einmal für die astreine Ausarbeitung die du uns bereitgestellt hast.

Und auch ein großes Dankeschön an alle die hier kräftig mitgedacht haben.

Ich konnte wider einmal viel dabei lernen.