Deutsch
Quelltexte/ Codesnippets

Komplexe Funktionen für Komplexe Zahlen

 

p.specht

Nachstehend eine in XProfan-11 zum Laufen gebrachte Studie, wie man Komplexe Zahlen als Vier-Tupel (Karthesisch+Polar) darstellen kann, und dadurch manche Funktionen (z.B. trigonometrische) leicht auf Komplexe Zahlen erweitern könnte:
WindowTitle "PGM TComplex: Operationen mit Komplexen Zahlen (Re+j*Im)"
' Q:https://jean-pierre.moreau.pagesperso-orange.fr/Basic/tcomplex_bas.txt
' (D) Demo für eine Übertragung nach XProfan-11.2a. Ohne jede Gewähr!
' 2017-03 by P.Specht, Vienna/Austria. Mögliche Rechte Dritter ungeprüft.
'
' A complex number Z is represented as an array with 4 locations:
' z(1), z(2) for algebraic form  x+%j y  = (x,y)
' z(3), z(4) for polar form  r*exp(%i*t) = r versor t = (r \ t)
WindowStyle 24
Window %maxx*0.2,%maxy*0.1 - %maxx*0.6,%maxy*0.6
font 2
Declare ZZ![4],Z![4],Z1![4],Z2![4],temp![4],u![4]'Complex numbers
Declare tmp!,x!,y!,r!,t!,i&
var XINF!=1.2E16'big number
var TINY!=val("1E-16")'small
var PI!=4*ArcTan(1)
var F$="#0.0000"
x!=1  : y!=-2   : AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
x!=2.5: y!=5.75 : AssignXY(ZZ![],x!,y!):Z2![]=ZZ![&index]
AddCpx(ZZ![],Z1![],Z2![]):Z![]=ZZ![&index]
PRINT "\n Z1 = ";:ZZ![]=Z1![&index]:DsplCpx(ZZ![])
PRINT "\n Z2 = ";:ZZ![]=Z2![&index]:DsplCpx(ZZ![])
PRINT "\n Z1+Z2 = ";:ZZ![]=Z![&index]:DsplCpx(ZZ![])
PRINT "\n\n Z1+Z2 polar = ";:DsplCpxR(ZZ![])
PRINT "\n Z1 polar = ";:ZZ![]=Z1![&index]:DsplCpxR(ZZ![])
PRINT "\n Z2 polar = ";:ZZ![]=Z2![&index]:DsplCpxR(ZZ![])
MulCpx(ZZ![],Z1![],Z2![])
PRINT "\n\n Z1*Z2 = ";:DsplCpx(ZZ![])
PRINT "\n Z1*Z2 polar = ";:DsplCpxR(ZZ![])
DivCpx(ZZ![],Z1![],Z2![])
PRINT "\n\n Z1 / Z2 polar = ";:DsplCpxR(ZZ![])
ExpCpx(ZZ![],Z1![])
PRINT "\n\n Exp(Z1) = ";:DsplCpx(ZZ![])
PRINT "\n Exp(Z1) polar = ";:DsplCpxR(ZZ![])
x!=2.5:y!=5.75 :AssignXY(ZZ![],x!,y!)
Z1![]=ZZ![&index]
AreaSinHypCpx(ZZ![],Z1![])
PRINT "\n\n AreaSinHypCpx(Z2) = ";:DsplCpx(ZZ![])
x!=1  : y!=-2   : AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
x!=2.5: y!=5.75 : AssignXY(ZZ![],x!,y!):Z2![]=ZZ![&index]
SubtrCpx
PRINT "\n\n SubtrCpx(zz=z1-z2) = ";:DsplCpx(ZZ![])
ChgSgnCpx
PRINT "\n ChgSgnCpx(zz) = ";:DsplCpx(ZZ![])
ConjugCpx
PRINT "\n ConjugCpx(zz) = ";:DsplCpx(ZZ![])
LnCpx
PRINT "\n LnCpx(zz) = ";:DsplCpx(ZZ![])
ExpCpx
PRINT "\n ExpCpx(zz) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
x!=0  : y!=1 :AssignXY(ZZ![],x!,y!):Z2![]=ZZ![&index]
PowerCpx
PRINT "\n PowerCpx(zz=z1^z2) = ";:DsplCpx(ZZ![])
waitinput
cls
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
CosCpx(zz![],Z1![])
PRINT "\n\n CosCpx(zz=cos Z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
SinCpx(zz![],Z1![])
PRINT "\n SinCpx(zz=sin Z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
TanCpx(zz![],Z1![])
PRINT "\n TanCpx(zz=tan Z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
ArcCosCpx
PRINT "\n\n ArcCosCpx (zz=acos Z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
ArcSinCpx(zz![],Z1![])
PRINT "\n ArcSinCpx(zz=asin Z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
ArcTanCpx(zz![],Z1![])
PRINT "\n ArcTanCpx(zz=atan Z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
CoshypCpx
PRINT "\n\n\n CoshypCpx(zz=cosh z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
SinhypCpx
PRINT "\n SinhypCpx(zz=sinh z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
TanhypCpx
PRINT "\n TanhypCpx(zz=sinh z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
AreaCoshypCpx
PRINT "\n\n AreaCoshypCpx(zz=acosh z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
AreaSinhypCpx
PRINT "\n AreaSinhypCpx(zz=asinh z1) = ";:DsplCpx(ZZ![])
x!=1  : y!=2 :AssignXY(ZZ![],x!,y!):Z1![]=ZZ![&index]
AreaTanhypCpx
PRINT "\n AreaTanhypCpx(zz=atanh z1) = ";:DsplCpx(ZZ![])
PRINT:beep:Waitinput
END

