Hi Community,
gerade bin ich dabei mir eine Funktion zu schrieben, die eine eingebene Funktion analysiert. Sprich am Ende versucht zu berechnen.
Zu Beginn muss dazu natürlich die Funktion zerlegt werden, was ich mit dem RegEx von progandy tue und danach wird der gegebene Wert in die Funktion eingesetzt. Ich habe mal ein Beispiel, wobei die Funktion f(x)=-4x+2x+3 noch nicht viel Sinn hat. (vereinfacht => f(x)=-2x+3) Jedoch will ich damit sehen, ob die einzelenen Elemente berechnet werden.
Skript:
[autoit]
#include <Array.au3>
_f_analyse("f(2) = -4x+2x+3")
[/autoit][autoit][/autoit][autoit]Func _f_analyse($f)
$f_data = StringRegExp($f,"([a-zA-Z])\(([^\)]*)\)\h*=\h*(.*)",3)
Local $f_name = $f_data[0] ; function name
Local $f_arg = $f_data[1] ; function argument
Local $f_val = $f_data[2] ; function value
$f_split = StringRegExp($f_val, "\h*([^()+\-\*/\^]+|[()+\-\*/\^])", 3)
$split = StringSplit($f_split[0],"+-",0)
If $split[0] = 1 Then ; makes sure that + or - is given for the first element
_ArrayInsert($f_split,0,"+")
EndIf
;~ _ArrayDisplay($f_split)
[/autoit][autoit][/autoit][autoit]Local $f_ar_val[UBound($f_split)/2][2]
For $i = 0 To (UBound($f_split)/2)-1
$f_ar_val[$i][0] = $f_split[$i*2]
$f_ar_val[$i][1] = $f_split[($i*2)+1]
Next
ConsoleWrite("Function " & $f & @CRLF & "--------------")
$str = ""
$erg = 0
For $i = 0 to (UBound($f_split)/2)-1
$str &= $f_ar_val[$i][0] & StringReplace($f_ar_val[$i][1],"x","(" & $f_arg & ")")
$erg += $f_ar_val[$i][0] & ( $f_ar_val[$i][1] * $f_arg)
ConsoleWrite(@CRLF & "partial result - " & $i+1 & ": " & $f_ar_val[$i][0] & ( $f_ar_val[$i][1] * $f_arg))
Next
ConsoleWrite(@CRLF & "--------------" & @CRLF & $f_name & "(" & $f_arg & ")" & " = " & $str)
ConsoleWrite(@CRLF & "Result: " & $erg & @CRLF)
EndFunc
Ausgegeben wird dazu jetzt:
Function f(2) = -4x+2x+3
--------------
partial result - 1: -8
partial result - 2: +4
partial result - 3: +6
--------------
f(2) = -4(2)+2(2)+3
Result: 2
Nun geht es doch ans Eigentliche. Wie könnte ich Exponenten (-4x^2) handhaben oder z.B. Exponenten mit einer eigenen Rechnung z.B. Addition (-4x^(2x+3))?
Ich bin da gerade auf dem Holzweg, da ich nicht weiß, wie ich die zusätzliche Info (z.b. eines Exponeten) in dem Array der einzelenen Elemente speichern soll.
Danke bereits jetzt!