Anpassen einer Funktion an Messdaten mit Hilf eines Solvers

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Anpassen einer Funktion an Messdaten mit Hilf eines Solvers

    Hallo zusammen,
    mein erster Beitrag überhaupt.

    Ich bin noch ein ziemlicher Neuling, was Programmieren mit VB.Net (2015) angeht und hoffe hier auf Hilfe.
    Ich habe etwas VBA Erfahrung, damit meine ich Makroprogrammieren in Excel. Jetzt will ich Stück für Stück meine Excel Makros in VB.net unsetzten.
    Das klappt soweit ganz gut, nur eine Sache bekomme ich einfach nicht hin.
    Ich hoffe, ich bin an der richtigen Stelle.

    In Excel gibt es die Möglichkeit , beliebige Funktionen an Daten anzupassen, indem man den Solver benutzt. Der Aufbau ist recht einfach. In einer Spalten stehen die Messdaten, in einer andern Spalte die Werte, die mit der Funktion gebiltet werden, in einer Dritten stehen die Abweichung der Messdaten von den Funktionswerten. In einer Zelle steht die Summe der Abweichungen. Diese Zelle lasse ich jetzt mit dem Solver minimieren, indem ich die Koeffizienten meiner Funktion (stehen auch in Zellen) als veränderbar erkläre. Das klappt sehr gut, mit Hilfe von Start und Nebenbedingen kann ich auch verhindern, dass
    der Solver abschmiert. Der Charm hierbei ist, die Funktion muss bekannt sein, kann aber beliebig komplex sein.

    Jetzt möchte ich das in VB.Net umsetzten. Es gibt doch dafür bestimmt fertige Lösungen. Ich suche nicht nach Ausgleichrechungen oder Regressionen.
    Hat jmd das schon einmal versucht? Ich habe schon mit der Mircosoft Solver Fondation probiert, bekomme es aber nicht zum Laufen und verstehe auch das Vorgehen nicht.
    Für jede Hilfe, Tipp oder Hinweis dankbar.
    Pinot
    Willkommen im Forum. :thumbup:

    Pinot schrieb:

    Ich suche nicht nach Ausgleichrechungen oder Regressionen.
    Es ist nicht hilfreich, wenn Du schreibst, was Du nicht suchst, Du musst genau beschreiben, was Du suchst.
    Was ich mir vorstellen könnte, sind Splines, gugst Du hier.
    Gewiss gibt es für .NET gigantische Bibliotheken, aber die musst Du kennen oder finden und dann ggf. kaufen.
    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!
    Hallo,
    Danke für die Antwort.

    Spline hilft mir nicht weiter, da nach meinen Verständnis das eine grafische Anpassung ist.
    Ich möchte aber mit der Funktion weiterarbeiten.
    Ich suche etwas, das so etwas ähnliches kann, wie der Excel Solver, weil das universell einsetzbar ist.

    Ich habe die Hoffnung, das jemand schon ein ähnliches Problem mal hatte und einen Lösungsansatz für mich hat.
    Vielleicht kennt ja jemand so eine Biliothek

    Pinot schrieb:

    da nach meinen Verständnis das eine grafische Anpassung ist.
    Spline?
    Nein.
    Du bekommst einen Sack voll Polynom-Koeffizienten, die jeweils innerhalb eines Bereiches gültig sind und dort Deine Punktwolke approximieren.
    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!

    Pinot schrieb:

    meine Daten
    sind wie konditioniert?
    Poste mal einen Graph davon.
    Du kannst natürlich ein Polynon beliebigen Grades da durch legen und Regression machen, aber ich denke mal, das passt nicht so richtig.
    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!
    siehe Tutorialthread von EdR
    kurz zusammengefasst: [Erweiterte Antwort] => Dateianhänge
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @ das habe ich gesucht, danke schön.

    @ Rodfrom Germany, anbei eine Grafik


    Hierbei handelt es sich um eine Scherraten abhängige Viskositätsmessung. Die Probe zeigt scherverdünnes Verhalten,d.h. mit zunehmender Scherrate fällt die Viskosität. Die Daten wurden im Vorfeld logarithmiert.
    Diese Daten lassen sich gut durch eine Funktion anpassen. Diese Funktion hat 3 Parameter, log eta 0, beschreibt den linken Teil der Grafik, alpha, gibt die Krümmung der Kurve wieder und log G 0 beschreibt den rechten Teil.
    f(x)=lgEta0-log(1+10^(alpha*(x-lgGP0))
    Hintergurnd ist, mit Kenntnis dieser Koeffizienten für die Funktion kann man leicht für jede belibige Scherrate eine Viskosität bestimmen.


    Der Excel Solver konnte diese Koeffizienten quasi durch Ausprobieren heraus finden.
    @Pinot Probier mal ne Parabel 4. bis 6. Ordnung, das geht nach Schema F.
    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!

    Pinot schrieb:

    Wie würde denn dieses Schema F aus sehen?
    Das gehört eigentlich zur Mathematik-Software-Allgemeinbildung, recherchiere das einfach mal selbst, Stichwort: Lineare Regression Algorithmus.
    Selbstverständlich kannst Du das auch auf (fast beliebige) andere Funktionen übertragen.
    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!
    Hallo,
    ich habs leider immer noch nicht gelöst.
    Zwar habe ich viele schöne Programmpackete wie Mathdotnet gefunden,die auch viele schöne Sachen machen.
    Lineare und nicht Lineare Regressionen,etc.
    Ich scheitere daran, eine konkrete Funktion, (hier f(x)=lgEta0-log(1+10^(alpha*(x-lgGP0))) anzugeben, die an die Messwerte angepasst werden soll.
    Im Mathdotnet kann man bestimmte Funktionen vorgeben, aber wie erstelle ich eigne?
    Ich suche Verzweifelt nach einer Lösungsmöglichkeit für mein Problem.
    Über VB.net Excel anzusprechen und den dortigen Solver zu verwenden, wiederstrebt mir.
    Hat irgendjmd eine Idee, ein Code Beispiel, an dem ich mich orientieren kann?
    Oder einen Anbieter, der so etwas herstellt?
    schönes WE
    Pinot
    @Pinot Poste mal eine vollständige Punktwolke.
    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!
    gerne,
    wobei es Punktwolke nicht unbedingt trifft.
    Wie gesagt, es muss unbedingt diese Funktion (f(x)=lgEta0-log(1+10^(alpha*(x-lgGP0))) sein, da im Prinzip die Koeffizienten (lgEta0,alpha und lgGP0) dieser Funktion das Ergebniss der Auswertung ist
    Dateien
    ich habe es jetzt so gelöste, das ich eine Excel Datei mit Makro aufrufe, Daten übergebe, das Makro ausführe, die damit erzeugten Zahlen auslese, Excel wieder schließe.
    Es ist ein bischen so, von Hinten durch die Brust ins Auge.
    Falls jemand eine andere Lösung, ein Addin oder sonst etwas kennt, wäre ich sehr dankbar
    @Pinot Jetzt hab ich Dich fast vergessen. :whistling:
    Ich hab mal ein wenig numerisch rumgespielt, mit Variation der einzelnen Parameter, bestes (Zwischen-) Ergebnis und dann der nächste Parameter.
    Leider kommt er da bei mir immer zu einer Gerade, etwa parallel zur Tangente im Punkt stärkster Krümmung.
    Ich gehe mal davon aus, dass die Startwerte zu schlecht sind.
    Kannst Du mal bitte einen Satz guter Parameter posten?
    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!

    Pinot schrieb:

    log
    Ist das Logarithmus zur Basis 10 oder e :?:
    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!
    Bin mir nicht sicher, ob ich das richtig verstanden habe, aber suchst du nicht so etwas in der Art wir die Methode kleinster Fehlerquadrate? Wenn ja, schau dir mal an, ob dir das was nützt: codeproject.com/Articles/63170…for-Quadratic-Curve-Fitti