http://de.wikipedia.org/wiki/Numerische_Mathematik
Bist mitgekommen würde ich sagen. ![]()
edit \ Hab die Nullstellen mal etwas ausgearbeitet. Bei den Rückgabewerten habe ich etwas gepfuscht
Spoiler anzeigen
#include <Array.au3>
HotKeySet("{ESC}", "Terminate") ; press ESC to emergency-exit
Global $expression = InputBox("Enter Function", "E.g. x^2-16", "x^2-16") ; make sure you use * to multiply
If @error Then Exit
; auf die Konforme Funktionsübergabe kann man ja in Unicalc selbst achten
; Y=0 in die eingegeben Funktion von Unicalc einsetzen und übergeben
$array =_ReturnZero($expression, -10, 10)
_ArrayDisplay($array, "X- Werte der Nullstellen")
Func Terminate()
Exit
EndFunc ;==>Terminate
Func _ReturnZero($expr, $startpoint, $endpoint, $dez = 0.01)
;expr: Funktion
;§leftbound = Linke Grenze
;$rightbound = Rechte Grenze
;$dez = Suchintervall -> je kleiner je mehr loops werden benötigt -> Risiko 2er Nullstellen im Intervall wird jedoch verkleinert
;return: Array mit den x-Werten der Nullstellen im angegebenen Bereich
;@error; Kein Treffer im angegebenen Bereich
Local $calc, $temp, $match = "", $asplit, $sreturn
For $x = $startpoint To $endpoint Step $dez
$calc = Execute(StringReplace($expr, "x", $x))
If $calc > 0 And $temp < 0 Then
$match &= String($x) & "|"
$temp = $calc
ElseIf $calc < 0 And $temp > 0 Then
$match &= String($x) & "|"
$temp = $calc
Else
$temp = $calc
EndIf
Next
If $match = "" Then Return SetError(0)
$asplit = StringSplit($match, "|")
_ArrayDisplay($asplit, "Return Guess") ;zum überprüfen
Local $areturn[$asplit[0]-1]
For $i = 1 To $asplit[0] - 1
$t = _CalcZero($expression, $asplit[$i])
if not @error then $areturn[$i-1] = $t
Next
Return $areturn
EndFunc ;==>_Check
Func _CalcZero($expr, $guess)
Local $x_guesses_array[2] ; Zum Vergleich der Ergebnisse, bei entsprechender Genauigkeit wird abgebrochen
Local $x_guess = Number($guess)
Local $c = 0
local $zero
While 1
$x_guess = $x_guess - (_Fx($expression, $x_guess) / _SlopeOfTangent($expression, $x_guess)) ;Newton
$c += 1
If IsInt($c / 1000) And Not IsInt($c / 2000) Then
$x_guesses_array[0] = $x_guess
$x_guesses_array[1] = 0
EndIf
If IsInt($c / 2000) Then
;Genauigkeit des Ergebnis wird überprüft (alle 2000 loops)
$x_guesses_array[1] = $x_guess
If Abs($x_guesses_array[1] - $x_guesses_array[0]) < 0.001 Then ExitLoop
EndIf
If $c >= 10000 Then
$zero=_CheckZeroZero($expr)
if $zero then
Return 0 ;geht durch 0|0
else
Return SetError(0) ;kein match
endif
EndIf
WEnd
Return $x_guess
EndFunc ;==>_CalcZero
Func _SlopeOfTangent($expr, $at_point, $var = "x", $places = 4)
Local $dx = 0.00000001
Local $x = $at_point
Local $y = $x + $dx
Local $slope = Execute(StringReplace($expr, $var, "$y")) - Execute(StringReplace($expr, $var, "$x"))
Return Round($slope / $dx, $places)
EndFunc ;==>_SlopeOfTangent
Func _Fx($expr, $at_point)
Return Execute(StringReplace($expr, "x", "$at_point"))
EndFunc ;==>_Fx
func _CheckZeroZero($expr)
if Execute(StringReplace($expr, "x", 0)) = 0 then
Return true
else
Return false
endif
endfunc