Methode der kleinsten Quadrate

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
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

Hallo liebe Python Community!

Ich hab folgendes Problem:

Unser Uni Überprüfungsprogramm sagt bei meinen Code für die Methode der kleinsten Quadrate immer "No function found" bzw auch "No results returned", da es bei uns auf der Uni generel grad ein paar Probleme gibt würd ich nur von euch gern hören ob ihr es als richtig anseht was ich gemacht habe und das Uni-tool spinnt oder ob der Fehler bei mir liegt,
hier mal der Code:


Code: Alles auswählen

# add more modules if necessary
import numpy 

## Function reads the x-y-Data from a file.
#  @param  filename      : name of the file including path and file type
#  @return xData, yData  : (n,1) matrix of x values and (n,1) matrix of y values

def readXYData(filename):    
    infile = open(filename,'r')
    x = []
    y = []
    
    for line in infile:
        s = line.split()
        x.append(float(s[0]))
	try:
           y.append(float(s[1]))
	except:
           y.append(0.0)
           continue
    infile.close()

    nData = len(x)
    xData = numpy.zeros((nData,1))
    yData = numpy.zeros((nData,1))
    for i in range(0,nData,1):
        xData[i,0] = x[i]
        yData[i,0] = y[i]	
	
    return xData, yData



## Functions computes the coefficients for the least-squares method applied to
#  abitrary functions.
#  @param  xData     : x-coordinates of the data points, (n,1) matrix
#  @param  yData     : y-values of the data points,      (n,1) matrix
#  @param  functions : list of given functions, function name as string, (n)-list
#          functions = ['x**0','x**3','math.sin(x)']
#  @return a         : coefficients of the lsq-function, (n,1) matrix  or error str.

def lsCoeffs(xData,yData,functions):    
    
    
    nx,mx=xData.shape
    ny,my=yData.shape
    
    
    if nx!=ny :
        return 'ERROR INPUT_DIMENSIONS'
     
    nf=functions.shape[0] 
    S=numpy.zeros((nf,nf),numpy.float)
    c=numpy.zeros((nf,1),numpy.float)
   
    
    for j in range(nf):
         for k in range(nf):
            for i in range(nx):
                 x=xData[i,0]
                 phi_j=functions[j]          #functions = ['x**0','x**3','math.sin(x)']
                 phi_k=functions[k]
                 S[j,k] = S[j,k]+eval(phi_j)*eval(phi_k)
             
         
         
    for j in range(nf):
        for i in range(nx):
             x=xData[i,0]
             y=yData[i,0]
             phi_j=functions[j]
             c[j,0]=c[j,0]+eval(phi_j)*y
             
             
    a=numpy.linalg.solve(S,c)
    
    
    return a   


 ## Function evaluates the lsq-function for a given x-value
#  @param  coeffs    : coefficients of the lsq-function, (n,1) matrix
#  @param  functions : list of given functios, function name as string, (n)-list
#  @param  x         : value at which the lsq-function is evaluated, scalar
#  @return y         : result of evaluation, scalar or error string

def evalLS(coeffs,functions,x):   #diesen Teil könnte ich noch nicht testen
    
    nf=functions.shape[0]
    nc,mc=coeffs.shape
    
    if nc!=nf:
        return 'ERROR INPUT_DIMENSIONS'
    
    y=0
    for j in range(nf):
         phi_j=functions[j]
         y+=coeffs[j,0]*eval(phi_j)
         
    
    

    return y 
Vielen Dank für schnelle Rückmeldung (Abgabe Termin ist Mittwoch der 16.06.2010 23:55) :lol: :-)

Mfg dugbug
Zuletzt geändert von dugbug am Dienstag 15. Juni 2010, 23:09, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Wo kommt das? Wann kommt das? Und was ist die genaue Fehlermeldung? Ich werd mich jetzt bestimmt nicht durch den Code wühlen und raten. Bei sowas bitte immer ein lauffähiges Minimalbeispiel (incl. Testdaten) posten, das den Fehler reproduziert.
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

