Deutsch
Quelltexte/ Codesnippets

Curve Fitting - Gegeben: Messpunkte, gesucht: Die beste Formel dazu!

 

p.specht

Es ist nicht immer leicht, zu einem empirisch gefundenen Bezug zwischen zwei Größen eine geeignete mathematische Formel zu finden. Das folgende Programm hilft dabei, eine Funktion mit möglichst kleiner Abweichung von den tatsächlichen Messergebnissen zu finden - auf Englisch heißt das "Curve fitting". Achtung, reine Demo - Rechtslage ungeprüft!
WindowTitle "KURVEN-ANPASSUNG an Meßpunktwolke"
'{ (D) Demoware, 2012-05 übersetzt aus HP-Basic nach XProfan by P. Specht
' Ohne jegliche Gewähr! Nutzung in alleiniger Verantwortung des Anwenders!
' Rechtsvermerk der Vorlage:
' Copyright  1987
' John H. Mathews
' Dept. of Mathematics
' California State University, Fullerton
' Nonlinear Curve Fitting
' PROGRAM CURVEFIT
'}
'{ MAIN LOOP
AppendMenubar 10,"Welcher Gleichungstyp gibt meine Messdaten am besten wieder?"
Font 2:Randomize:Set("decimals",15)' : Set("numwidth",15)
Var MaxN&=100
Declare X![100],X1![100],Y![100],Y1![100]
Declare ans$,tmp$,n&,k&,CTYPE&,A!,B!,C!,D!,E!,F!,X!
Declare XMEAN!,YMEAN!,SUMX!,SUMXY!,ERRER!,L!,LM!
g115:
p200' call SUBROUTINE GET DATA
g125:
p400' call SUBROUTINE CURVE TYPE
p2000' call SUBROUTINE CHANGE VARIABLES
p3000' call SUBROUTINE LINEAR REGRESSION
p4000' call SUBROUTINE CONSTANTS
p5000' call SUBROUTINE RESULTS
Print "\n WANT TO FIT ANOTHER CURVE TO THIS DATA ? ";
Input ANS$
Case (ANS$ = "Y") Or (ANS$ = "y") Or (ANS$ = "J") Or (ANS$ = "j"): p6000' call SUBROUTINE REFRESH
Case (ANS$ = "Y") Or (ANS$ = "y") Or (ANS$ = "J") Or (ANS$ = "j"): Goto "g125"
Print "\n WANT TO FIT A CURVE FOR SOME NEW DATA? ";
Input ANS$
Case (ANS$ = "Y") Or (ANS$ = "y") Or (ANS$ = "J") Or (ANS$ = "j"): Goto "g115"
Goto "g9999"
'}

Proc p200' SUBROUTINE GET DATA

    CLS Rnd(8^8)
    Print "\n Verwendet wird die Methode 'Daten-Linearisierung'"
    Print " Verfügbare Formeln:\n"
    Print " (1) Y=A*X+B,   (2) Y=A/X+B,   (3) Y=D/(X+C)       "
    Print " (4) Y=1/(A*X+B), (5) Y=X/(A+B*X), (6) Y=A*Ln(X)+B "
    Print " (7) Y=C*Exp(A*X),  (8) Y=C*X^A,  (9) Y=(A*X+B)^-2 "
    Print " (10) Y=C*X*Exp(-D*X),    (11) Y=L/(1+C*Exp(A*X))  "
    Print "\n ...für N Messpunkte (X1,Y1),(X2,Y2)...(Xn,Yn) "
    Print " Anzahl der Messpunkte:  N = ";
    Input N&
    Case  N&<2:N&=2
    Print

    WhileLoop n&:K&=&Loop

        Print "X(";K&;") = ";
        Input tmp$
        X![K&]=Val(tmp$)
        X1![K&]=X![K&]
        Locate %csrlin-1,%pos+35
        Print "Y(";K&;") = ";
        Input tmp$
        Y![K&]=Val(tmp$)
        Y1![K&]=Y![K&]
        'PRINT

    EndWhile

EndProc

