Hallo,
und vielen Dank für Eure Antworten.
Da ich nicht gerade das riesige Mathegenie bin habe ich es doch mit einer automtischen Suche gemacht.
Begrenzt durch maximale Suchdurchgänge und dem Abgleich der Abweichung der berechneten Radien von den Zielradien lassen sich auch ganz gut Falsche Eingangswerte erkennen. Die Zeit ist durch eine dynamische Schrittanpassung auch nicht so lang wie ich dachte.
Habe mein Excel Testprgramm und den Code mal angehangen.
Vielen Dank für Eure hilfe.
Code:
Option Explicit
Dim P(5) As Double
Dim S1(5) As Double
Dim S2(5) As Double
Dim S3(5) As Double
Sub GetGPSPos()
Dim iStepCount As Integer
Dim iStepLimit As Integer
Dim iStep As Integer
Dim i As Integer
Dim dError As Double
Dim dTolerance As Double
Dim Mybook As Workbook
Dim MySheet As Worksheet
Dim StartTime As Date
Dim EndTime As Date
'Zeitmessung
StartTime = Timer
'Excelwerte holen
Set Mybook = ActiveWorkbook
Set MySheet = Mybook.ActiveSheet
For i = 0 To 3
S1(i) = MySheet.Cells(2, i + 2)
S2(i) = MySheet.Cells(3, i + 2)
S3(i) = MySheet.Cells(4, i + 2)
P(i) = 0
Next
'Grenzen festlegen
dTolerance = 1 'benötigte Toleranz
iStepCount = 0 'Durchlaufzähler rücksetzen
iStepLimit = 1000 'Durchlaufgrenze festlegen
Do
'Durchlaeufe zählen
iStepCount = iStepCount + 1
'Gesamtabweichung berechnen
dError = GetError
'Schritt festlegen
iStep = Fix(dError / 3)
If iStep = 0 Then
iStep = 1
End If
'X-Check
P(0) = P(0) + iStep
If GetError > dError Then
P(0) = P(0) - (2 * iStep)
If GetError > dError Then
P(0) = P(0) + iStep
End If
End If
'Y-Check
P(1) = P(1) + iStep
If GetError > dError Then
P(1) = P(1) - (2 * iStep)
If GetError > dError Then
P(1) = P(1) + iStep
End If
End If
'Z-Check
P(2) = P(2) + iStep
If GetError > dError Then
P(2) = P(2) - (2 * iStep)
If GetError > dError Then
P(2) = P(2) + iStep
End If
End If
'Ergebnis prüfen
If dError < dTolerance Or iStepCount >= iStepLimit Then
'Zeitmessung ende
EndTime = Timer
'Werte Ausgeben
MySheet.Cells(5, 2) = P(0)
MySheet.Cells(5, 3) = P(1)
MySheet.Cells(5, 4) = P(2)
MySheet.Cells(5, 6) = dError
MySheet.Cells(5, 7) = iStep
MySheet.Cells(5, 8) = iStepCount
MySheet.Cells(5, 9) = Format(EndTime - StartTime, "0.0")
'Schleife beenden
Exit Do
End If
Loop
End Sub
'Distanz berechnen
Function GetR(P1() As Double, P2() As Double) As Double
GetR = Sqr(((P1(0) - P2(0))) ^ 2 + ((P1(1) - P2(1))) ^ 2 + ((P1(2) - P2(2))) ^ 2)
End Function
Function GetError() As Double
'Distanz berechnen
S1(4) = GetR(S1, P)
S2(4) = GetR(S2, P)
S3(4) = GetR(S3, P)
'Abweichung berechnen
S1(5) = S1(4) - S1(3)
S2(5) = S2(4) - S2(3)
S3(5) = S3(4) - S3(3)
'Gesamtabweichung berechnen
GetError = Abs(S1(5)) + Abs(S2(5)) + Abs(S3(5))
End Function
US-GPS.zip
Lesezeichen