Inspiriert von der "Geburtstagsansprache" von Oscar poste ich jetzt einfach mal meine UDF für komplexe Zahlen, an der ich in den letzten Wochen gearbeitet habe, vielleicht findet ja jemand Verwendung dafür.
Verwendung:
Momentan stehen neben den Grundrechenarten +, -, *, / und ^ die Funktionen Sqrt, Exp, Log, Sin, Cos, Tan, Cot, Sec, Csc zur Verfügung. Um diese von den "normalen" Funktionen unterscheiden zu können beginnen sie mit einem c, aus Sqrt(-1) wird also cSqrt(-1). Die Parameter der Funktionen sind eigentlich mit c(Realteil, Imaginärteil) erstellte komplexe Zahlen (Arrays), man kann aber auch problemlos reelle Zahlen als Parameter übergeben (wie in dem Beispiel im vorherigen Satz).
UDF
#include-once
[/autoit] [autoit][/autoit] [autoit];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Complex Numbers UDF by James (autoit.de) ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func c($a=0, $b=1)
Local $c[2] = [$a, $b]
Return $c
EndFunc
Func cTest(ByRef $cmplx)
If (Not IsArray($cmplx)) Then $cmplx = c(Number($cmplx, 3), 0)
EndFunc
Func cToString($c)
cTest($c)
If ($c[1] = 0) Then Return $c[0]
If ($c[0] = 0) Then
If ($c[1] = 1) Then Return "i"
If ($c[1] = -1) Then Return "-i"
Return $c[1] & "*i"
EndIf
If ($c[1] < 0) Then
If ($c[1] = -1) Then Return $c[0] & " - i"
Return $c[0] & " - " & Abs($c[1]) & "*i"
EndIf
If ($c[1] = 1) Then Return $c[0] & " + i"
If ($c[1] = -1) Then Return $c[0] & " - i"
Return $c[0] & " + " & $c[1] & "*i"
EndFunc
Func cArg($c)
cTest($c)
Local Static $pi = ATan(1)*4
If ($c[0] > 0) Then Return ATan($c[1]/$c[0])
If ($c[0] < 0) And ($c[1] >= 0) Then Return ATan($c[1]/$c[0])+$pi
If ($c[0] < 0) And ($c[1] < 0) Then Return ATan($c[1]/$c[0])-$pi
If ($c[0] = 0) And ($c[1] > 0) Then Return $pi/2
If ($c[0] = 0) And ($c[1] < 0) Then Return -$pi/2
Return SetError(1, 0, "-1.#IND")
EndFunc
Func cAbs($c)
cTest($c)
Return Sqrt($c[0]^2 + $c[1]^2)
EndFunc
Func cAdd($a, $b)
cTest($a)
cTest($b)
Local $c[2] = [ $a[0]+$b[0] , $a[1]+$b[1] ]
Return $c
EndFunc
Func cSub($a, $b)
cTest($a)
cTest($b)
Local $c[2] = [ $a[0]-$b[0] , $a[1]-$b[1] ]
Return $c
EndFunc
Func cMul($a, $b)
cTest($a)
cTest($b)
Local $c[2] = [ $a[0]*$b[0]-$a[1]*$b[1] , $a[1]*$b[0]+$a[0]*$b[1] ]
Return $c
EndFunc
Func cDiv($a, $b)
cTest($a)
cTest($b)
Local $c[2] = [ ($a[0]*$b[0]+$a[1]*$b[1])/($b[0]^2+$b[1]^2) , ($a[1]*$b[0]-$a[0]*$b[1])/($b[0]^2+$b[1]^2) ]
Return $c
EndFunc
Func cSqrt($c)
cTest($c)
Local $sqrt[2]
If ($c[1] = 0) Then
If ($c[0] >= 0) Then
$sqrt[0] = Sqrt($c[0])
$sqrt[1] = 0
Else
$sqrt[0] = 0
$sqrt[1] = Sqrt(Abs($c[0]))
EndIf
Else
$sqrt[0] = Sqrt(($c[0]+cAbs($c))/2)
$sqrt[1] = _sgn($c[1])*Sqrt((-$c[0]+cAbs($c))/2)
EndIf
Return $sqrt
EndFunc
Func _sgn($x)
Return ($x > 0) - ($x < 0)
EndFunc
Func cExp($_)
cTest($_)
Return cMul(c(Exp($_[0]), 0), c(Round(Cos($_[1]), 15), Round(Sin($_[1]), 15)))
EndFunc
Func cLog($_)
cTest($_)
Return c(Log(cAbs($_)), cArg($_))
EndFunc
Func cPow($a, $b)
cTest($a)
cTest($b)
Return cExp(cMul($b, cLog($a)))
EndFunc
Func cSin($_)
cTest($_)
Return c(Sin($_[0])*_cosh($_[1]), Cos($_[0])*_sinh($_[1]))
EndFunc
Func cCos($_)
cTest($_)
Return c(Cos($_[0])*_cosh($_[1]), -Sin($_[0])*_sinh($_[1]))
EndFunc
Func cTan($c)
cTest($c)
Return cDiv(cSin($c), cCos($c))
EndFunc
Func cCot($c)
cTest($c)
Return cDiv(cCos($c), cSin($c))
EndFunc
Func cSec($c)
cTest($c)
Return cDiv(1, cCos($c))
EndFunc
Func cCsc($c)
cTest($c)
Return cDiv(1, cSin($c))
EndFunc
Func _sinh($x)
Return (Exp($x)-Exp(-$x))/2
EndFunc
Func _cosh($x)
Return (Exp($x)+Exp(-$x))/2
EndFunc