Proc p400' SUBROUTINE CURVE_TYPE

    CLS Rnd(8^8)
    Print "      WHICH CURVE DO YOU WANT TO FIT ?\n"
    Print " 1:   Y = A * X + B"
    Print " 2:   Y = A / X + B"
    Print " 3:   Y = D / (X + C)"
    Print " 4:   Y = 1 / (A * X + B)"
    Print " 5:   Y = X / (A + B * X)"
    Print " 6:   Y = A * Ln(X) + B"
    Print " 7:   Y = C * Exp(A * X)"
    Print " 8:   Y = C * X^A"
    Print " 9:   Y = (A * X + B)^-2"
    Print "10:   Y = C * X * EXP(-D * X)"
    Print "11:   Y = L / (1 + C * EXP(A * X) )\n"
    Print "      CHOOSE TYPE OF CURVE [1-11]: ";
    Input CTYPE&

    If  CTYPE& = 11

        Goto "g550"

    Else

        Goto "g645"

    EndIf

    g550:
    CLS
    Print
    Print "     YOU CHOSE THE CURVE  Y = L / (1 + C * EXP(A * X))"
    Print
    Print " THE LIMITING  VALUE  L =  LIM   Y(X)  MUST BE GIVEN."
    Print "                                         X ->INF"
    Print
    Print " ENTER  THE  VALUE    L = ";
    Input L!
    LM!=Abs(Y![1])

    WhileLoop 2,n&:k&=&Loop

        Case LM!<Abs(Y![K&]): LM!=Abs(Y![K&])

    EndWhile

    Case L!<=LM!: L!=LM! * 1.0001
    g645:

EndProc

Proc p1000' SUBROUTINE FUNCTIONS

    Select CTYPE&

        CaseOf 1: F!=A!*X!+B! : Goto "g1115"

        CaseOf 2: F!=A!/X!+B! : Goto "g1115"

        CaseOf 3: if (X!+C!)<>0:F!=D!/(X!+C!): Else F!=10^30:endif :Goto "g1115"

        CaseOf 4: F!=1/(A!*X!+B!) : Goto "g1115"

        CaseOf 5: F!=X!/(A!+B!*X!) : Goto "g1115"

        CaseOf 6: F!=A!*LG(X!)+B! : Goto "g1115"

        CaseOf 7: F!=C!*Exp(A!*X!) : Goto "g1115"

        CaseOf 8: F!=C!*Exp(A!*LG(X!)) : Goto "g1115"

        CaseOf 9: F!=1/((A!*X!+B!)*(A!*X!+B!)) : Goto "g1115"

        CaseOf 10: F!=C!*X!*Exp(-D!*X!) : Goto "g1115"

        CaseOf 11: F!=L!/(1+C!*Exp(A!*X!))

    EndSelect

    g1115:

EndProc

Proc p2000' SUBROUTINE CHANGE VARIABLES

    WhileLoop n&:k&=&Loop

        Select CTYPE&

            CaseOf 1

            X![K&]=X1![K&]:Y![K&]=Y1![K&] : Goto "g2118"

            CaseOf 2

            X![K&]=1/X1![K&]:Y![K&]=Y1![K&] : Goto "g2118"

            CaseOf 3

            X![K&]=X1![K&]*Y![K&]:Y![K&]=Y1![K&] : Goto "g2118"

            CaseOf 4

            X![K&]=X1![K&]:Y![K&]=1/Y1![K&] : Goto "g2118"

            CaseOf 5

            X![K&]=1/X1![K&]:Y![K&]=1/Y1![K&] : Goto "g2118"

            CaseOf 6

            X![K&]=LG(X1![K&]):Y![K&]=Y1![K&] : Goto "g2118"

            CaseOf 7

            X![K&]=X1![K&]:Y![K&]=LG(Y1![K&]) : Goto "g2118"

            CaseOf 8

            X![K&]=LG(X1![K&]):Y![K&]=LG(Y1![K&]) : Goto "g2118"

            CaseOf 9

            X![K&]=X1![K&]:Y![K&]=1/SQR(Y1![K&]) : Goto "g2118"

            CaseOf 10

            X![K&]=X1![K&]:Y![K&]=LG(Y1![K&]/X1![K&]) : Goto "g2118"

            CaseOf 11

            X![K&]=X1![K&]:Y![K&]=LG(L!/Y1![K&]-1) : Goto "g2118"

        EndSelect

        g2118:

    EndWhile

Endproc

