Polynom berechnen und zeichnen

  • VB.NET

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

    Polynom berechnen und zeichnen

    Hey Leute,

    hab da nen Mathematisches Problem ...
    Ich habe Messwerte und soll daraus eine Polynom kurve nten Grades malen.
    Das Malen ist kein Problem die Messerwerte hab ich soweit auch. Das Problem ist ich weiss nicht wie ich das Rechnen soll ...

    Hat da jemand ahnung von ?
    Dafür gibt es 2 Möglichkeiten:
    1. Polynomregression
    2. Spline
    Welche Methode Du anwenden solltest, hängt von der Anzahl und Güte Deiner Punkte ab.
    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!
    Dein Link war doppelt und somit nicht ausführbar:
    Splines
    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!
    Du bekommst Polynomkoeffizienten, also eine Funktion

    VB.NET-Quellcode

    1. y = f(x)
    In diese gehst Du mit Deinem x rein und bekommst dazu das y.
    Dieses x-y-Paar kannst Du nach belieben darstellen.
    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 gerade mal in Visual umgesetzt

    VB.NET-Quellcode

    1. Public Function Poly(ByVal WerteX() As Integer, ByVal WerteY() As Integer, ByVal Grad As Integer) As String
    2. Dim n, nmax, j, i As Integer
    3. nmax = 10
    4. Dim a(nmax) As Double
    5. Dim s(nmax) As Double
    6. Dim ergebniss As String
    7. n = Grad
    8. If n > nmax Then
    9. n = nmax
    10. Grad = n
    11. End If
    12. For i = 0 To n
    13. s(i) = WerteY(i)
    14. Next
    15. For i = 1 To n
    16. For j = n To i Step -1
    17. s(j) = (s(j) - s(j - 1)) / (WerteX(j) - WerteX(j - i))
    18. Next
    19. Next
    20. For i = 0 To n
    21. a(i) = s(i)
    22. Next
    23. For i = 0 To n - 1
    24. For j = n - 1 To i Step -1
    25. a(j) = a(j) - WerteX(j - i) * a(j + 1)
    26. Next
    27. Next
    28. ergebniss = CStr(a(0))
    29. For i = 1 To n
    30. If a(i) >= 0 Then
    31. ergebniss = ergebniss + "+"
    32. End If
    33. ergebniss = ergebniss + (CStr(a(i)) + "x^" + CStr(i))
    34. Next
    35. Return ergebniss
    36. End Function


    Nun komme ich aber nicht weiter...
    Wie komme ich von dem Ergebniss auf eine Kurve ?
    Du hast das ganze nicht verstnden.
    Die Rückgabe eines Strings ist schwachsinnig, eigentlich kommen da die Polynomkoeffizienten raus, die sind ja auch vorhanden, werden aber im String verklausuliert.
    Mit den Koeffizienten und dem Horner-Schema (y=y(x) mit Vorgabe dieser Koeffizienten) kannst Du Dir Deine Kurva aufbauen.
    Üblicherweise teilt man die Punktwolke in x-Abschnitte ein mit einer gewissen Anzahl von Werten pro Abschnitt.
    Die Berechnung der Splines garantiert dann, dass der Funktionswert sowie die 1. und die 2. Ableitung der Splinefunktionen an den Nahtstellen identisch sind, Du also eine glatte Funktion erhältst.
    Was Dir hier fehlt, sind die mathematischen Grundlagen, die musst Du Dir allerdings anderswo holen.
    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!
    Naja ich gebe das im mom als string aus um zu testen ob er überhaupt richtig rechnet ^^

    Das Hornerschema hab ich so im inet gefunden scheint auch richtig zu sein. Wie ich das nun weiter machen soll weis ich trotzdem nicht.

    VB.NET-Quellcode

    1. Function horner(ByVal Ac As Double(), ByVal Ax As Double(), ByVal x As Double) As Double
    2. Dim y As Double = 0
    3. For i As Integer = Ax.Length - 1 To 0 Step -1
    4. y *= (x - Ax(i)) + Ac(i)
    5. Next
    6. Return y
    7. End Function
    Dieses Hornerschema gibt Dir den Funktionswert des Splines an der Koordinate x zurück.
    Wenn Du das darstellen willst, musst Du x in einer Schleife durchlaufen, den y-Wert dazu ausrechnen und (x, y) darstellen. :D
    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!
    Oo ich hab mich gerade nochmal ran gemacht und musste festellen das ich mal wieder einen Wald vor meinem Kopf hatte...
    Ich hab doch alles was ich brauche mit dem was ich da gepostet hab... also das mit dem Newton Poly teil da.
    Muss ja nurnoch meine x werte einsetzen -.-
    Ich sollte mir zwischendurch einfach mehr schlaf gönnen :D
    Nach viel testerei musste ich leider festellen das irgent etwas mit der übersetzung von dem Quellcode von der einen Seite nicht ganz funktioniert :(

    Könnt ihr da einen Fehler entdecken ?

    VB.NET-Quellcode

    1. Public Function NewtonPoly(ByVal WerteX() As Double, ByVal WerteY() As Double, ByVal Grad As Integer) As String
    2. Dim n, nmax, j, i As Integer
    3. nmax = 10
    4. Dim a(nmax) As Double
    5. Dim s(nmax) As Double
    6. Dim ergebniss As String
    7. n = Grad
    8. If n > nmax Then
    9. n = nmax
    10. Grad = n
    11. End If
    12. For i = 0 To n
    13. s(i) = WerteY(i)
    14. Next
    15. For i = 1 To n
    16. For j = n To i Step -1
    17. s(j) = (s(j) - s(j - 1)) / (WerteX(j) - WerteX(j - i))
    18. Next
    19. Next
    20. For i = 0 To n
    21. a(i) = s(i)
    22. Next
    23. For i = 0 To n - 1
    24. For j = n - 1 To i Step -1
    25. a(j) = a(j) - WerteX(j - i) * a(j + 1)
    26. Next
    27. Next
    28. ergebniss = CStr(a(0))
    29. For i = 1 To n
    30. If a(i) >= 0 Then
    31. ergebniss = ergebniss & "+"
    32. End If
    33. ergebniss = ergebniss & (CStr(a(i)) & "x^" & CStr(i))
    34. Next
    35. Return ergebniss
    36. End Function


    HTML-Quellcode

    1. var n, nmax=10;
    2. a=new Array(nmax);
    3. x=new Array(nmax);
    4. y=new Array(nmax);
    5. function NewtonIP()
    6. {
    7. var i,j;
    8. s=new Array(nmax);
    9. n=eval(window.document.form1.Grad.value);
    10. if(n>nmax)
    11. {
    12. n=nmax;
    13. window.document.form1.Grad.value=n;
    14. }
    15. x[0]=eval(window.document.form1.x0.value);
    16. y[0]=eval(window.document.form1.y0.value);
    17. x[1]=eval(window.document.form1.x1.value);
    18. y[1]=eval(window.document.form1.y1.value);
    19. x[2]=eval(window.document.form1.x2.value);
    20. y[2]=eval(window.document.form1.y2.value);
    21. x[3]=eval(window.document.form1.x3.value);
    22. y[3]=eval(window.document.form1.y3.value);
    23. x[4]=eval(window.document.form1.x4.value);
    24. y[4]=eval(window.document.form1.y4.value);
    25. x[5]=eval(window.document.form1.x5.value);
    26. y[5]=eval(window.document.form1.y5.value);
    27. x[6]=eval(window.document.form1.x6.value);
    28. y[6]=eval(window.document.form1.y6.value);
    29. x[7]=eval(window.document.form1.x7.value);
    30. y[7]=eval(window.document.form1.y7.value);
    31. x[8]=eval(window.document.form1.x8.value);
    32. y[8]=eval(window.document.form1.y8.value);
    33. x[9]=eval(window.document.form1.x9.value);
    34. y[9]=eval(window.document.form1.y9.value);
    35. x[10]=eval(window.document.form1.x10.value);
    36. y[10]=eval(window.document.form1.y10.value);
    37. for(i=0; i<=n; i++) s[i]=y[i];
    38. for(i=1; i<=n; i++)
    39. {
    40. for(j=n; j>=i; j--)
    41. {
    42. s[j]=(s[j]-s[j-1])/(x[j]-x[j-i]);
    43. }
    44. }
    45. for(i=0; i<=n; i++) a[i]=s[i];
    46. for(i=0; i<=n-1; i++)
    47. {
    48. for(j=n-1; j>=i; j--)
    49. {
    50. a[j]=a[j]-x[j-i]*a[j+1];
    51. }
    52. }
    53. window.document.form1.Ergebnis.value="P(x)="+a[0];
    54. for(i=1; i<=n; i++)
    55. {
    56. if(a[i]>=0)
    57. {
    58. window.document.form1.Ergebnis.value=
    59. window.document.form1.Ergebnis.value + "+";
    60. }
    61. window.document.form1.Ergebnis.value=
    62. window.document.form1.Ergebnis.value+
    63. a[i] + "x^" + i;
    64. }
    65. }

    VB.NET-Quellcode

    1. For i = 0 To n ' bzw. n - 1
    Ist der Endindex richtig?

    Quellcode

    1. x[0]=eval(window.document.form1.x0.value);
    Was soll das?
    müsste das nicht

    Quellcode

    1. x[0]=eval(MyForm.x0.value);
    heißen?
    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!
    Na, ich frag doch nochmal blöd: PolynomInterpolation - damit kannst du ja anhand von Stützwerten ein Formel ermitteln, mit der du zu jedem X-Wert den Y-Wert ermitteln kannst.
    Nur in der Praxis braucht man das kaum. Es reicht i.A., wenn man eine schmissige Kurve durch alle Stützwerte legen kann, und das geht auch ohne PolynomInterpolation.

    Ah - ich hab sogarmal einen Artikel geschrieben, über Spline-Interpolation, also wie man alle Werte einer Kurve ausrechnet, die mit Graphics.DrawCurve(pointArray) durch allerlei Stützpunkte gezogen wurde.
    Issn sehr hübsches Sample-Project dabei :)

    Aber wie gesagt: tatsächlich braucht man es kaum. Weil man will nicht tausende von Punkten auf der Kurve, sondern man will sie einfach sehen.
    @ RodFromGermany
    Das mit dem Index werde ich mal testen, auch wenn ich glaube das es das nicht ist ;)

    "window.document.form1.x0.value" ist schon richtig so, das ist ja aus einer html Seite und nicht Visual Basic ;)

    @ ErfinderDesRades
    Ich brauche aber alle x und y Werte ;)

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

    Tja, dann ist der Artikel vlt. was für dich. weil da wird mit .Net-BezierSplines-Standard die Kurve gelegt, und dann deren Werte nachgerechnet.
    Dadurch hat man übereinstimmung von Gezeichnetem und Berechnetem.

    Weil wenn du jetzt nach Horner ein mathem. Polynom entwickelst, hast du immernoch bisserl probleme, das auch korrekt zu zeichnen.
    Weil nur für Cubic Splines und BezierSplines ist die .Net-Unterstützung wirklich gut (kannst natürlich 10000 Punkte berechnen, und durch Geraden untereinander verbinden, das ginge auch mit dem Horner-Polynom).
    Naja das oben sollte mir ein Newton Polynom ausspucken womit ich dann die Punkte ich haben will ausrechnen kann ;)
    Und das sind immer so 900 Werte die ich dann rechnen lasse

    Das mit dem n passt soweit ;)

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