Nullstellenberechnung

  • Hey Leute

    wir machen gerade in der Schule Nullstellenberechnung und so Zeugs, und da hab ich mir gedacht, wenn das auf Papier so einfach ist, dann kanns bei AutoIt auch nicht viel schwerer sein.

    Tja da hab ich wohl falsch gedacht oO

    Also jetzt zu meinem Problem: Mein Programm kann bis jetzt nur Funktionen untersuchen, wie f(x) = x^2+5*x+3, also alles mit +, jetzt will ich aber einfügen, dass zwischen + und - unterschieden werden kann, also dass solche Funktionen untersucht werden können: f(x) = x^2+5*x-3.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $func = InputBox("Funktion","Geben sie die zu untersuchende Funktion ein!","3*x^2+21*x+6")
    $teile = StringSplit($func,"+")
    If $teile[0] <> 3 Then
    MsgBox(0,"ERROR1","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    EndIf
    $ersterTeil = StringSplit($teile[1],"^")
    If $ersterTeil[0] <> 2 Then
    MsgBox(0,"ERROR2","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    EndIf
    If $ersterTeil[2] <> 2 Then
    MsgBox(0,"ERROR3","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    EndIf
    $zweiterTeil = StringSplit($teile[2],"*")
    If $zweiterTeil[0] <> 2 Then
    MsgBox(0,"ERROR4","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    EndIf
    If IsInt($teile[3]) == False Then
    MsgBox(0,"ERROR5","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    EndIf
    ;Hier steht fest, dass die Funktion kompatibel ist!

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

    $ersterTeilReloaded = StringSplit($teile[1],"*")
    If $ersterTeilReloaded[0] = 1 Then ;Berechnung von etwa x^2+5*x+3
    $p = $zweiterTeil[1]
    $q = $teile[3]
    MsgBox(0,"",$p&","&$q)
    $ergebnis = - $p/2 + Sqrt((($p/2)^2)-$q)
    $ergebnis2 = $ergebnis * -1
    MsgBox(0,"Nullstellen","Die Nullstellen der Funktion "&@CRLF&$func&@CRLF&"sind"&@CRLF&$ergebnis&@CRLF&$ergebnis2)
    ElseIf $ersterTeilReloaded[0] = 2 Then ;Berechnung von etwa 3*x^2+21*x+6
    If IsInt($ersterTeilReloaded[1]) == False Then
    MsgBox(0,"ERROR7","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    Else
    $p = $zweiterTeil[1]/$ersterTeilReloaded[1]
    $q = $teile[3]/$ersterTeilReloaded[1]
    If (($p/2)^2)-$q < 1 Then
    MsgBox(0,"Nullstellen","Die Funktion hat keine Nullstellen!")
    Else
    $ergebnis = - $p/2 + Sqrt((($p/2)^2)-$q)
    $ergebnis2 = $ergebnis * -1
    MsgBox(0,"Nullstellen","Die Nullstellen der Funktion "&@CRLF&$func&@CRLF&"sind"&@CRLF&$ergebnis&@CRLF&$ergebnis2)
    EndIf
    EndIf
    Else
    MsgBox(0,"ERROR6","Dieses Format einer Funktion wird nicht unterstützt!")
    Exit
    EndIf

    [/autoit]

    Ich hoffe ihr könnt mir dabei helfen.

    Danke
    DFPWare

    • Offizieller Beitrag

    Das hatte ich mal für einfache Binome erstellt:

    Spoiler anzeigen
    [autoit]

    ConsoleWrite(Binom('12.5a-3.5b'))
    ; Ausgabe: (12.5a - 3.5b)² = 156.25a² -87.5ab +12.25b²
    ;===============================================================================
    ; Function Name: Binom($sSquare)
    ; Description:: Anwendung 1./2. Binomische Formel auf übergebene Quadratgleichung
    ; Parameter(s): $sSquare - der quadratische Ausdruck, z.B. "12.5a-3.5b" für "(12.5a+3.5b)^2"
    ; Return Value(s): die gesamte Gleichung ausformuliert, z.B. "(12.5a - 3.5b)² = 156.25a² -87.5ab +12.25b²"
    ; Author: BugFix
    ;===============================================================================
    Func Binom($sSquare)
    Local $sOut, $ret, $signA, $signB, $numA, $numB, $chrA, $chrB, $sqA, $sqB, $2AB
    $sSquare = StringStripWS($sSquare, 8)
    If StringLen($sSquare) < 3 Then Return SetError(1,0,0)
    $ret = StringRegExp($sSquare, '([+-])?(\d+.\d+|\d+)?([a-zA-Z])', 3)
    $sOut = '(' & $ret[0] & $ret[1] & $ret[2] & ' ' & $ret[3] & ' ' & $ret[4] & $ret[5] & ')' & Chr(178) & ' = '
    $signA = '-'
    If $ret[0] <> '-' Then $signA = '+'
    $numA = 1
    If $ret[1] <> '' Then $numA = $ret[1]
    $chrA = $ret[2]
    $signB = '-'
    If $ret[3] <> '-' Then $signB = '+'
    $numB = 1
    If $ret[4] <> '' Then $numB = $ret[4]
    $chrB = $ret[5]
    $sqA = $numA^2
    $sqB = $numB^2
    If $sqA = 1 Then $sqA = ''
    If $sqB = 1 Then $sqB = ''
    $2AB = 2*($signA & $numA)*($signB & $numB)
    If $2AB > 0 Then $2AB = '+' & $2AB
    $sOut &= $sqA & $chrA & Chr(178) & ' ' & $2AB & $chrA & $chrB & ' +' & $sqB & $chrB & Chr(178)
    Return $sOut
    EndFunc ;==>Binom

    [/autoit]
  • Hi,
    schau dir vor der nächsten klausur lieber nochmal an, wie man x1 und x2 aus der pq-Formel berechnet^^
    mit x2=-x1 wird das nix^^

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

    $ffunc = InputBox("Funktion", "Geben sie die zu untersuchende Funktion ein!", "3*x^2+21*x+6")
    $func = $ffunc ;kopie
    ;y=ax^2+bx+c
    $a = StringLeft($func, StringInStr($func, "x^2") - 2) ;teil vor dem x^2
    If Number($a) = 0 Then $func = "1*" & $func
    $func = StringTrimLeft($func, StringInStr($func, "x^2") + 2) ;teil vor dem *x
    $b = StringLeft($func, StringInStr($func, "*x") - 1)
    $c = StringRight($func, StringLen($func) - StringInStr($func, "*x") - 1);teil hinter dem *x

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

    $p = $b / $a ;p
    $q = $c / $a ;q

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

    $diskriminante = $p ^ 2 / 4 - $q ; das was unter der Wurzel steht^^

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

    If $diskriminante > 0 Then ;2 nullstellen
    $x1 = -$p / 2 + Sqrt($diskriminante)
    $x2 = -$p / 2 - Sqrt($diskriminante)
    MsgBox(0, "Nullstellen", "Die Nullstellen der Funktion " & @CRLF & $ffunc & @CRLF & "sind" & @CRLF & "x1= " & $x1 & @CRLF & "x2= " & $x2)
    ElseIf $diskriminante = 0 Then ;eine nullstelle
    $x = -$p / 2 + Sqrt($diskriminante)
    MsgBox(0, "Nullstellen", "Die einzige Nullstelle der Funktion " & @CRLF & $ffunc & @CRLF & "ist" & @CRLF & "x= " & $x)
    ElseIf $diskriminante < 0 Then ;keine nullstelle
    MsgBox(0, "Nullstellen", "Die Funktion " & @CRLF & $ffunc & @CRLF & "hat keine Nullstellen")
    EndIf

    [/autoit]
  • Achsoo;D
    Andy: dein Skript hat einen Fehler, wenn man das 3* vor der Funktion entfernt dann beendet sich das Programm, weil du $a nicht neu benennst.
    so sollte es gehen:

    Spoiler anzeigen
    [autoit]

    $ffunc = InputBox("Funktion", "Geben sie die zu untersuchende Funktion ein!"&@CRLF&"f(x)=", "3*x^2+21*x+6")
    $func = $ffunc ;kopie
    ;y=ax^2+bx+c
    $a = StringLeft($func, StringInStr($func, "x^2") - 2) ;teil vor dem x^2
    If Number($a) = 0 Then $func = "1*" & $func
    $a = StringLeft($func, StringInStr($func, "x^2") - 2) ;teil vor dem x^2
    $func = StringTrimLeft($func, StringInStr($func, "x^2") + 2) ;teil vor dem +21*x wird abgeschnitten
    $b = StringLeft($func, StringInStr($func, "*x") - 1) ;teil vor dem *x
    $c = StringRight($func, StringLen($func) - StringInStr($func, "*x") - 1);teil hinter dem *x

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

    $p = $b / $a ;p
    $q = $c / $a ;q

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

    $diskriminante = $p ^ 2 / 4 - $q ; das was unter der Wurzel steht

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

    If $diskriminante > 0 Then ;2 nullstellen
    $x1 = -$p / 2 + Sqrt($diskriminante)
    $x2 = -$p / 2 - Sqrt($diskriminante)
    MsgBox(0, "Nullstellen", "Die Nullstellen der Funktion " & @CRLF & $ffunc & @CRLF & "sind" & @CRLF & "x1= " & $x1 & @CRLF & "x2= " & $x2)
    ElseIf $diskriminante = 0 Then ;eine nullstelle
    $x = -$p / 2 + Sqrt($diskriminante)
    MsgBox(0, "Nullstellen", "Die einzige Nullstelle der Funktion " & @CRLF & $ffunc & @CRLF & "ist" & @CRLF & "x= " & $x)
    ElseIf $diskriminante < 0 Then ;keine nullstelle
    MsgBox(0, "Nullstellen", "Die Funktion " & @CRLF & $ffunc & @CRLF & "hat keine Nullstellen")
    EndIf

    [/autoit]
  • Also ich würde die einzelnen Glieder der quadratischen Funktion abfragen

    Kannst du mit 3 Inputboxen machen oder du erstellst eine GUI

    Input:

    $a = Inputbox("","Quadratisches Glied")
    $b = Inputbox("","Lineares Glied")
    $c = Inputbox("","Absolutes Glied")

    Dann kannst du mit (-$b)/(2*$a) das Argument ausrechnen und wenn du das in die Funktionsgleichung einsetzt erhälst du den Funktionswert

    oder eben mit der PQ-Formel