Proc AssignXY'def Complex ZZ by values x (=Re) and y (=Im)

    ZZ![1]=x!:ZZ![2]=y!
    ZZ![3]=SQRT(sqr(x!)+sqr(y!))

    IF x!=0

        IF y! > 0

            ZZ![4]=PI! / 2

        ELSEIF y!=0

            ZZ![4]=-PI! / 2

        ELSE

            ZZ![4]=0

        ENDIF

    ELSE

        ZZ![4]=ArcTan(y!/x!)

        IF x! < 0

            IF y! >= 0

                ZZ![4]=ZZ![4] + PI!

            ELSE

                ZZ![4]=ZZ![4] - PI!

            ENDIF

        ENDIF

        case ZZ![4] > PI!:ZZ![4]=ZZ![4] - 2 * PI!
        case ZZ![4] < (-PI!):ZZ![4]=ZZ![4] + 2 * PI!

    ENDIF

EndProc

Proc AssignRT'define Cpx number by r and t in radians

    ZZ![3]=r!:ZZ![4]=t!
    case ZZ![4] > PI!:ZZ![4]=ZZ![4] - 2 * PI!
    case ZZ![4]<(-PI!):ZZ![4]= ZZ![4] + 2 * PI!
    ZZ![1]=r! * COS(t!):ZZ![2]=r! * SIN(t!)

endproc

Proc DsplCpx'Dspl Cpx number with x and y

    PRINT "("+format$(F$,ZZ![1])+" +j* "+format$(F$,ZZ![2])+")";

Endproc

Proc DsplCpxR'Dspl Cpx number with radius and phase in radians

    PRINT "("+format$(F$,ZZ![3])+" \ "+format$(F$,ZZ![4])+")";

Endproc

Proc AddCpx'add two Cpx numbers:ZZ=Z1+Z2

    ZZ![1]=Z1![1] + Z2![1]:ZZ![2]=Z1![2] + Z2![2]
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc SubtrCpx'subtract two Cpx numbers:ZZ=Z1-Z2

    ZZ![1]=Z1![1] - Z2![1]:ZZ![2]=Z1![2] - Z2![2]
    x!=ZZ![1]:y!=ZZ![2]:AssignXY(ZZ![],x!,y!)

EndProc

Proc ChgSgnCpx'change sign of a Cpx number:ZZ=-ZZ

    ZZ![1]=-1*ZZ![1]:ZZ![2]=-1*ZZ![2]
    x!=ZZ![1]:y!=ZZ![2]:AssignXY(ZZ![],x!,y!)

EndProc

Proc ConjugCpx'change sign of Im of a Cpx number

    ZZ![2]=-1*ZZ![2]
    x!=ZZ![1]:y!=ZZ![2]:AssignXY(ZZ![],x!,y!)

EndProc

proc MulCpx'multiply two Cpx numbers:ZZ=Z1*Z2

    ZZ![3]=Z1![3] * Z2![3]:ZZ![4]=Z1![4] + Z2![4]
    r!=ZZ![3]:t!=ZZ![4]
    AssignRT(ZZ![],r!,t!)

endproc

Proc DivCpx'divide two Cpx numbers:ZZ=Z1/Z2

    IF Z2![3] < TINY!

        ZZ![3]=XINF!

    ELSE

        ZZ![3]=Z1![3] / Z2![3]

    ENDIF

    ZZ![4]=Z1![4] - Z2![4]
    r!=ZZ![3]:t!=ZZ![4]
    AssignRT(ZZ![],r!,t!)

endproc

Proc ExpCpx'exponential Cpx function:ZZ=Exp(Z1)

    IF EXP(Z1![1]) > XINF!

        tmp!=XINF!

    ELSE

        tmp!=EXP(Z1![1])

    ENDIF

    ZZ![1]=tmp! * COS(Z1![2]):ZZ![2]=tmp! * SIN(Z1![2])
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc LnCpx'ZZ=LN(Z1)

    IF Z1![3] <= 0

        ZZ![1]=-1*XINF!

    ELSE

        ZZ![1]=LN(Z1![3])

    ENDIF

    ZZ![2]=Z1![4]
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc PowerCpx'Cpx power ZZ=Z1^Z2

    LnCpx(temp![],Z1![])

    Whileloop 4:i&=&Loop

        Z1![i&]=Z2![i&]
        Z2![i&]=ZZ![i&]

    endwhile

    MulCpx(temp![],Z1![],temp![])
    Z1![]=ZZ![&index]
    ExpCpx(ZZ![],Z1![])

EndProc

Proc CosCpx'ZZ=COS(Z1)

    ZZ![1]=(EXP(-1*Z1![2]) * COS(Z1![1]) + EXP(Z1![2]) * COS(-Z1![1])) / 2
    ZZ![2]=(EXP(-1*Z1![2]) * SIN(Z1![1]) + EXP(Z1![2]) * SIN(-1*Z1![1])) / 2
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc SinCpx'ZZ=SIN(Z1)

    ZZ![1]=(EXP(-Z1![2]) * SIN(Z1![1]) - EXP(Z1![2]) * SIN(-1*Z![1])) / 2
    ZZ![2]=-1*(EXP(-Z1![2]) * COS(Z1![1]) - EXP(Z1![2]) * COS(-1*Z![1])) / 2
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc TanCpx'ZZ=TAN(Z1)

    SinCpx(ZZ![],Z1![])
    temp![]=ZZ![&index]
    CosCpx(ZZ![],Z1![])

    whileloop 4:i&=&Loop

        Z1![i&]=temp![i&]
        Z2![i&]=ZZ![i&]

    endwhile

    DivCpx(ZZ![],Z1![],Z2![])

EndProc

Proc CoshypCpx'ZZ=CH(Z1)

    ZZ![1]=(EXP(Z1![1]) * COS(Z1![2]) + EXP(-1*Z1![1]) * COS(-1*Z1![2])) / 2
    ZZ![2]=(EXP(Z1![1]) * SIN(Z1![2]) + EXP(-1*Z1![1]) * SIN(-1*Z1![2])) / 2
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc SinhypCpx'ZZ=SH(Z1)

    ZZ![1]=(EXP(Z1![1]) * COS(Z1![2]) - EXP(-1*Z1![1]) * COS(-1*Z1![2])) / 2
    ZZ![2]=-1*(EXP(Z1![1]) * SIN(Z1![2]) - EXP(-1*Z1![1]) * SIN(-1*Z1![2])) / 2
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc TanhypCpx'ZZ=TH(Z1)

    SinhypCpx(ZZ![],Z1![])
    temp![]=ZZ![&index]
    CoshypCpx(ZZ![],Z1![])

    whileloop 4:i&=&Loop

        Z1![i&]=temp![i&]
        Z2![i&]=ZZ![i&]

    Endwhile

    DivCpx(ZZ![],Z1![],Z2![])

EndProc

Proc ArcCosCpx'ZZ=ARCCOS(Z1)

    Z![]=Z1![&index]
    temp![1]=1 - sqr(Z1![1]) + sqr(Z1![2])
    temp![2]=-2 * Z1![1] * Z1![2]
    x!=temp![1]:y!=temp![2]:AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    x!=0.5:y!=0:AssignXY(ZZ![],x!,y!)
    Z2![]=ZZ![&index]
    PowerCpx(ZZ![],Z1![],Z2![])
    tmp!=ZZ![1]
    ZZ![1]=Z![1] - ZZ![2]
    ZZ![2]=Z![2] + tmp!
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    LnCpx(ZZ![],Z1![])
    tmp!=ZZ![1]
    ZZ![1]=ZZ![2]:ZZ![2]=-1*tmp!
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc ArcSinCpx'ZZ=ARCSIN(Z1)

    Z![]=Z1![&index]
    temp![1]=1 - sqr(Z1![1]) + sqr(Z1![2])
    temp![2]=-2 * Z1![1] * Z1![2]
    x!=temp![1]:y!=temp![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    x!=0.5:y!=0
    AssignXY(ZZ![],x!,y!)
    Z2![]=ZZ![&index]
    PowerCpx(ZZ![],Z1![],Z2![])
    ZZ![1]=ZZ![1] - Z![2]
    ZZ![2]=ZZ![2] + Z![1]
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    LnCpx(ZZ![],Z1![])
    tmp!=ZZ![1]
    ZZ![1]=ZZ![2]:ZZ![2]=-1*tmp!
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

proc ArctanCpx'ZZ=ARCTAN(Z1)

    temp![1]=-Z1![1]:temp![2]=1 - Z1![2]
    u![1]=Z1![1]:u![2]=1 + Z1![2]
    x!=temp![1]:y!=temp![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    x!=u![1]:y!=u![2]
    AssignXY(ZZ![],x!,y!)
    Z2![]=ZZ![&index]
    DivCpx(ZZ![],Z1![],Z2![])
    Z1![]=ZZ![&index]
    LnCpx(ZZ![],Z1![])
    tmp!=ZZ![1]
    ZZ![1]=ZZ![2] / 2:ZZ![2]=-1*tmp! / 2
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

Proc AreacoshypCpx'ZZ=ARGCH(Z1)

    Z![]=Z1![&index]
    temp![1]=-1 + sqr(Z1![1]) + sqr(Z1![2])
    temp![2]=2 * Z1![1] * Z1![2]
    x!=temp![1]:y!=temp![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    x!=0.5:y!=0
    AssignXY(ZZ![],x!,y!)
    Z2![]=ZZ![&index]
    PowerCpx(ZZ![],Z1![],Z2![])
    ZZ![1]=ZZ![1] + Z![1]
    ZZ![2]=ZZ![2] + Z![2]
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    LnCpx(ZZ![],Z1![])

EndProc

proc AreaSinHypCpx

    Z![]=Z1![&index]
    temp![1]=1 + sqr(Z1![1]) - sqr(Z1![2])
    temp![2]=2 * Z1![1] * Z1![2]
    x!=temp![1]:y!=temp![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    x!=0.5:y!=0:AssignXY(ZZ![],x!,y!)
    Z2![]=ZZ![&index]
    PowerCpx(ZZ![],Z1![],Z2![])
    x!=ZZ![1] + Z![1]:y!=ZZ![2] + Z![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    LnCpx(ZZ![],Z1![])

Endproc

Proc AreatanhypCpx'ZZ=ARGTH(Z1)

    Z![]=Z1![&index]
    Z1![1]=1 + Z![1]:Z1![2]=Z![2]
    Z2![1]=1 - Z![1]:Z2![2]=-1*Z![2]
    x!=Z1![1]:y!=Z1![2]
    AssignXY(ZZ![],x!,y!)
    Z1![]=ZZ![&index]
    x!=Z2![1]:y!=Z2![2]
    AssignXY(ZZ![],x!,y!)
    Z2![]=ZZ![&index]
    DivCpx(ZZ![],Z1![],Z2![])
    Z1![]=ZZ![&index]
    LnCpx(ZZ![],Z1![])
    ZZ![1]=ZZ![1]/2:ZZ![2]=ZZ![2]/2
    x!=ZZ![1]:y!=ZZ![2]
    AssignXY(ZZ![],x!,y!)

EndProc

 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
24.05.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.275 Betrachtungen

Unbenanntvor 0 min.
Erhard Wirth14.06.2024
p.specht20.11.2021
Uwe Lang20.11.2021
Manfred Barei19.11.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie