zedgraph

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Nia24.

    Hallo,
    ich lasse mir durch den unten angehängten Code einen Graphen mit ZedGraph zeichnen.
    Wie lasse ich mit die Funktionsformel anzeigen, von dem gezeichneten Graphen?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub CreateGraph(ByVal zgc As ZedGraphControl)
    2. Dim myPane As GraphPane = zgc.GraphPane
    3. ' Set the titles and axis labels
    4. myPane.Title.Text = "Hermite-Polynom"
    5. myPane.XAxis.Title.Text = "X Werte"
    6. myPane.YAxis.Title.Text = "P(X)"
    7. ' Make up some data points from the Sine function
    8. Dim list As New PointPairList()
    9. Dim x As Double, y As Double
    10. For x = -30 To 30 Step 0.5
    11. Polynom = DivDiff(0, CountedRows - 1)
    12. For j = CountedRows - 2 To 0 Step -1
    13. Polynom = Polynom * (x - XWert(j)) + DivDiff(0, j)
    14. Next
    15. y = Polynom
    16. list.Add(x, y)
    17. Next x
    18. ' Generate a blue curve, and "Polynom" in the legend
    19. Dim myCurve As LineItem = myPane.AddCurve("Polynom", list, Color.Blue, SymbolType.None)
    20. ' Fill the axis background with a color gradient
    21. myPane.Chart.Fill = New Fill(Color.White, Color.LightGoldenrodYellow, 45.0F)
    22. ' Fill the pane background with a color gradient
    23. myPane.Fill = New Fill(Color.White, Color.FromArgb(220, 220, 255), 45.0F)
    24. 'Set the Y axis intersect the X axis at an X value of 0.0
    25. myPane.YAxis.Cross = 0.0
    26. 'Turn off the axis frame and all the opposite side tics
    27. myPane.Chart.Border.IsVisible = False
    28. myPane.XAxis.MajorTic.IsOpposite = False
    29. myPane.XAxis.MinorTic.IsOpposite = False
    30. myPane.YAxis.MajorTic.IsOpposite = False
    31. myPane.YAxis.MinorTic.IsOpposite = False
    32. myPane.XAxis.Scale.Min = -20
    33. myPane.XAxis.Scale.Max = 20
    34. myPane.YAxis.Scale.Min = -20
    35. myPane.YAxis.Scale.Max = 20
    36. ' Calculate the Axis Scale Ranges
    37. zgc.AxisChange()
    38. End Sub
    @Alex an Zedgraph wird die Funktion ja als Liste von (x,y)-Wertepaaren übergeben

    Nia24 schrieb:

    Wie lasse ich mit die Funktionsformel anzeigen, von dem gezeichneten Graphen?

    Ist das nicht eher eine Frage nach der mathematischen Darstellungsform , als die Frage "wie mache ich das in .NET" ?

    Direkt aus dem Code übertragen ergäbe das nur eine Formel mit sehr vielen Klammern, da der Term Polynom(i) ja abhängig ist von seinem Vorgänger Polynom(i-1). Ist es das was Du willst ?
    das sind ja nette links, aber irgendwie find ich nix was in richtung zedgraph, oder meine Frage geht.

    Ich möchte doch nur die Formel f(x) der gezeichneten Funktion anzeigen lassen.

    @ kangaroo: die darstellungsform ist mir egal, da dürfen gerne klammern ohne ende sein, aber ich habe es einfach noch nciht hinbekommen es korrekt ausgeben zu lassen.

    Nia24 schrieb:

    @ kangaroo: die darstellungsform ist mir egal, da dürfen gerne klammern ohne ende sein, aber ich habe es einfach noch nciht hinbekommen es korrekt ausgeben zu lassen.

    Prinzipiell würde das so aussehen, auch wenn man die Darstellung des Polynoms bei Minuswerten noch optimieren muss. Schliesslich sieht x + -1 ja nicht so optimal aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim countedRows As Integer = 5
    4. Dim DivDiff() As Double = {0, 1.2, 1.3, 5.0, 7.1} ' array [0..countedRows-1]
    5. Dim XWert() As Double = {1, 2, 3, 4} ' array [0..countedRows-2]
    6. ' Formel Darstellung berechnen
    7. Dim polynom As String = String.Format("{0}", DivDiff(countedRows - 1))
    8. For j = countedRows - 2 To 0 Step -1
    9. 'polynom = polynom * (x - XWert(j)) + DivDiff(0, j)
    10. polynom = String.Format("({0}) * (x - {1}) + {2}", polynom, XWert(j), DivDiff(j))
    11. 'Trace.WriteLine(polynom)
    12. Next
    13. MessageBox.Show(polynom)
    14. End Sub
    15. End Class
    ich hab es jetzt mit:

    PolynomTxT.Replace("+,-", "-")
    PolynomTxT.Replace("-,+", "-")
    PolynomTxT.Replace("-,-", "+")
    PolynomTxT.Replace("+,+", "+")

    versucht, aber irgendwie bringt das nichts. Gibt es eine bestimmte Form die man bei Replace einhalten muss?
    Danke übrigens für den String.Format, diese Form war mir völlig neu.
    Wäre nett wenn Du zunächst mal auf die Frage eingehst, ob Du Dir das per o.a. Code erzeugte Format so vorgestellt hattest oder worauf Du nun hinaus möchtest. Immer nur auf neue Fragen einzugehen ohne Feedback zu erhalten, wird mit der Zeit eintönig.

    Mögliche Darstellungsformen (Newton) gibt es ja genügend, nur müsstest Du auch den entsprechenden Algorithmus dazu liefern.
    sorry, ja das mit der Darstellung klappt super, ich wusste gar nicht das es so funktionieren kann. Wieder was neues gelernt.
    Ich habs ein bissel angepasst und es funktioniert ganz toll, die Klammern stören mich nicht, soll schließlich funktionieren.

    Hatte nur versucht das mit 1 + -3 oder so was mit Replce zu ersetzen, im Netz hab ich jetzt einmal

    Replace (PolynomTxt, "+-" , "-") gefunden
    oder
    PolynomTxt.Replace(("+-","-")

    Hab es auch ohne Anführungszeichen, mit Komma oder Leerzeichen zwischen den +- versucht, aber ändern tut sich nichts.

    Nia24 schrieb:

    Hatte nur versucht das mit 1 + -3 oder so was mit Replce zu ersetzen

    Ja, deshalb ja meine Bemerkung dass dort noch Optimierungsbedarf herrscht.

    Nia24 schrieb:

    PolynomTxt.Replace(("+-","-")

    Funktioniert aus 2 Gründen nicht:
    - es sind Leerzeichen zwischen den +/- Operatoren
    - PolynomTxt.Replace(...) ist eine Funktion, d.h. sie liefert den veränderten Wert zurück

    Um das Leerzeichen Problem zu lösen, nehmen wir am elegantesten die Regex.Replace Funktion, mit der wir aufeinanderfolgende Operatoren ohne Berücksichtigung der Leerzeichen entdecken und ersetzen können. Noch mal der Code von oben mit einer Beautify Ergänzung, die Ausgabe Vorher/Nachher erfolgt zu Testzwecken per Trace.WriteLine im Direktfenster :

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim countedRows As Integer = 5
    5. Dim DivDiff() As Double = {-2, -1.2, 1.3, 5.0, 7.1} ' array [0..countedRows-1]
    6. Dim XWert() As Double = {-3, -2, -1, 0} ' array [0..countedRows-2]
    7. ' Formel Darstellung berechnen
    8. Dim polynom As String = String.Format("{0}", DivDiff(countedRows - 1))
    9. For j = countedRows - 2 To 0 Step -1
    10. 'polynom = polynom * (x - XWert(j)) + DivDiff(0, j)
    11. polynom = String.Format("[{0}] * (x - {1}) + {2}", polynom, XWert(j), DivDiff(j))
    12. Next
    13. ' beautify Polynom string
    14. Trace.WriteLine("Vorher:" & polynom)
    15. polynom = Regex.Replace(polynom, "\-\s*\-", "+ ") ' - - is +
    16. polynom = Regex.Replace(polynom, "\+\s*\-", "- ") ' + - is -
    17. Trace.WriteLine("Nachher:" & polynom)
    18. End Sub
    19. End Class


    Edit: eckige Klammern [] im Polynomstring verwendet

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