1.#IND bei MathExMov_GetTrajectory - warum?

  • Hallo zusammen!
    Ich habe ein kleines Problen: Wenn ich die Funktion so wie im Spoiler aufrufe, dann kommt bei mir das:

    Zitat

    D:\Eigene Dateien\Grimbizo\AutoIT\#include (Custom)\MathEx\MathEx 1.1.1\MathEx.au3 (91) : ==> Subscript used with non-Array variable.:
    MouseMove($jo[$i][0],$jo[$i][1])
    MouseMove($jo^ ERROR

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $jo=MathExBal_GetTrajectory(100,100,1000,10,30,Default,Default,1)
    _ArrayDisplay($jo)
    For $i=0 To 1000
    MouseMove($jo[$i][0],$jo[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $MATHEX_CONST_PI = 3.14159265358979
    Global Const $MATHEX_CONST_RADIAN = ($MATHEX_CONST_PI/180)

    [/autoit] [autoit][/autoit] [autoit]

    Func MathExMov_GetTrajectory($Heigth, $Width, $TotalWidth, $Alpha, $Speed, $Gravity=9.81,$To=1000,$AirResistance=0,$Radius=1, $Viscosity=10)
    If Not IsNumber($Heigth) Then
    SetError(1)
    Return 0
    EndIf
    If Not IsNumber($Alpha) Or $Alpha<0 Or $Alpha>360 Then
    SetError(2)
    Return 0
    EndIf
    If Not IsNumber($Speed) Then
    SetError(3)
    Return 0
    EndIf
    If Not IsNumber($Gravity) Then
    SetError(4)
    Return 0
    EndIf
    If Not IsNumber($To) Then
    SetError(5)
    Return 0
    EndIf
    If Not IsBool($AirResistance) Then
    SetError(6)
    Return 0
    EndIf
    Dim $Return[$To][2]
    If $AirResistance=0 Then
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+$xx*Tan($Alpha*$MATHEX_CONST_RADIAN)-1/2*$Gravity*(MathExBas_Power($xx/($Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))))
    $x+=$dx
    Next
    ElseIf $AirResistance=1 Then
    $Beta=6*$MATHEX_CONST_PI*$Ratius*$Viscosity
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+(Tan($Alpha*$MATHEX_CONST_RADIAN)+$Gravity/$Beta*$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))*$xx+$Gravity/MathExBas_Power($Beta)*Log(1-$Beta/$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)*$xx))
    $x+=$dx
    Next
    ElseIf $AirResistance=2 Then

    EndIf
    Return $Return
    EndFunc

    [/autoit]

    Bitte helft mir!!!

  • Dann wird wohl die Funktion einen Fehler haben. Bekommst du denn von der Funktion einen Error? Wird dir das Array beim _ArrayDisplay angezeigt? (Sorry kanns grad nicht selber testen) Sonst kann ich keinen Fehler entdecken.

    Gruss Shadowigor

  • Du rufst im Spoiler die Funktion garnicht auf 8|

    [autoit]


    $jo=MathExBal_GetTrajectory(100,100,1000,10,30,Default,Default,1)

    [/autoit][autoit]


    Func MathExMov_GetTrajectory($Heigth, $Width, $TotalWidth, $Alpha, $Speed, $Gravity=9.81,$To=1000,$AirResistance=0,$Radius=1, $Viscosity=10)

    [/autoit]

    Das sind zwei unterschiedliche Funktions namen, die in Zeile 2 aufgerufene Funktion existiert nicht.

    Bin grade zu faul mir die zusätzliche include datei rauszusuchen von daher habe ich es mal so verändert, dass es zumindest soweit Funzt bis er auf eine bei mir nicht deklarierte Funktion trifft.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Global Const $MATHEX_CONST_PI = 3.14159265358979
    Global Const $MATHEX_CONST_RADIAN = ($MATHEX_CONST_PI/180)
    $jo=MathExBal_GetTrajectory(100,100,1000,10,30,Default,Default,true)
    _ArrayDisplay($jo)
    For $i=0 To 1000
    MouseMove($jo[$i][0],$jo[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func MathExBal_GetTrajectory($Heigth, $Width, $TotalWidth, $Alpha, $Speed, $Gravity=9.81,$To=1000,$AirResistance=false,$Radius=1, $Viscosity=10)
    If $Gravity = Default Then $Gravity = 9.81
    If $To = Default Then $To = 1000
    If Not IsNumber($Heigth) Then
    SetError(1)
    Return 0
    EndIf
    If Not IsNumber($Alpha) Or $Alpha<0 Or $Alpha>360 Then
    SetError(2)
    Return 0
    EndIf
    If Not IsNumber($Speed) Then
    SetError(3)
    Return 0
    EndIf
    If Not IsNumber($Gravity) Then
    SetError(4)
    Return 0
    EndIf
    If Not IsNumber($To) Then
    SetError(5)
    Return 0
    EndIf
    If Not IsBool($AirResistance) Then
    SetError(6)
    Return 0
    EndIf
    Local $Return[$To][2]
    If $AirResistance=0 Then
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+$xx*Tan($Alpha*$MATHEX_CONST_RADIAN)-1/2*$Gravity*(MathExBas_Power($xx/($Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))))
    $x+=$dx
    Next
    ElseIf $AirResistance=1 Then
    $Beta=6*$MATHEX_CONST_PI*$Radius*$Viscosity
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+(Tan($Alpha*$MATHEX_CONST_RADIAN)+$Gravity/$Beta*$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))*$xx+$Gravity/MathExBas_Power($Beta)*Log(1-$Beta/$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)*$xx)
    $x+=$dx
    Next
    ElseIf $AirResistance=2 Then

    EndIf
    Return $Return
    EndFunc

    [/autoit]

    € Und die Globalen Variablen sollten VOR der Nützung der Funktion deklariert werden :D
    € Ah jetzt verstehe ich $Ratius = $Radius...

    5 Mal editiert, zuletzt von Zeitriss (26. September 2012 um 17:40)

  • Ich habs jetzt korrigiert... funtzt aber immer noch nicht.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $MATHEX_CONST_PI = 3.14159265358979
    Global Const $MATHEX_CONST_RADIAN = ($MATHEX_CONST_PI/180)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>
    $jo=MathExMov_GetTrajectory(100,100,1000,10,30,Default,Default,1)
    MsgBox(0,"",VarGetType($jo))
    _ArrayDisplay($jo)
    For $i=0 To 1000
    MouseMove($jo[$i][0],$jo[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func MathExMov_GetTrajectory($Heigth, $Width, $TotalWidth, $Alpha, $Speed, $Gravity=9.81,$To=1000,$AirResistance=0,$Radius=1, $Viscosity=10)
    If Not IsNumber($Heigth) Then
    SetError(1)
    Return 0
    EndIf
    If Not IsNumber($Alpha) Or $Alpha<0 Or $Alpha>360 Then
    SetError(2)
    Return 0
    EndIf
    If Not IsNumber($Speed) Then
    SetError(3)
    Return 0
    EndIf
    If Not IsNumber($Gravity) Then
    SetError(4)
    Return 0
    EndIf
    If Not IsNumber($To) Then
    SetError(5)
    Return 0
    EndIf
    If Not IsBool($AirResistance) Then
    SetError(6)
    Return 0
    EndIf
    Dim $Return[$To][2]
    If $AirResistance=0 Then
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+$xx*Tan($Alpha*$MATHEX_CONST_RADIAN)-1/2*$Gravity*(MathExBas_Power($xx/($Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))))
    $x+=$dx
    Next
    ElseIf $AirResistance=1 Then
    $Beta=6*$MATHEX_CONST_PI*$Ratius*$Viscosity
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+(Tan($Alpha*$MATHEX_CONST_RADIAN)+$Gravity/$Beta*$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))*$xx+$Gravity/MathExBas_Power($Beta)*Log(1-$Beta/$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)*$xx))
    $x+=$dx
    Next
    ElseIf $AirResistance=2 Then

    EndIf
    Return $Return
    EndFunc

    [/autoit]
  • Jey - Die Fehlerbehandlung war schuld - aber jetzt hab ich ein anderes Problen:

    Spoiler anzeigen
    [autoit]


    Global Const $MATHEX_CONST_PI = 3.14159265358979
    Global Const $MATHEX_CONST_RADIAN = ($MATHEX_CONST_PI/180)

    [/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>
    $jo=MathExMov_GetTrajectory(100,100,1000,10,30,9.18,1000,1)
    MsgBox(0,"",@error)
    MsgBox(0,"",VarGetType($jo))
    _ArrayDisplay($jo)
    For $i=0 To 1000
    MouseMove($jo[$i][0],$jo[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func MathExMov_GetTrajectory($Heigth, $Width, $TotalWidth, $Alpha, $Speed, $Gravity=9.81,$To=1000,$AirResistance=0,$Radius=1, $Viscosity=10)
    If Not IsNumber($Heigth) Then
    SetError(1)
    Return 0
    EndIf
    If Not IsNumber($Width) Then
    SetError(2)
    Return 0
    EndIf
    If Not IsNumber($TotalWidth) Then
    SetError(3)
    Return 0
    EndIf
    If Not IsNumber($Alpha) Or $Alpha<0 Or $Alpha>360 Then
    SetError(4)
    Return 0
    EndIf
    If Not IsNumber($Speed) Then
    SetError(5)
    Return 0
    EndIf
    If Not IsNumber($Gravity) Then
    SetError(6)
    Return 0
    EndIf
    If Not IsNumber($To) Then
    SetError(7)
    Return 0
    EndIf
    If Not IsNumber($AirResistance) Then
    SetError(8)
    Return 0
    EndIf
    If Not IsNumber($Radius) Then
    SetError(9)
    Return 0
    EndIf
    If Not IsNumber($Viscosity) Then
    SetError(10)
    Return 0
    EndIf
    Dim $Return[$To][2]
    If $AirResistance=0 Then
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+$xx*Tan($Alpha*$MATHEX_CONST_RADIAN)-1/2*$Gravity*(MathExBas_Power($xx/($Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))))
    $x+=$dx
    Next
    ElseIf $AirResistance=1 Then
    $Beta=6*$MATHEX_CONST_PI*$Radius*$Viscosity
    $xSpeed=$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)
    $x=$Width
    $dx=$TotalWidth/$To
    For $i=0 To $To-1
    $Return[$i][0]=$x
    $xx=$x-$Width
    $Return[$i][1]=$Heigth+(Tan($Alpha*$MATHEX_CONST_RADIAN)+$Gravity/$Beta*$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN))*$xx+$Gravity/MathExBas_Power($Beta)*Log(1-$Beta/$Speed*Cos($Alpha*$MATHEX_CONST_RADIAN)*$xx)
    $x+=$dx
    Next
    ElseIf $AirResistance=2 Then

    EndIf
    Return $Return
    EndFunc

    [/autoit]

    Das Problem ist hier: Es kommt immer 1.#IND für $jo[$i][1] (y) raus... warum?

  • Irgendwo mal eine Division durch 0?
    Testen können wir es ja leider nicht da uns die Funktion MathExBas_Power() fehlt.

    Und sag mal bitte welcher physikalische Zusammenhang hier besteht.
    Also welche Formel umgesetzt werden soll.

  • Hättest du die PDF als Anhang gemacht könnten auch andere draufschauen und dir helfen.

    Auch wenn es in der Formel so steht - der ln() ist nicht für Werte kleiner 0 definiert.
    Du musst dir also Gedanken machen wann dies der Fall ist und ob dies physikalisch plausibel ist.
    Sind die Werte die du übergibst plausibel (sind die Einheiten korrekt)?
    Könnte es eine bestimmte physikalische Bedeutung haben?
    Ich persönlich vermute dass durch die Reibung die Kugel ab diesem Moment wo der Parameter des log negativ wird zum stehen gekommen ist.
    Es findet keine weitere Bewegung mehr statt und daher ist sie für diese x-Werte nicht mehr definiert weil sie diese x-Werte nie erreicht.
    Dies ist aber nur meine Vermutung.

    Es handelt sich hier also weniger um ein Programmierproblem als eher um ein mathematisch-physikalisches.
    Leider bin ich nicht so der Physikexperte als das ich dir da fachlich sehr viel weiter helfen kann.

  • AspirinJunkie danke aber naja das hilft mi nur indirekt...

    Inwiefern?
    Wenn es so ist wie ich denke - also das die Wurfparabel für diese X-Werte nicht definiert ist - dann musst du deine übergebenen Parameter so anpassen dass die Kurve einen größeren Wertebereich bekommt.
    Hattest du stattdessen eine Lösung erwartet die die Physik ignoriert und dir eine schöne - aber falsche - Kurve erstellt?