Proc p3000' SUBROUTINE LINEAR REGRESSION

    XMEAN!=0

    WhileLoop n&:k&=&Loop

        XMEAN!=XMEAN!+X![K&]

    EndWhile

    XMEAN!=XMEAN!/n&
    YMEAN!=0

    WhileLoop n&:k&=&Loop

        YMEAN!=YMEAN!+Y![K&]

    EndWhile

    YMEAN!=YMEAN!/N&
    SUMX!=0

    WhileLoop n&:k&=&Loop

        SUMX!=SUMX!+(X![K&]-XMEAN!)*(X![K&]-XMEAN!)

    EndWhile

    SUMXY!=0

    WhileLoop n&:k&=&Loop

        SUMXY!=SUMXY!+(X![K&]-XMEAN!)*(Y![K&]-YMEAN!)

    EndWhile

    A!=SUMXY!/SUMX!
    B!=YMEAN!-A!*XMEAN!

EndProc

Proc p4000' SUBROUTINE CONSTANTS

    If  CTYPE& = 3

        Goto "g4020"

    Else

        Goto "g4050"

    EndIf

    g4020:
    C!= -1.0/A! : D!= -B!/A! : Goto "g4210"
    g4050:

    If  CTYPE& = 7

        Goto "g4070"

    Else

        Goto "g4090"

    EndIf

    g4070:
    C!=Exp(B!) : Goto "g4210"
    g4090:

    If  CTYPE& = 8

        Goto "g4110"

    Else

        Goto "g4130"

    Endif

    g4110:
    C!=Exp(B!) : Goto "g4210"
    g4130:

    If  CTYPE& = 10

        Goto "g4150"

    Else

        Goto "g4180"

    EndIf

    g4150:
    C!=Exp(B!):D!= -1*A! : Goto "g4210"
    g4180:

    If  CTYPE& = 11

        Goto "g4200"

    Else

        Goto "g4210"

    EndIf

    g4200:
    C!=Exp(B!)
    g4210:

EndProc

Proc p5000' SUBROUTINE RESULTS

    CLS

    Select CTYPE&

        CaseOf 1

        Print "  F(X) = A*X +B"
        Print
        Print "    A  = ",A!
        Print "    B  = ",B!
        Goto "g5120"

        caseof 2

        Print "  F(X) = A/X + B"
        Print
        Print "    A  =",A!
        Print "    B  =",B!
        Goto "g5120"

        caseof 3

        Print "  F(X) = D/(X + C)"
        Print
        Print "    C  =",C!
        Print "    D  =",D!
        Goto "g5120"

        CaseOf 4

        Print "  F(X) = 1/(A*X + B)"
        Print
        Print "    A  =",A!
        Print "    B  =",B!
        Goto "g5120"

        CaseOf 5

        Print "  F(X) = X/(A + B*X)"
        Print
        Print "    A  =",A!
        Print "    B  =",B!
        Goto "g5120"

        CaseOf 6

        Print "  F(X) = A*Ln(X) + B"
        Print
        Print "    A  =",A!
        Print "    B  =",B!
        Goto "g5120"

        CaseOf 7

        Print "  F(X) = C*Exp(A*X)"
        Print
        Print "    A  =",A!
        Print "    C  =",C!
        Goto "g5120"

        CaseOf 8

        Print "  F(X) = C*X^A"
        Print
        Print "    A  =",A!
        Print "    C  =",C!
        Goto "g5120"

        caseof 9

        Print "  F(X) = (A*X + B)^-2"
        Print
        Print "    A  =",A!
        Print "    B  =",B!
        Goto "g5120"

        CaseOf 10

        Print "  F(X) = C*X*EXP(-D*X)"
        Print
        Print "    C  =",C!
        Print "    D  =",D!
        Goto "g5120"

        CaseOf 11

        Print "  F(X) = L/(1+C*EXP(A*X))"
        Print
        Print "    L  =",L!
        Print "    C  =",C!
        Print "    A  =",A!

    EndSelect

    g5120:
    Print
    Print "K            Xk            Yk           F(Xk)       Error  "
    Print "_______________________________________________"

    WhileLoop n&:k&=&Loop

        X! = X1![K&]
        p1000' call SUBROUTINE FUNCTIONS
        ERRER!=Y1![K&] - F!
        Print K&, X1![K&], Y1![K&], F!, ERRER!

    EndWhile

EndProc

Proc p6000' SUBROUTINE REFRESH

    WhileLoop  N&:k&=&Loop

        X![K&]=X1![K&]
        Y![K&]=Y1![K&]

    EndWhile

EndProc

g9999:
End
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
07.05.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

431 Betrachtungen

Unbenanntvor 0 min.
Ernst21.07.2021
Uwe ''Pascal'' Niemeier13.06.2021
R.Schneider28.05.2021
Michael W.28.05.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie