Hi,
ich hab mir letztens mal das Thema Integralrechnung angeschaut und dachte mir das wäre doch in AutoIt machbar.
Falls jemand nicht weiß, was ein Integral ist hier eine kurze Erklärung + Rechnung:
Integralrechnung - Erklärung und Beispielsrechnung
Ein Integral einer Funktion ist die Fläche die sich über oder unterhalb der X-Achse im Koordinatensystem befindet.
Die Fläche unterhalb der Funktion und über der X-Achse ist positiv und die Fläche über der Funktion und unter der X-Achse ist negativ.
Das wird verrechnet (positive und negative Fläche) und dann hat man das Integral einer Funktion.
Da ich am Anfang nicht wusste wie man das ausrechnen könnte,
da ja fest jede Funktion eine andere Form hat und man es nicht genau ermitteln kann hab ich es so gelöst:
Ich habe einen Wert X. Ich verrechne den Wert, der ist bsp.-weise 2. In f(x) = x wäre das f(2) = 2.
Dann addiere ich zu X einen kleinen Wert, der ist konstant 0.001. Daraus folgt: f(2 + 0.001) = 2.001
Anschließend errechne ich die Fläche des Trapezes mittels einfacher Mathematik.
Die lange Strecke (je nach dem welcher Wert bei f(x) höher ist) - die kurze Strecke.
Da es ja ein Trapez ist, kann man das Trapez durch folgende 2 Formen definieren:
Quadrat und Dreieck.
Das Quadrat wäre die kleine Strecke * 2.
Das Dreieck wäre (die lange Strecke - die kurze) * 0.001 / 2.
Beides zusammenaddiert ergibt es das Integral der Funktion an der Stelle X und X + 0.001.
So rechnet man in kleinen Schritten immer weiter bis man an dem Ende - 0.001 angekommen ist.
Das hört sich für einige Leute an als ob jemand an der Matratze kratzen würde aber hoffentlich war es ohne zeigen verständlich.
Falls Unklarheiten sind hier ist eine Beispielrechnung:
Wir wollen das Integral der Funktion f(x) = x an der Stelle 1 bis 3.
Wir benutzen hier nicht mehr 0.001 als Schritt sondern 2, weil es ein Trapez ist, und wir nicht unnötig kleine Schritte machen müssen.
Wenn wir in die Funktion f(x) = x für x 1 einsetzen kommt folgendes raus f(1) = 1.
Wenn wir für die Funktion f(x) = x für x 1 + 2 einsetzen kommt folgendes raus f(1+2) = 3.
Berechnung des Quadrats:
Da 1 der kleinere Wert von 1 und 3 ist rechnen wir:
1 * 2 = 2.
Die Fläche des Quadrats ist 2 LE² (Längeneinheiten).
Berechnung des Dreiecks:
Da 3 der höhere Wert von 1 und 3 ist rechnen wir:
(3 - 1) * 2 / 2 = 2.
Die Fläche des Dreiecks ist 2 LE².
Somit wäre das Integral der Funktion f(x) = x an der Stelle 1 bis 3:
2 LE² + 2 LE² = 4 LE².
Das wars auch eigentlich schon, die Rechnung könnt ihr euch im Script anschauen, es gibt noch Besonderheiten bei negativen Werten deshalb ist das If da.
Wichtig für beide Versionen!!!
Ihr müsst die Werte unterschiedlich bei unterschiedlichen Funktionen runden da es nur Näherungswerte sind.
So wäre bei f(x) = x an der Stelle 1 bis 3 3.99970000500089 bei einem Step von 0.0001 4!
Wichtig für die Version ohne Solver!!!
Spoiler anzeigen
;...
$fX = $fValue
$fX_ = $fValue + $fStep
;...
Wenn ihr andere Funktionen ausprobieren möchtet setzt $fValue + $fStep in Klammern!!!
Die Funktion ist hier f(x) = x. Wenn ihr z.B. f(x) = x² oder x³ möchtet dann macht ihr bsp.-weise folgendes:
$fX = $fValue^3
$fX_ = ($fValue + $fStep)^3
Script hier oder im Anhang
Integralrechner ohne Funktionsgleichung
Global Const $fBegin = 1, _
$fEnd = 3, _
$fStep = 0.0001
Global $fX, $fX_, $fArea
[/autoit] [autoit][/autoit] [autoit]For $fValue = $fBegin To $fEnd - $fStep Step $fStep
$fX = $fValue
$fX_ = $fValue + $fStep
If ($fX_ < $fX and $fX_ > 0) or ($fX_ > $fX and $fX_ < 0) Then
$fArea += $fStep * $fX_ + ($fX - $fX_) * $fStep / 2
Else
$fArea += $fStep * $fX + ($fX_ - $fX) * $fStep / 2
EndIf
Next
MsgBox(64, "Integral", "Die Fläche des Integrals der Funktion f(x) = x an der Stelle: " & $fBegin & " bis " & $fEnd & " beträgt: " & $fArea)
[/autoit]Integralrechner mit Funktionsgleichung
Global Const $fBegin = 1, _
$fEnd = 3, _
$fStep = 0.0001, _
$sFunction = "x"
Global $fX, $fX_, $fArea
[/autoit] [autoit][/autoit] [autoit]For $fValue = $fBegin To $fEnd - $fStep Step $fStep
$fX = Execute(StringReplace($sFunction, "x", $fValue))
$fX_ = Execute(StringReplace($sFunction, "x", $fValue + $fStep))
If ($fX_ < $fX and $fX_ > 0) or ($fX_ > $fX and $fX_ < 0) Then
$fArea += $fStep * $fX_ + ($fX - $fX_) * $fStep / 2
Else
$fArea += $fStep * $fX + ($fX_ - $fX) * $fStep / 2
EndIf
Next
MsgBox(64, "Integral", "Die Fläche des Integrals der Funktion f(x) = " & $sFunction & " an der Stelle: " & $fBegin & " bis " & $fEnd & " beträgt: " & $fArea)
[/autoit]Integralrechner mit Funktionsgleichung als AutoIt-Funktion
MsgBox(64, "Integral", "Die Fläche des Integrals der Funktion f(x) = " & "x^2" & " an der Stelle: " & "1" & " bis " & "3" & " beträgt: " & _Integral("x^2", 1, 3))
Func _Integral($sFunction, $fBegin, $fEnd, $fStep = 0.0001)
Local $fX, $fX_, $fArea
For $fValue = $fBegin To $fEnd - $fStep Step $fStep
$fX = Execute(StringReplace($sFunction, "x", $fValue))
$fX_ = Execute(StringReplace($sFunction, "x", $fValue + $fStep))
If ($fX_ < $fX and $fX_ > 0) or ($fX_ > $fX and $fX_ < 0) Then
$fArea += $fStep * $fX_ + ($fX - $fX_) * $fStep / 2
Else
$fArea += $fStep * $fX + ($fX_ - $fX) * $fStep / 2
EndIf
Next
Return $fArea
EndFunc
Da die Performanz in AutoIt in einigen Bereichen oder generell zu wünschen lässt, kann es bei kleineren Schritten länger dauern.
Wenn jemand eine andere Methode kennt das Integral rauszufinden oder einen anderen Lösungsweg weiß bitte her damit!
Ich weiß das man die ganze Funktion integrieren kann aber allein um die Funktion "12*(x-2)+4" zu trennen bzw. den String zu solven dauert das ein bisschen.
Mit Execute und StringReplace geht das ganze viel besser von der Hand.
Hoffentlich gefällts euch, Kritik und Lob erwünscht!