2 fache interpolation aus Tabelle

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

Hallo liebe Python-User,

seit 2 Wochen nutzte ich Python um einen Algorithmus zu schreiben und bin noch Neuling.
Ich habe auch gleich schon ein kleines Probem. Und zwar habe ich eine Tabelle (.csv Datei) https://www.dropbox.com/s/kfi7kj3iay8voy0/Gas.csv :

Die Enthalpie ist in Abhängikeit von Druck(waagerecht) und Temperatur (senkrecht) gegeben.
Ich muss nun eine Enthalpie in Abhängigkeit dieser Größen interpolieren.

D.h bei einer Temp von z.B. 64°C und einem Druck von 15.9 bar muss ich die Enthalpie durch eine 2 fache Interpolation ermitteln.

Könnt ihr mir bei diesem Problem vlt auf die Sprünge helfen?

Habe es bisher nur geschafft die Tabelle einzulesen

Code: Alles auswählen

import numpy as np 
import csv

l1=[]
l2=[]
l3=[]
l4=[]
l5=[]
l6=[]
l7=[]
l8=[]
l9=[]
l10=[]


r = csv.reader(open("Dampfdruck_R22.csv"), delimiter=";")
r134a = csv.reader(open("R134a_ueberhitzt.csv"), delimiter=";")


for eintrag1 in r134a:

      #print eintrag1
      l3.append(eintrag1[0])
      l4.append(eintrag1[1])
      l5.append(eintrag1[2])
      l6.append(eintrag1[3])
      l7.append(eintrag1[4])
      l8.append(eintrag1[5])
      l9.append(eintrag1[6])
      l10.append(eintrag1[7])
     
print l3
print l4
print l5
print l6
print l7
print l8
print l9
print l10
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo danort,

Du bindest aus einem nicht ersichtlichen Grund bereits numpy ein. Dann nutze es doch auch um Deine Tabelle zu laden; das Durchnummerieren von Variablen ist nämlich eine sehr schlechte Idee, nicht nur, dass Du ständig die selben Zeilen wiederholst. scipy.interpolate bietet Dir dann einige Interpolationsmethoden an.
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

Danke für deine Antwort.

Numpy habe ich vorher bei einer einfachen Interpolation bereits verwendet. Dort habe ich die zwei Spalten der Matrix vorher in Listen überführt und daraus interpoliert.....

Leider bin ich wirklich Anfänger. Ich weiß nicht wie ich mit numpy die Tabelle laden kann und warum?!?

Hast du vlt ein Beispiel zur Hand, aus dem hervorgeht wie man an die Sache rangeht?




PS:
Ich habe nun folgendes gefunden:

Code: Alles auswählen

from scipy.interpolate import griddata

>>> grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')

Leider weiß ich nicht wie ich meine Tabelle aufbereiten soll um die zu interpolierenden Werte übergeben zu können.....

Danke
BlackJack

@danort: `numpy` bietet Funktionen zum laden von Daten in Tabellenform. Warum es die bietet? Das ist 'ne komische Frage. Vielleicht weil so etwas im Zusammenhang mit solchen Daten sinnvoll ist, und viele Leute so etwas gebrauchen können, die solche Daten verarbeiten wollen‽ ;-)

Wie die Funktionen heissen und wie sie funktionieren steht in der Dokumentation von `numpy`. Und zwar sowohl im Handbuch als auch in der Referenz.

Ein Tutorial gibt es auch, das sollte man IMHO mal durchgearbeitet haben bevor man etwas mit `numpy` macht. Und davor natürlich ein Python-Tutorial, weil man diese Grundlagen natürlich braucht um `numpy` sinnvoll nutzen zu können.
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

Wie ich bereits sagte: Ich bin Anfänger


Also wäre es sehr nett, wenn ihr mir z.b. sagen würdet wie eine dieser Funktionen heißt.

Schaue mir die ganze Zeit Beispiele an aber mein Problem finde ich nirgends....
BlackJack

@danort: So funktioniert Programmieren nicht. Man sucht nicht zu jedem Problem ein Beispiel das passt, das findet man auch gar nicht zu jedem Problem, sondern man lernt die Grundlagen und entwickelt damit dann eine passende Lösung zum Problem. Beispiele sind dabei hilfreich um die Grundlagen zu verstehen, aber nicht um blind als Lösungen übernommen zu werden. Um sinnvoll mit `numpy` arbeiten zu können muss man die Grundlagen verstehen. Also das was im Kapitel `Numpy basics` im Handbuch steht. Wenn Du das durcharbeitest wirst Du auch auf ein Unterkapitel stossen was sich genau mit dem Problem des einlesens von Textdaten beschäftigt. Da findest Du Funktionen. In der Referenzdokumentation sind diese Funktionen beschrieben und all ihre Argumente und jeweils ähnliche Funktionen die man sich anschauen könnte. Die Funktionsnamen im Handbuch sind links zur Referenzdokumentation der jeweiligen Funktion. Man kann da also leicht navigieren.
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

Kannst du mir denn bei der Vielzahl von Dokumentationen und Einführungen eine besonders Empfehlen für mein Problem/im Allgemeinen?




Danke!
BlackJack

@danort: Bezüglich `numpy` bezog ich mich auf das Handbuch und die Referenzdokumentation. Also halt die `numpy`-Dokumentation. Wenn man sich auf den Numpy/Scipy-Seiten umschaut kommt man auch auf diese Übersicht: http://wiki.scipy.org/Additional_Documentation

Python selbst hat auch umfangreiche Dokumentation. Inklusive eines Tutorials. Für absolute Programmieranfänger wird oft Learn Python The Hard Way empfohlen. Kein Ahnung ob das für Dich noch geeignet ist oder in zu kleinen Schritten vorgeht.
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

Danke!

Das war dein 20.000 Beitrag! Glückwunsch ;)
BlackJack

Ach Du meine Güte. Ich verbringe eindeutig zu viel Zeit vor dem Rechner (und in diesem Forum) :D
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

So, hier meine funktionierende! Lösung.
Nicht schön aber selten. Habe die Werte durch if-Bedingungen eingeteilt......


Hat jmd. Verbesserungsvorschläge?

Code: Alles auswählen

import scipy
import numpy as np


z = np.array([ [387.6, 173.8, 173.9, 174.1, 174.2, 174.4, 174.6],
               [395.6, 186.8, 186.9, 187.1, 187.2, 187.4, 187.5],
               [403.7, 200.0, 200.2, 200.3, 200.4, 200.5, 200.7],
               [412.0, 213.6, 213.7, 213.8, 213.9, 214.0, 214.1],
               [420.3, 411.6, 227.5, 227.6, 227.6, 227.7, 227.7],
               [428.8, 421.2, 241.7, 241.7, 241.7, 241.7, 241.7],
               [437.5, 430.6, 419.9, 256.3, 256.2, 256.2, 256.1],
               [446.3, 440.1, 430.9, 271.5, 271.4, 271.2, 271.0],
               [455.3, 449.6, 441.5, 287.3, 286.9, 286.6, 286.3],
               [464.4, 468.9, 462.4, 454.9, 445.8, 433.4, 321.4],
               [473.7, 468.9, 462.4, 454.9, 445.8, 433.4, 321.4],
               [483.1, 478.8, 472.8, 458.4, 448.9, 435.8, 341.3],
               [492.7, 488.7, 483.2, 477.2, 470.4, 462.6, 453.1],
               [502.5, 498.7, 493.7, 488.2, 482.2, 475.5, 467.8],
               [512.4, 508.9, 504.2, 499.2, 493.8, 487.9, 481.3] ])

#reale Werte
p=15.87
t_real=38
#Tabelle einteilen
if t_real<=-10 and t_real>=-20:                   
    t=0
    t1=-20
elif t_real<=0  and t_real>=-10:
    t=1
    t1=-10
elif t_real<=10 and t_real>=0:
    t=2
    t1=0
elif t_real<=20 and t_real>=10:
    t=3
    t1=10
elif t_real<=30 and t_real>=20:
    t=4
    t1=20
elif t_real<=40 and t_real>=30:
    t=5
    t1=30
elif t_real<=50 and t_real>=40:
    t=6
    t1=40
elif t_real<=60 and t_real>=50:
    t=7
    t1=50
elif t_real<=70 and t_real>=60:
    t=8
    t1=60
elif t_real<=80 and t_real>=70:
    t=9
    t1=70
elif t_real<=90 and t_real>=80:
    t=10
    t1=80
elif t_real<=100 and t_real>=90:
    t=11
    t1=90
elif t_real<=110 and t_real>=100:
    t=12
    t1=100
elif t_real<=120 and t_real>=110: 
    t=13
    t1=110

if p<=5 and p>=1:
    p2=5
    p1=1
    p_int=0
elif p<=10 and p>=5:
    p2=10
    p1=5
    p_int=1
elif p<=15 and p>=10:
    p2=15
    p1=10
    p_int=2
elif p<=20 and p>=15:
    p2=20
    p1=15
    p_int=3
elif p<=25 and p>=20:
    p2=25
    p1=20
    p_int=4
elif p<=30 and p>=25:
    p2=30
    p1=25
    p_int=5


t_1=t+1
t2=t1+10
a= z[t,:]
b=z[t_1,:]
t_np=np.linspace(t_real,t_real,7)
c=np.linspace(t1,t1,7)
c1=np.linspace(t2,t2,7)


def interpolation_1(t_np):
            
    i1=((a-b)/(c-c1))*(t_np-c)+a
    
    return i1    


def interpolation_2(p):
    
    k=interpolation_1(t_np)[(p_int)]
    k1=interpolation_1(t_np)[(p_int+1)]
    
    i_end= -(k-k1)/(p2-p1)*(p-p2)+k1

    return i_end

print round(interpolation_2(p),2)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@danort: manchmal denke ich, irgendwo muß die Versteckte Kamera sein.

Code: Alles auswählen

import numpy
from scipy import interpolate

values = numpy.genfromtxt('Gas.csv', delimiter=';')
row_header = values[1:,0]
col_header = values[0,1:]
values = values[1:,1:]

f = interpolate.interp2d(col_header, row_header, values, kind='linear')
print f(15.87, 38)
danort
User
Beiträge: 7
Registriert: Dienstag 1. Oktober 2013, 12:58

ja wahnsinn wie umständlich ich das gemacht habe....

@Sirius3: entschuldige, dass ich als anfänger nicht so gut bin wie du!
Antworten