Laden...

Antoine-Gleichung / Thermodynamik mit linearer Interpolation

Erstellt von lhyn vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.288 Views
L
lhyn Themenstarter:in
136 Beiträge seit 2015
vor 6 Jahren
Antoine-Gleichung / Thermodynamik mit linearer Interpolation

Hallo zusammen,

Ich habe ein Problem mit Thermodynamik bzw. mit der erweiterten Antoine-Gleichung.
-> Werde nicht schlau daraus wie ich die Parameter aus den Dampftabellen bekomme...

Dann dachte ich mir, die Dampftabellen genügen als Genauigkeit wobei ich dann einfach zwischen den Punkten interpolieren. (lineare Interpolation)

Nun stellt sich mir die Frage wie ich das Softwaretechnisch hinbekomme?
-> Wie binde ich die Punkte sauber in die Klasse ein und entscheide zwischen welchen zwei Punkten ich mich befinde, damit ich eine linear Funktion anwenden kann?

Ich danke Euch für die Unterstützung.

Gruss Lhyn

5.658 Beiträge seit 2006
vor 6 Jahren

Hi lhyn,

lineare Interpolation ist nichts weiteres als eine Anwendung des Dreisatzes. Wenn du damit Probleme hast, mußt du schon etwas konkreter werden.

Wie du das ganze umsetzt, hängt doch von deinen Anforderungen ab. So ganz allgemein, wie du fragst, wirst du da keine Antwort bekommen, die dir weiterhelfen würde. Du kannst ja selbst erstmal überlegen: Welche Daten hast du vorliegen, welche Berechnungen sollen damit durchgeführt werden, und welche Daten sollen zurückgegeben werden? Dann ergibt sich der Programmablauf und das Interface (quasi) von alleine.

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo lhyn,

wie ich die Parameter aus den Dampftabellen bekomme...

Was verstehst du unter "Dampftabelle" bzw. welche hast du?

In der Antoine-Gleichung sind die Parameter {A, B, C} bzw. in der erweiterten Form {A, B, C, D, E, F} empirisch ermittelt und daher gibt es dazu auch eigenen Tabellen. Zur Online-Abfrage kannst du z.B. die Dortmunder Datenbank anzapfen -> Saturated Vapor Pressure.

Zur Frage der Interpolation müssen wir zuerst den Aufbau deiner verwendeten Dampftabelle kennen.
Aber grundsätzlich baue eine geordnete Liste mit Wertpaaren (T, Sattdampdruck). Suche dann auf Basis von T das Wertpaar, das die Zieltemperatur umschließt und interpoliere dann.

Aber durch Anwendung der Antoin-Gleichung ist ein Interpolieren eigentlich nicht nötig.
Durch die Antoine-Gleichung ergibt sich i.d.R. eine abschnittsweise definierte Funktion, die sich ja leicht umsetzen lässt (falls die Parameter gefunden wurden 😉).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lhyn Themenstarter:in
136 Beiträge seit 2015
vor 6 Jahren

Hallo zusammen,

Ich habe im Anhang mal die Dampftafel eingefügt um welche es sich dabei handelt.

Es geht um die Abhängigkeit zwischen Druck und Temperatur des Kältemittels R134a.

@gfoidl, genau diese erweiterten Parameter {D, E, F} kann ich nicht finden, ist definitiv die eleganteste Lösung 😁

@MrSparkle, ich habe das Problem mal versucht in Code zu übersetzen:



        private double CalculateTest(double xCoordinate /*Wert 126.75*/)
        {
            // Werte sind nicht aus Dampftabelle
            double xPoint1 = 0;     //Soll ich diese Koordinaten in ein 2D-Array oder Liste packen? 
            double xPoint2 = 10.75;
            double xPoint3 = 100;
            double xPoint4 = 1000;

            double yPoint1 = 25;
            double yPoint2 = 289;
            double yPoint3 = 150.165;
            double yPoint4 = 102.15;

            //Entscheiden zwischen welchen Werten ich momentan auf der x-Achse stehe...wie sauber lösen?
            //xCoordinate steht bei angenommen 126.75 also befinde ich mich zwischen Punkt 3 und Punkt 4

            return LinearFunction(xCoordinate, xPoint3, yPoint3, xPoint4, yPoint4);
        }

        private double LinearFunction(double x, double x1, double y1, double x2, double y2)
        {
            return (y2 - y1) / (x2 - x1) * (x - x1) + y1;
        }


Gruss Lhyn

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo lhyn,

das lässt sich besser abbilden. Guck mal, so in etwa würde ich das machen.


class Program
{
    static void Main()
    {
        var dampfTafel = new DampfTafel(DampfTafelQuelle.LeseNachTempSortierteWerte());

        DampfPunkt werteFür2C = dampfTafel.GetDampfDruck(2);
    }
}

[DebuggerDisplay("{" + nameof(TempInC) + "} °C | {" + nameof(DruckInBar) + "} bar")]
public struct DampfPunkt
{
    public double TempInC { get; }
    public double DruckInBar { get; }

    public DampfPunkt(double tempInC, double druckInBar)
    {
        this.TempInC = tempInC;
        this.DruckInBar = druckInBar;
    }
}

public static class DampfTafelQuelle
{
    public static IEnumerable<DampfPunkt> LeseNachTempSortierteWerte()
    {
        yield return new DampfPunkt(-50, 0.299);
        yield return new DampfPunkt(-45, 0.396);
        // usw.
        // od. Lesen aus einer Datei, Datenbank, wie auch immer es zur Verfügung steht
        yield return new DampfPunkt(0, 2.929);
        yield return new DampfPunkt(5, 3.497);
        yield return new DampfPunkt(10, 4.146);
    }
}

public class DampfTafel
{
    private readonly DampfPunkt[] _dampfPunkte;

    public DampfTafel(IEnumerable<DampfPunkt> dampfPunkte)
    {
        _dampfPunkte = dampfPunkte?.ToArray() ?? throw new ArgumentNullException(nameof(dampfPunkte));
    }

    public DampfPunkt GetDampfDruck(double tempInC)
    {
        int idx = Array.BinarySearch(_dampfPunkte, new DampfPunkt(tempInC, double.NaN), new DampfPunktTempComparer());

        if (idx > 0) return _dampfPunkte[idx];

        idx = ~idx;
        DampfPunkt p0 = _dampfPunkte[idx - 1];
        DampfPunkt p1 = _dampfPunkte[idx];

        // lineare Interpolation
        double druck = p0.DruckInBar + (p1.DruckInBar - p0.DruckInBar) / (p1.TempInC - p0.TempInC) * (tempInC - p0.TempInC);

        return new DampfPunkt(tempInC, druck);
    }

    private class DampfPunktTempComparer : Comparer<DampfPunkt>
    {
        public override int Compare(DampfPunkt x, DampfPunkt y) => x.TempInC.CompareTo(y.TempInC);
    }
}

Index-Prüfungen, etc. kannst du selbst einbauen.

genau diese erweiterten Parameter {D, E, F} kann ich nicht finden, ist definitiv die eleganteste Lösung

Ist die "einfache" bzw. klassische Antoine-Gleichung zu ungenau?
Bedenke dass auch durch Interpolation Fehler entstehen, daher ist es dann abzuwägen welche Methode genauer ist.
Vergleich das einmal und überlege inwiefern die Genauigkeit für die Endanwendung eine Rolle spielt.
Da der Verlauf sich logarithmisch als Gerade abbilden lässt, könntest du für die Interpolation die Werte logarithmisch speichern, dann als Gerade interpretieren und so genauer interpolieren, anschließend wieder zurückrechnen. Aber ich vermute dass dies seitens Berechnung zu genau für den praktischen Anwendungsfall sein wird.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
1.090 Beiträge seit 2011
vor 6 Jahren

Wenn du für die Erweiterte Antoine-Gleichung mit deiner Tabelle 6 Gleichungen aufstellst, solltest du sie berechnen können. Oder Übersehe ich da jetzt was?

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Palin,

du übersiehst nichts.

p = f(T, A, B, C, D, E, F) und anhand der Tabelle lassen sich Paare (p,T) bilden. Somit ist es ein (lineares) Gleichungssystem (zumindest nach minimaler Umformung).

Kältemittels R134a

Dazu findet sich nichts? Es gibt auch noch andere Gleichungen und mich würde es wundern, falls es dazu keine Parameter gibt, da dieses Kältemittel doch recht häufig verwendet wird.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"