Der Fehler, sollte er bei mir liegen, ist das meine Funktion zur bestimmung des Koeffizienten Vektors a nicht vorhanden sein soll, bzw auch das nichts Returned wird, aber es kann auch sein dass das Uni-tool das seine Testdaten durchjagt spinnt, den wenn ein falsches Resultat bzw,falscher typ zurückgegeben wird gibt es andere Fehlermeldungen(Type error,etc...).
Und im Moment spinnt unser Uni Computersystem generel rum.
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

Da es grad wieder kurz ging so sieht die Exakte Fehlermeldung unseres Uni-tools aus:


CHECK FUNCTION: lsCoeffs
Level 0: Input Dimensions
Function -> OK
Results -> OK
Level 1: Numerics
Function does not exist in file!->FAILED
Results -> FAILED, no result returned!

CHECK FUNCTION: evalLS
Level 0: Input dimensions
Function does not exist in file!->FAILED
Results -> FAILED, no result returned!
Level 1: Numerics
Function does not exist in file!->FAILED
Results -> FAILED, no result returned!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Woher sollen wir wissen, wie dein „Uni-Tool“ funktioniert?
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

Geht nicht darum das ihr wißt wie unser Uni tool funktioniert sonder mehr um ob ihr einen Fehler erkennt der irgendwie verhindert das die Funktion nicht auf gerufen wird bzw nichts zurückgegeben wird, ich bin halt nach stundenlangen druchschaun der meinung das zumindest die "lsCoeffs" Richtig sein muß und was zurückgegeben wird, nur wollt ich halt mal die meinung von Profis hören a la "ich kann keinen fehler finden" oder "eventuell könnte das oder das sein"

danke
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Hast du denn mal versuchst die Funktion selbst aufzurufen? Ohne Uni-Tool? Dann kommt vermutlich auch eine sinnvollere Fehlermeldung.
BlackJack

@dugbug: Wo kommen denn die `functions`-Argumente her? In den Kommentaren steht was von "function name", aber in der einen Beispielliste stehen die "Funktionen" als Zeichenketten. Wie sieht die Vorgabe dafür denn aus? Funktionen sind in Python auch Objekte, es wäre also sauberer dort Funktionsobjekte zu übergeben statt Zeichenketten die mit `eval()` ausgewertet werden. Im dritten Beispiel wird `math.sin()` verwendet -- die Funktion scheint mir aber gar nicht zur Verfügung zu stehen!?

Ansonsten schliesse ich mich den Vorrednern an -- Du musst Dir selber Beispieldaten ausdenken und das gegen diese auf Deinem Rechner laufen lassen und schauen ob das richtige herauskommt. Nur gegen ein Testwerkzeug zu Programmieren das so wenig auskunftsfreudig ist, bringt nicht viel wenn es Probleme gibt.
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

hmmm.. was müßte ich implementieren damit ich die math.sin(x)-Funktion zu verfügung habe?

Mfg dugbug
BlackJack

Du programmierst Funktionen von denen Du selber nicht weisst wie Du sie benutzt? Nach welchen Kriterien hast Du die denn dan programmiert!?
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

naja in meiner test datei hat er bei mir math.sin(x) funktioniert von daher weis ich nicht worauf du hinaus willst
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

dugbug hat geschrieben:hmmm.. was müßte ich implementieren damit ich die math.sin(x)-Funktion zu verfügung habe?
Implementieren gar nichts, nur importieren. Die Fehlermeldung "NameError: name 'math' is not defined" sollte doch relativ eindeutig sein.

Code: Alles auswählen

import math
dugbug
User
Beiträge: 9
Registriert: Donnerstag 3. Juni 2010, 13:08

So jetzt klappts tut mir leid, werd mir in zukunft die sachen selber noch genauer ansehen bevor ich hier was poste.

Mfg dugbug


PS: Das Problem war natürlich das .shape bei einer liste nicht geht, da ich aber in der datei in der ich das grund gerüst aufgezogen habe functions als numpy.array definiert habe ist es mir nicht aufgefallen
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

dugbug hat geschrieben:natürlich
:?:

Natürlich ist da nichts: Das hätten wir Dir ziemlich leicht sagen können, aber, wie schon von meinen Vorschreibern angedeutet haben: Wir können nicht helfen, in dem wir nur raten. Versuche demnächst funktionierende Minimalbeispiele zu zeigen (und sei es, das sie nur einen funktionieren in dem sie reproduzierbare Fehler zeigen).

Gruß,
Christian
Antworten