Programm muss Lot fällen und x-Wert herausfinden. | Sprungantwort PT1-Glied

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Programm muss Lot fällen und x-Wert herausfinden. | Sprungantwort PT1-Glied

    Hallo zusammen, könntet ihr mir hier bitte weiterhelfen?
    Ich habe Messwerte, die der Form
    h(t)=a∗(1-exp(-t/T_1))
    ähneln. Ich muss mit meinem Programm T1 exakt herausfinden. Das ist der Punkt, an dem die Wendetangente, die bei ymax stoppt, runterprojiziert wird. Oder anders: man nimmt den 63,21%-Wert von h(t); dort, wo die Gerade auf h(t) trifft, projiziert man runter. Ich habe ein Bild beigfügt. Lasst euch bitte nicht täuschen, die Funktion gibt es noch gar nicht, wenn man T1 nicht kennt. Dieses Bild dient nur der Verdeutlichung. Es sind nur Messwerte. Man erkennt im Bild, dass T1 etwa 15 ms ist.
    Ohne T1 gibt's keine Funktion, die man nehmen könnte, um runterzuprojizieren. Man muss jedoch runterprojizieren, um T1 zu haben. Daher eignen sich nur die Messwerte. Wie kann ich das in Code umwandeln?

    Für
    ​h(t→∞) gilt h(t)=a




    Falls jemand aus der Regelungstechnik kommt, weiß jemand, wie das besser geht?
    Bilder
    • Vollbildaufzeichnung 29.10.2019 123137 - Kopie.jpg

      52,19 kB, 941×468, 84 mal angesehen
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz Mal zum mitdenken:
    Die schwarzen Punkte sind Deine Messpunkte, die idealerweise der Gleichung h(t) gehorchen.
    Die Wendetangente ist die Tangente an diese Funktion im Punkt t = 0.
    Der Wert 63,21% ist göttlich gegeben.
    Gesucht ist der Wert t, bei dem die 63,21%-Linie die Messkurve schneidet.
    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!
    @Bartosz Wie dicht liegen die Mewsspunkte?
    Zunächst musst Du eine 100%-Linie bestimmen, das wäre der K-0-Wert.
    Dazu nimmst Du den Mittelwert der letzten n Punkte.
    Damit hast Du Deinen göttlichen Wert.
    Du suchst Dir eine Umgebung von 3 Punkten, in deren Zentrum der Punkt liegt, dessen Betrag vom y-Abstand zum göttlichen Wert minimal ist.
    Mit dem Dreisatz holst Du Dir einen T1-0-Wert.
    Nun hast Du zwei Startwerte (K-0 und T1-0).
    Mit denen kannst Du mit Deinen Messdaten iterative Regression betreiben und mit jedem Umlauf Deine Startwerte verbessern.
    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!
    @Bartosz Lässt Du uns an Deiner Lösung teilhaben?
    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 Ich schreib das jetzt hier zusammen

    edit:
    Im Grunde genommen hast du mich auf die Idee gebracht, als du Regression sagtest.

    Der Benutzer gibt im Programm die Werte für Ua, Ue und das Zeitintervall ein, die er bei der PT1-Strecke (also noch ohne Motor) gemessen hat. Die Messwerte der Sprungantwort, die der Benutzer in eine txt-Datei geschrieben hatte, werden nun aus der Textdatei eingelesen. Der Benutzer kann in einem OpenFileDialog den Pfad wählen. Diese Messwerte gehorchen im Idealfall der Gleichung
    h(t)=a*(1-e^(-t/T1))
    . Da man T1 noch nicht kennt, kann man keine Funktion plotten. Ohne Funktion wiederum kann man nicht auf den t-Wert das Lot fällen. Daher zeichnet man gewöhnlich, also auf dem Papier, eine Wendetangente oder man nimmt den 63,2%-Wert, um den T1-Wert zu bestimmen. Dies ist im Programm so nicht möglich. Daher wird intern eine Idealfunktion berechnet, mit so vielen Schritten wie es Messwerte gibt. Das heißt, wenn die Messwerte in 5-ms-Schritten gemacht wurden und es 21 Messwerte gibt, wird die Idealkurve genauso berechnet. Solange die Differenz zu den Messwerten zu groß ist, wird T1 um 1 erhöht. Letzten Endes wird der Wert für T1 in die Textbox geschrieben. Der Benutzer muss beachten, dass er vor dem Klicken auf den Button die Werte für Ua und Ue eingibt. Vorher ist der Button nicht enabled (timergesteuert).

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Button1.Enabled = False
    3. Timer1.Stop()
    4. Dim T1_beiPT1 As Double
    5. T1_beiPT1 = Regression_PT1_T1() 'Prozedur aufrufen
    6. PT2_PI_durchrechnen()
    7. Button1.Enabled = True
    8. Button1.BackColor = Color.DeepSkyBlue
    9. End Sub
    10. Private Function Regression_PT1_T1() As Double
    11. Dim intAnzahl_Zeilen As Integer
    12. Dim Messwerte_aus_txt = New List(Of Double)
    13. Dim Pfad As String = ""
    14. Using OpenFileDialog As New OpenFileDialog
    15. OpenFileDialog.Filter = "Textdokumente|*.txt"
    16. OpenFileDialog.RestoreDirectory = True
    17. If OpenFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
    18. Pfad = System.IO.Path.GetFullPath(OpenFileDialog.FileName)
    19. intAnzahl_Zeilen = System.IO.File.ReadAllLines(OpenFileDialog.FileName).Length
    20. Dim Zeile() As String = System.IO.File.ReadAllLines(OpenFileDialog.FileName)
    21. For Zaehler As Integer = 0 To (intAnzahl_Zeilen - 1) Step 1
    22. Messwerte_aus_txt.Add(Zeile(Zaehler))
    23. Next
    24. End If
    25. End Using
    26. ListBoxWrite(ListBox1, Pfad) 'Prozedur
    27. Dim Laden As New IO.StreamReader(Pfad)
    28. Dim liste() As String = Laden.ReadToEnd.Split(vbCrLf)
    29. Dim Messwerte_D(liste.Count - 1)
    30. For i As Integer = 0 To liste.Count - 1
    31. Messwerte_D(i) = CDbl(liste(i))
    32. Next
    33. Dim _63komma2ProzentWert As Double = Messwerte_D(liste.Count - 1) * (1 - Math.Exp(-1)) 'allerletzter Wert * (1-e^-1)
    34. Dim Ue, Ua, K_PT1, T1, t As Double
    35. If TextBox_Ua.Text <> "" Then
    36. Ua = TextBox_Ua.Text
    37. End If
    38. If TextBox_Ue.Text <> "" Then
    39. Ue = TextBox_Ue.Text
    40. End If
    41. K_PT1 = Ua / Ue
    42. TextBox_KPT1.Text = K_PT1.ToString
    43. T1 = 0.5
    44. t = 0.0
    45. Dim Schritt As Double
    46. If TextBox_Messungallesec.Text <> "" Then
    47. Schritt = CDbl(TextBox_Messungallesec.Text)
    48. End If
    49. Dim Idealfunktion(liste.Count - 1) As Double
    50. Dim Differenz(liste.Count - 1) As Double
    51. Dim Gesamtdifferenz As Double = 0.0
    52. Dim Regression_ok As Boolean = False
    53. While (Regression_ok = False)
    54. For i As Integer = 0 To (liste.Count - 1)
    55. Idealfunktion(i) = Ua * (1.0 - Math.Exp(-(t / T1)))
    56. t = t + Schritt
    57. Next
    58. t = 0.0
    59. For i As Integer = 1 To (liste.Count - 1)
    60. If Messwerte_D(i) = 0.0 Or Idealfunktion(i) = 0.0 Then
    61. 'leer
    62. Else
    63. If (Messwerte_D(i) / Idealfunktion(i)) < 0.95 OrElse (Messwerte_D(i) / Idealfunktion(i)) > 1.05 Then
    64. Differenz(i) = (Messwerte_D(i) - Idealfunktion(i))
    65. End If
    66. End If
    67. Next
    68. For j As Integer = 0 To (liste.Count - 1)
    69. Gesamtdifferenz = Gesamtdifferenz + Differenz(j)
    70. Next
    71. If (Gesamtdifferenz < -0.5) Then
    72. T1 += 0.5
    73. ElseIf (Gesamtdifferenz > 0.5) Then
    74. T1 -= 0.5
    75. Else
    76. Regression_ok = True
    77. End If
    78. Gesamtdifferenz = 0.0
    79. Application.DoEvents()
    80. End While
    81. TextBox_T1_PT1.Text = T1.ToString + " ms"
    82. Return T1
    83. End Function
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

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