Excel, Trendlinie und Polynome n-ten Grades

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von FredM.

    Excel, Trendlinie und Polynome n-ten Grades

    Hallo Zusammen,

    ich versuche mein Problem so genau wie möglich zu schildern:

    Ziel: Was möchte ich machen?
    In der Wissenschaft hat man oft viele empirische Messwerte, die man mathematisch als Funktion darstellen will. Das geht oft bei linearen Zusammenhängen mit der Linearen Regression. Es gibt aber auch Fälle mit nichtlinearem Zusammenhang, hier geht man hin und versucht z.B. ein Polynom zu bestimmen. Die meisten Anwender greifen hier auf Excel zurück geben ihre Messwerte ein und legen eine Trendlinie durch und lassen sich das Polynom anzeigen. Schreiben die Formel ab und rechnen damit weiter.

    Problem: Es ist viel Arbeit die Formel abzutippen und es entstehen Rundungsfehler. Bei Excel kann man zw. Polynom 2-6 Grades wählen. Manchmal geht man deswegen auch hin und möchte wissen welches der Polynome den geringsten Fehler hat. Dazu nimmt man die jeweilige Gleichung und rechnet auf die Messwerte zurück und lässt sich den Relativen Fehler anzeigen. So kann man sich dann wenn es nicht klar ersichtlich ist welcher Grad die beste Angleichung entspricht weiterhelfen.

    Also zusammengefasst: Ich möchte ein Algorithmus der mir eine Polynomfunktion zurückgibt, als Sahnehäubchen sollte der Algorithmus noch überprüfen welcher der Polynome den geringsten relativen Fehler hat.

    Was das Berechnen des Polynoms angeht habe ich hier eigentlich alles gefunden was ich brauche: [VB 2010] Polynom berechnen und zeichnen

    Nun ist es aber so, das bei diesem Algorithmus nach Newton der Grad immer gleich Anzahl der Werte - 1 ist. Will man jetzt aber sagen, wir 30 Messwerte nehmen, müsste man ein Polynom 29. Grades berechnen. Daran scheitert aber irgendwann der Prozessor, da die Koeffizienten immer kleiner werden und dann irgendwann Hardwarebedingt so große Rundungsfehler auftreten, das man das ganze vergessen kann. Reduziert man den Grad auf 10 dann rechnet der Algorithmus auch nur bis zum 10 Messwert durch.

    Kann man hier mal ausprobieren: ghg-alsdorf.de/fachkonferenz/mathe/java/Interpolation.htm (einfach viele Werte eingeben und dann Grad reduzieren)

    Excel mancht es hier irgendwie anders, die Frage ist wie?
    Man könnte ja z.B. hingehn und bei 12 Messwerten sagen, benutze nur jeden 3 Messwert, 12/3 = 4 und nutze diese 4 Messwerte und mache daraus ein Polynom 3. Grades.
    Man könnte auch hingehn und immer 3 Messwerte als Mittelwert zusammenfassen und dadurch die anzahl der Werte für den Algorithmus reduzieren.
    Oder gibt es noch andere Möglichkeiten?

    Die Frage ist, welche Methode ist am genausten?

    Im Anhang mal 2 Beispiele wie die Kurven aussehen, es sind also keine großen Schwankungen.
    Bilder
    • Beispiel1.PNG

      54,51 kB, 1.229×510, 3.610 mal angesehen
    • Beispiel2.PNG

      74,44 kB, 1.442×503, 2.321 mal angesehen
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FredM“ ()

    Schau dir mal die RGP-Funktion an. Das ist eine Matrixfunktion,
    da ist dann die Bedienung etwas anders.
    Ich hatte an meinem Arbeitsplatz mal so ein Makro geschrieben,
    das mir beliebige Polynome in diese RGP-Funktion eingesetzt hat.
    Dann brauchst du keine Formeln aus dem Diagramm abzutippen.
    okay das funktioniert ganz gut, die sache ist nur die, ich arbeite mit VB.NET 2010 und möchte eigentlich nicht auf Excel zurückgreifen. Gibts die RPG-Funktion auch irgendwo als Algorithmus offengelegt?

    Ich weiß ich könnte auch Imports Microsoft.Office.Interop und dann Dim xlApp As Excel.Application .... und objExcel.WorksheetFunction.RPG .... aber mich würds schon reizen das einfach auch selber hinzubekommen. Ich habs jetzt trotzdem mal probiert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim xlApp As Excel.Application
    3. Dim xlBook As Excel.Workbook
    4. Dim xlSheet As Excel.Worksheet
    5. Dim RPG(10, 10) As Double
    6. xlApp = New Excel.Application
    7. xlBook = xlApp.Workbooks.Add
    8. xlSheet = xlBook.Worksheets("Tabelle1")
    9. xlApp.Visible = False
    10. xlApp.DisplayAlerts = False
    11. Dim XWerte() As Double
    12. Dim YWerte() As Double
    13. RPG = xlApp.WorksheetFunction.LinEst(YWerte,XWerte^{1.2.3}, 1, 1)
    14. MsgBox(RPG(1, 1))
    15. xlBook.Close()
    16. xlApp.Quit()
    17. End Sub


    Er meckert mir nur bei der Formel bei dem ^

    RPG = xlApp.WorksheetFunction.LinEst(YWerte,XWerte^{1.2.3}, 1, 1)

    "Fehler 1 Der ^-Operator ist für die Typen "1-dimensionales Array von Double" und "1-dimensionales Array von Double" nicht definiert. "
    Fehler 2 "}"
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „FredM“ ()

    Punkte durch Komma ersetzen? Nein hiflt auch nichts

    RPG = xlApp.WorksheetFunction.LinEst(YWerte, xlSheet.Range("A:A") ^ {1, 2, 3}, 1, 1)

    Fehler 1 Der ^-Operator ist für die Typen "Microsoft.Office.Interop.Excel.Range" und "1-dimensionales Array von Integer" nicht definiert.


    Also in Excel sieht die Formel so aus: =RGP(B2:B27;A2:A27^{1.2.3};1;1)

    Und als Makro nimmt er mir das auf:

    VB.NET-Quellcode

    1. Selection.FormulaArray = _
    2. "=LINEST(R[-27]C[-5]:R[-2]C[-5],R[-27]C[-6]:R[-2]C[-6]^{1,2,3},1,1)"
    3. Range("H29").Select
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Vielleicht kannst du damit etwas anfangen. Das ist ein uralter Code, den ich heutzutage
    wahrscheinlich anders schreiben würde.



    VB.NET-Quellcode

    1. Sub eintragen(X_Bereich, Y_Bereich, A_Bereich, Grad As Integer, Null_wert As Boolean)
    2. ' X_Bereich X-Daten zur Berechnung
    3. ' Y_Bereich Y-Daten zur Berechnung
    4. ' A_Bereich Ausgabebereich der Ergebnismatrix
    5. ' Grad Grad des Polynoms
    6. ' Null_wert Soll Kurve durch Nullpunkt gehen oder nicht
    7. On Error GoTo weiter
    8. zeile = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    9. If Null_wert Then
    10. NW = "FALSE"
    11. Else
    12. NW = "TRUE"
    13. End If
    14. 'ActiveCell.FormulaR1C1 = "=INDEX(LINEST(R2C3:R26C3,R2C2:R26C2^COLUMN(INDIRECT(""A:F"")),TRUE,TRUE),1,6)"
    15. Range(A_Bereich).Activate
    16. Z_Max = Mid$(zeile, Grad, 1)
    17. c = Range(A_Bereich).Column
    18. r = Range(A_Bereich).Row
    19. For m = 1 To Grad
    20. ActiveCell.FormulaArray = "=INDEX(LINEST(" & Y_Bereich & "," & X_Bereich & "^COLUMN(INDIRECT(""A:" & "" & Z_Max & """))," & "" & NW & "" & ",TRUE),1," & (Grad + 1) - m & ")"
    21. Cells(r + m, c).Activate
    22. Next m
    23. ActiveCell.FormulaArray = "=INDEX(LINEST(" & Y_Bereich & "," & X_Bereich & "^COLUMN(INDIRECT(""A:" & "" & Z_Max & """))," & "" & NW & "" & ",TRUE),1," & (Grad + 1) & ")"
    24. Cells(r + m, c).Activate
    25. ActiveCell.FormulaArray = "=INDEX(LINEST(" & Y_Bereich & "," & X_Bereich & "^COLUMN(INDIRECT(""A:" & "" & Z_Max & """))," & "" & NW & "" & ",TRUE),3," & 1 & ")"
    26. Range(Cells(r, c), Cells(r + m, c)).Select
    27. Selection.Copy
    28. Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    29. False, Transpose:=False
    30. Cells(r, c).Select
    31. Cells(r, c).Activate
    32. If UserForm1.Formel_zeigen_Check.Value = True Then
    33. XDat_C = Range(UserForm1.X_Wert_Ref).Column
    34. XDat_R = Range(UserForm1.X_Wert_Ref).Row
    35. For n = 1 To Grad
    36. formel = formel + Str(Cells(r - 1 + n, c).Value) & "*" & col_char(XDat_C) & XDat_R & "^" & Str(n) & "+"
    37. Next n
    38. formel = "=" & formel & Str(Cells(r + n - 1, c))
    39. Range(UserForm1.Formel_Ref).Activate
    40. ActiveCell.Formula = formel
    41. End If
    42. If UserForm1.Text_Ausgabe_Check.Value = True Then
    43. For n = 1 To Grad
    44. formela = formela + Str(Cells(r - 1 + n, c).Value) & " * X^" & Str(n) & " +"
    45. Next n
    46. formela = " " & formela & Str(Cells(r + n - 1, c))
    47. Range(UserForm1.Text_Zelle_Ref).Value = formela
    48. End If
    49. weiter:
    50. End Sub
    51. Function col_char(ByVal nummer As Integer) As String
    52. col_char = Chr$(Int(nummer / 26) + 64) & Chr$(((nummer / 26) - Int(nummer / 26)) * 26 + 64)
    53. If Asc(Left(col_char, 1)) <= 64 Then
    54. col_char = Right(col_char, 1)
    55. End If
    56. End Function
    Lass mal das Excel ganz draußen.
    Beschäftige Dich mit Statistik und so. Das was Du als Trend-Funktion bezeichnest, würde ich wahrscheinlich als Spline-Funktion bezeichnen. Eine mächtige und feine Sache, die hier zu erklären der Platz nicht reicht, wo Du aber bei Frau Google eine Menge zu finden kannst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Lass mal das Excel ganz draußen.
    Beschäftige Dich mit Statistik und so. Das was Du als Trend-Funktion bezeichnest, würde ich wahrscheinlich als Spline-Funktion bezeichnen. Eine mächtige und feine Sache, die hier zu erklären der Platz nicht reicht, wo Du aber bei Frau Google eine Menge zu finden kannst.
    Naja, über die Splines bin ich bei meinen Recherchen auch gestoßen, allerdings geht ja ein Spline durch alle Punkte, eine "Trend" Kurve dritten Grades kann ich damit auch nicht aus 10xy Wertepaaren erstellen oder?
    Sieht zumindest in dem Anhang so aus.

    ich finde das hört sich interessant an: vbforums.com/showthread.php?t=…hlight=polynomials&page=2
    Dateien
    • splines.xls

      (187,39 kB, 646 mal heruntergeladen, zuletzt: )
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FredM“ ()

    Stimmt, eine Trendlinie soll ja eigentlich die best mögliche (fitting) Funktion einer Datenreihe
    darstellen. Wenn aber einige Datenpunkte nicht so ganz stimmen, muss sie halt dazwischen
    hindurch gehen und nicht alle schlechten Punkte in ihrem Verlauf mit einschließen.

    Weiterhin ist es in der Wissenschaft ja auch wichtig heraus zu finden, nach welchen
    Gesetzmäßigkeiten Messergebnisse zustande kommen. Da trägt eine einfache
    Funktion ja mehr zum Verständnis bei, als eine komplexe Spline-Darstellung.
    genau und zum Vergleich der verschiedenen Polynome ist das Bestimmtheitsmaß R² ein guter Faktor den man einfach in einer schleife Prüfen kann.

    Nichtsdestotrotz finde ich den Gauß-Jordan-Algorithmus der hier verwendet wird auch sehr interessant vbforums.com/showthread.php?t=…hlight=polynomials&page=2

    Im Anhang mal ein Vergleich von einem Excel RPG Polynom und einem Gauß-Jordan Polynom, man sieht das Gauß-Jordan Polynom glättet um einiges besser, und lässt sich von "Ausreißern" weniger beeinflussen.
    Bilder
    • GausJordan.PNG

      18,19 kB, 563×368, 2.469 mal angesehen
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    hmm stimmt. Fragt sich nur wie...

    Ich hab hier mal meine aktuelle App. Einfach die Werte in der CSV Datei anpassen zum ausprobieren. Dreh mal den Grad auf +12 hoch, da fängts an mit Schwingen. Ich glaube das ist das Runges Phänomen de.wikipedia.org/wiki/Polynomi…tion#Runges_Ph.C3.A4nomen
    Das hatte ich schon beim newtonschen Algorithmus. Das tritt wohl auch hier auf :) aber ich will ja eh kein so hohes Polynom. Aber interessant :)
    Dateien
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „FredM“ ()

    Ich denke schon, dass Splines das ist, was Du brauchst.
    Allgemein:
    Durch n beliebige Punkte einer Schar von n*m Punkten wird eine Kurve 3. Grades gelegt mit folgenden Nebenbedingungen:
    Der Funktionswert des i-ten Splines am Ende ist gleich dem Funktionswert des (i+1)-ten Splines am Anfang.
    Die Ableitung des i-ten Splines am Ende ist gleich der Ableitung des (i+1)-ten Splines am Anfang.
    Die Krümmung des i-ten Splines am Ende ist gleich der Krümmung des (i+1)-ten Splines am Anfang.
    Nebenbedingung: Die Anzahl n kann vorgegeben werden und es müssen nicht alle Punkte berührt werden. Dies wird mit einem Gewicht gesteuert.
    Spiele mal ein wenig damit rum und bekomme ein Gefühl dafür, wie groß Du n wählen kannst (ca. 5).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So ich hab das Programm mit dem Algorithmus fertig gestellt. Bin eigentlich ganz zufrieden mit.
    Hab noch die Berechnung des R² Bestimmtheitsmaß integriert und ein Menü zum laden von CSV Dateien.

    Danke mal so weit für die Hilfe :)


    (Source Code inklusiv)
    Dateien
    • Gauß-Jordan.zip

      (123,12 kB, 846 mal heruntergeladen, zuletzt: )
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Polynomberechnung um Flächenintegralberechnung und txt-File Verarbeitung erweitert

    Hallo zusammen,

    ich habe den Code vor ein paar Tagen gefunden und fand ihn soweit gut.
    Mir fehlte allerdings eine Flächenintegralberechnung und außerdem die Möglichkeit txt-files einzulesen.
    Mit meinen bescheidenen Anfängerfähigkeiten habe ich mir den Code aufgedröselt und um o.g. Dinge ergänzt.
    Vielleicht kanns ja wer gebrauchen.
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Palue“ ()

    Hey Paule,

    du hattest mir ja geschrieben, ich hab inzwischen auch eine Flächenberechnung eingebaut, hatte dann aber irgendwie vergessen dir das mitzuteilen und hier hochzuladen, sry ;(
    Bilder
    • MitFlächenberechnung.PNG

      69,08 kB, 914×576, 1.777 mal angesehen
    Dateien
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix