一応、必要だから下記しておく。
+++++++++++++++++++++++++++++++++++++++++++++++
1.複素関数の実数部と虚数部について
以下のリストのように、複素関数の実数部と虚数部はサブルーチン化しておき、本体プログラムより必要に応じて
DEF FN コマンドで呼び出している。関数は随時追加している。
-------------------------------------------------------
10000 REM KOSHIKI FILE
NAME KOSHIKI ,Ver.4
10010 EE=2.718281#
:P=3.141592#
10020 DEF
FNSINH(X)=.5#*(EE^X-EE^(-X))
10030 DEF FNCOSH(X)=.5#*(EE^X+EE^(-X))
10040 REM Z^n
10050 DEF FNR2(X,Y)=X^2-Y^2
10060 DEF FNI2(X,Y)=2*X*Y
10070 DEF FNR3(X,Y)=X*(X^2-3*Y^2)
10080 DEF FNI3(X,Y)=Y*(3*X^2-Y^2)
10090 DEF FNR4(X,Y)=FNR2(X,Y)^2-FNI2(X,Y)^2
10100 DEF FNI4(X,Y)=2*FNR2(X,Y)*FNI2(X,Y)
10110 DEF
FNR5(X,Y)=FNR2(X,Y)*FNR3(X,Y)-FNI2(X,Y)*FNI3(X,Y)
10120 DEF
FNI5(X,Y)=FNR2(X,Y)*FNI3(X,Y)+FNI2(X,Y)*FNR3(X,Y)
10130 DEF FNR6(X,Y)=FNR3(X,Y)^2-FNI3(X,Y)^2
10140 DEF FNI6(X,Y)=2*FNR3(X,Y)*FNI3(X,Y)
10150 DEF FNR7(X,Y)=X*FNR6(X,Y)-Y*FNI6(X,Y)
10160 DEF FNI7(X,Y)=Y*FNR6(X,Y)+X*FNI6(X,Y)
10170 DEF
FNR8(X,Y)=FNR6(X,Y)*FNR2(X,Y)-FNI6(X,Y)*FNI2(X,Y)
10180 DEF
FNI8(X,Y)=FNR6(X,Y)*FNI2(X,Y)+FNI6(X,Y)*FNR2(X,Y)
10190 DEF
FNR9(X,Y)=FNR6(X,Y)*FNR3(X,Y)-FNI6(X,Y)*FNI3(X,Y)
10200 DEF
FNI9(X,Y)=FNR6(X,Y)*FNI3(X,Y)+FNI6(X,Y)*FNR3(X,Y)
10210 DEF
FNR10(X,Y)=FNR6(X,Y)*FNR4(X,Y)-FNI6(X,Y)*FNI4(X,Y)
10220 DEF
FNI10(X,Y)=FNR6(X,Y)*FNI4(X,Y)+FNI6(X,Y)*FNR4(X,Y)
10222 DEF
FNR11(X,Y)=FNR6(X,Y)*FNR5(X,Y)-FNI6(X,Y)*FNI5(X,Y)
10224 DEF
FNI11(X,Y)=FNI6(X,Y)*FNR5(X,Y)+FNR6(X,Y)*FNI5(X,Y)
10226 DEF FNR12(X,Y)=(FNR6(X,Y))^2-(FNI6(X,Y)^2)
10228 DEF FNI12(X,Y)=2*FNR6(X,Y)*FNI6(X,Y)
10230 DEF
FNR13(X,Y)=FNR6(X,Y)*FNR7(X,Y)-FNI6(X,Y)*FNI7(X,Y)
10232 DEF
FNI13(X,Y)=FNI6(X,Y)*FNR7(X,Y)+FNR6(X,Y)*FNI7(X,Y)
10238 REM Sin Z
10240 DEF FNSINR(X,Y)=.5#*SIN(X)*(EE^Y+EE^(-Y))
10250 DEF FNSINI(X,Y)=.5#*COS(X)*(EE^Y-EE^(-Y))
10260 REM COS Z
10270 DEF FNCOSR(X,Y)=.5#*COS(X)*(EE^Y+EE^(-Y))
10280 DEF FNCOSI(X,Y)=-.5#*SIN(X)*(EE^Y-EE^(-Y))
10282 REM TAN Z
10284 DEF
FNTANR(X,Y)=FNSINR(X,Y)*FNCOSR(X,Y)-FNSINI(X,Y)*FNCOSI(X,Y)/((FNCOSR(X,Y))^2+(FNCOSI(X,Y))^2)
10286 DEF
FNTANI(X,Y)=FNSINR(X,Y)*FNCOSI(X,Y)+FNCOSR(X,Y)*FNSINI(X,Y)/((FNCOSR(X,Y))^2+(FNCOSI(X,Y))^2)
10290 REM e^Z
10300 DEF FNEZR(X,Y)=COS(Y)*EE^X
10310 DEF FNEZI(X,Y)=SIN(Y)*EE^X
10320 REM Sinh Z
10330 DEF FNSINHR(X,Y)=.5#*COS(Y)*(EE^X-EE^(-X))
10340 DEF FNSINHI(X,Y)=.5#*SIN(Y)*(EE^X+EE^(-X))
10350 REM Cosh Z
10360 DEF FNCOSHR(X,Y)=.5#*COS(Y)*(EE^X+EE^(-X))
10370 DEF FNCOSHI(X,Y)=.5#*SIN(Y)*(EE^X-EE^(-X))
10380 REM Sin(Sin Z)
10390 DEF
FNSINSINR(X,Y)=SIN(FNSINR(X,Y))*FNCOSH(FNSINI(X,Y))
10400 DEF
FNSINSINI(X,Y)=COS(FNSINR(X,Y))*FNSINH(FNSINI(X,Y))
10410 REM Cos(Sin Z)
10420 DEF FNCOSSINR(X,Y)=COS(FNSINR(X,Y))*FNCOSH(FNSINI(X,Y))
10430 DEF
FNCOSSINI(X,Y)=-SIN(FNSINR(X,Y))*FNSINH(FNSINI(X,Y))
10440 REM e^(Z^2)
10450 DEF
FNEZR2(X,Y)=(EE^(FNR2(X,Y)))*COS(FNI2(X,Y))
10460 DEF
FNEZI2(X,Y)=(EE^(FNR2(X,Y)))*SIN(FNI2(X,Y))
10470 REM e^(Z^3)
10480 DEF
FNEZR3(X,Y)=(EE^(FNR3(X,Y)))*COS(FNI3(X,Y))
10490 DEF
FNEZI3(X,Y)=(EE^(FNR3(X,Y)))*SIN(FNI3(X,Y))
10500 REM e^(Z^4)
10510 DEF
FNEZR4(X,Y)=(EE^(FNR4(X,Y)))*COS(FNI4(X,Y))
10520 DEF
FNEZI4(X,Y)=(EE^(FNR4(X,Y)))*SIN(FNI4(X,Y))
10530 REM e^(Z^5)
10540 DEF
FNEZR5(X,Y)=(EE^(FNR5(X,Y)))*COS(FNI5(X,Y))
10550 DEF
FNEZI5(X,Y)=(EE^(FNR5(X,Y)))*SIN(FNI5(X,Y))
10560 REM e^(Z^6)
10570 DEF
FNEZR6(X,Y)=(EE^(FNR6(X,Y)))*COS(FNI6(X,Y))
10580 DEF
FNEZI6(X,Y)=(EE^(FNR6(X,Y)))*SIN(FNI6(X,Y))
10590 REM e^(Z^7)
10600 DEF
FNEZR7(X,Y)=(EE^(FNR7(X,Y)))*COS(FNI7(X,Y))
10610 DEF
FNEZI7(X,Y)=(EE^(FNR7(X,Y)))*SIN(FNI7(X,Y))
10620 REM e^(Z^8)
10630 DEF
FNEZR8(X,Y)=(EE^(FNR8(X,Y)))*COS(FNI8(X,Y))
10640 DEF
FNEZI8(X,Y)=(EE^(FNR8(X,Y)))*SIN(FNI8(X,Y))
10650 REM e^(Z^9)
10660 DEF FNEZR9(X,Y)=(EE^(FNR9(X,Y)))*COS(FNI9(X,Y))
10670 DEF
FNEZI9(X,Y)=(EE^(FNR9(X,Y)))*SIN(FNI9(X,Y))
10680 REM e^(Z^10)
10690 DEF
FNEZR10(X,Y)=(EE^(FNR10(X,Y)))*COS(FNI10(X,Y))
10700 DEF
FNEZI10(X,Y)=(EE^(FNR10(X,Y)))*SIN(FNI10(X,Y))
10710 REM e^(SIN Z)
10720 DEF
FNEZSINR(X,Y)=(EE^(FNSINR(X,Y)))*COS(FNSINI(X,Y))
10730 DEF
FNEZSINI(X,Y)=(EE^(FNSINR(X,Y)))*SIN(FNSINI(X,Y))
10740 REM e^(SINH Z)
10750 DEF
FNEZSINHR(X,Y)=EE^(FNSINHR(X,Y))*COS(FNSINHI(X,Y))
10760 DEF
FNEZSINHI(X,Y)=EE^(FNSINHR(X,Y))*SIN(FNSINHI(X,Y))
10780 REM e^(COS Z)
10790 DEF
FNEZCOSR(X,Y)=(EE^(FNCOSR(X,Y)))*COS(FNCOSI(X,Y))
10800 DEF
FNEZCOSI(X,Y)=(EE^(FNCOSR(X,Y)))*SIN(FNCOSI(X,Y))
10810 REM e^(COSH Z)
10820 DEF
FNEZCOSHR(X,Y)=EE^(FNCOSHR(X,Y))*COS(FNCOSHI(X,Y))
10830 DEF FNEZCOSHI(X,Y)=EE^(FNCOSHR(X,Y))*SIN(FNCOSHI(X,Y))
10840
RETURN----------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++
2.算術関数:ATAN の計算方法
BASIC/98での、arctan(Y/X)の算術関数ATN(X/Y)の演算結果は、
-π/2~π/2の値となります。従って、上図の図1の、第一及び第四象限では、算術関数ATN(X/Y)は、そのままの値で問題はない。問題となるのは、第二及び第三象限の場合である。
第二及び第三象限の場合でのθ=arctan(Y/X)の計算方法は、いくつか考えられるが、其のいくつかの方法を試みた結果、私は、現在、上図方法で計算している。
この方法が、現在のところ、全象限での画像の連続性は最も良い。
これは経験上のことで未だ理屈として正しいのかどうか確信はない。
もっと理屈にかなったθ=arctan(Y/X)の計算方法が有るかも知れない。
--------------------------------------------------
私は、θ=arctan(Y/X)の計算は下記のようなプログラムでサブルーチン化している。
5000 REM θの計算:file name ARCTAN3A
5010 IF X=0 THEN 5020 ELSE 5050
5020 IF Y=0 THEN TH=0 :GOTO 5090
5030 IF Y>0 THEN TH=P/2 ELSE TH=-P/2
5040 GOTO 5090
5050 AA=Y/X
5060 IF X>0 THEN TH=ATN(AA) :GOTO 5090
5070 IF X<0 AND Y>0 THEN TH=ATN(AA)+P :GOTO 5090
5080 IF X<0 AND Y<0 THEN TH=ATN(AA)-P
5090 RETURN
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.複素関数:Z^Zの計算方法
複素平面上の点Zが与えられていたとき、複素関数:Z^Zの実数部と虚数部の計算をサブルーチン化しておく。 ここで、このサブルーチンを実行するときは、点ZのX,Y,R及びθ(プログラムでの変数名:TH)は、与えられているものとする。また、自然対数eの底(プログラムでの変数名:EE)も与えられているものとする。
X及びYから、R及びθは、R=(X^2+Y^2)^0.5 , θ=arctan(Y/X) より求める。(注:θ=arctan(Y/X) は、あらかじめ、サブルーチン ARCTAN3A で求めておく。)
複素関数:Z^Zの実数部と虚数部の計算方法を以下に示す。
(これも私が数学の公式集を参考にして計算したものであるから誤りがあるかも知れないから御注意!! : 下式で掛け算の記号(*)は適宜付けたり省力したりしている。下式はゴチャゴチャしているが、やっていることは単純なこと。こういうところが数式というものの欠点の一つだと思う。)
Z^Z={R*e^(iθ)}^(X+iY)={R^(X+iY)}*[{e^(iθ)}^{(X+iY)}]
=[(R^X)*{R^(iY)}]*[e^{iθ*(X+iY)}
=[(R^X)*e^(-θY)]*[(R^iY)*(e^iθX)]・・・(1)
ここで、上式を分かりやすくするために、
A=(R^X)*e^(-θY)
とおくと、
Z^Z=A*[(R^iY)*(e^iθX)]・・・(2)
ここで、e^x=R として、x を求める。logの底をeとすると、
logR=log(e^x)=x*log e=x
従って、R=e^x=e^logR だから、(1)式の第2項に、このRを代入すると、
(1)式の第2項=[(R^iY)*(e^iθX)]={(e^logR)^iY}*{(e^iθX)}
={e^i(YlogR)} *{(e^iθX)}
=e^i(YlogR+θX)・・・(3)
ここで、上式を分かりやすくするために、
B=(YlogR+θX)
とおくと、
(1)式の第2項=(3)式=e^iB=cosB+isinB
となるから、(1)式、即ち、Z^Z は、
Z^Z=A*(3)式=A*( cosB+isinB)=AcosB +i(AsinB)
となる。従って、
Z^Zの実数部= AcosB
Z^Zの虚数部= AsinB
となる。ここで、
A=(R^X)*e^(-θY) , B=(YlogR+θX)
以上より、Z^Zの実数部と虚数部を計算するサブルーチン・プログラムは、下記のようにします。下記のプログラムの行9010,9020,9040,9060及び9070は、使用しているBASICの制約によるもので、本来は不要です。
9000 REM Z^ZのRe.ZとIm.Zの計算
9002 REM ZのX,Y,R,θ(TH)は与えられているものとする。
9004 REM 自然対数の底e:EE=2.718281も与えられているものとする。
9010 IF TH*Y<-709 THEN TH*Y=-709 :GOTO 9030
9020 IF TH*Y>709 THEN TH*Y=709
9030 A1=(R^X)*EE^(-TH*Y)
9040 IF R=0 THEN R=1E^-100
9050 B=Y*LOG(R)+TH*X
9060 IF B>1.0E+9 THEN B=1.0E+9 :GOTO 9080
9070 IF B<-1.0E+9 THEN B=-1.0E+9
9080 ZZR=A1*COS(B)
9090 ZZI=A1*SIN(B)
9100 RETURN
上記のプログラムにおいて、Z^Zの実数部値をZZRとおき、Z^Zの虚数部値をZZIとした、それらをメイン・プログラムへ、RETURNすればよい。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4.複素関数:Z^f(Z)の実数部と虚数部の計算
Zを複素平面上の点とし、f(Z)を任意の複素関数とするとき、複素関数:Z^f(Z)の実数部と虚数部を求める計算プログラムをサブルーチン化ておく。
そのために、Z^f(Z)の実数部と虚数部を以下のようにして求める。
Z=X+iY=R*e^iθとし,ここで、R=(X^2+Y^2)^0.5 ,θ=arctan(Y/X)から、Rとθは、このサブルーチンの入力値とする。また、任意のf(Z)の実数部(これをREFとする)と虚数部(これをIMFとする)も既に与えられているとする。
即ち、f(Z)=FZR+i*FZI とする。 (ここで、FZR , FZI は既知の実数とする)
(以下の計算式において掛け算の記号(*)は煩雑さを避けるため適宜省略する。)
Z^f(Z)=( R*e^iθ)^( FZR+i*FZI)=( (R*e^iθ)^FZR)*( (R*e^iθ)^iFZI )
=(R^FZR)*(e^(iθ*FZR))*(R^iFZI)*e^(-θ*FZI)
=(R^FZR)*e^(-θ*FZI)*e^(iθ*FZR)*R^(i*FZI)
ここで、ZF1=(R^FZR)*e^(-θ*FZI) とおくと、
Z^f(Z)=ZF1* ( e^(iθ*FZR)*R^(i*FZI) ) ・・・・・(1)
ここで、R=e^logR (但し、logの底はeとする) だから
R^(i*FZI)=(e^logR)^(i*FZI)=e^(i*logR*FZI)
従って、(1)より、
Z^f(Z)=ZF1*e^i(θ*FZR+logR*FZI)
ここで、ZF2=θ*FZR+logR*FZI とおくと、
Z^f(Z)=ZF1*e^(*ZF2)=ZF1*(cosZF2+i*sinZF2)
=ZF1*cosZF2 + i*(ZF1*sinZF2)
となるから、
Z^f(Z)の実数部= ZF1*cosZF2
Z^f(Z)の虚数部= ZF1*sinZF2
( 但し、ZF1=(R^FZR)*e^(-θ*FZI) , ZF2=θ*FZR+logR*FZI )
となり、Z^f(Z)の実数部と虚数部が求まった。
従って、Z^f(Z)の実数部と虚数部を、それぞれ、ZFZR,ZFZIとすれば、求めるサブルーチン・プログラムは下記のようになる。
20000 REM Z^(f(z)の計算:file name ZFZ
20010 IF R=0 THEN 20060
20020 ZF1=(R^FZR)*EXP(-TH*FZI)
20030 ZF2=TH*FZR+LOG(R)*FZI
20040 ZFZR=ZF1*COS(ZF2)
20050 ZFZI=ZF1*SIN(ZF2)
20060 RETURN
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5.f(Z)^g(Z)の実数部と虚数部の計算
f(Z)とg(Z)を任意の複素関数とするとき、f(Z)^g(Z)の実数部と虚数部を求めるプログラムをサブルーチン化しておく。ここで、このサブルーチンの入力値として、f(Z)及びg(Z)の、おのおのの実数部、虚数部は以下のように与えられているとする。
f(Z)の実数部、虚数部を、それぞれ、FZR、FZI とする。
即ち、f(Z)=FZR + i*FZI
g(Z)の実数部、虚数部を、それぞれ、GZR、GZI とする。
即ち、g(Z)=GZR + i*GZI
また、f(Z)は極座標でも表して、f(Z)= =FZR + i*FZI=R*e^iθ とする。
ここで、R=(FZR^2+FZI^2)^0.5 , θ=arctan(FZI/FZR) である。
上記の条件のもとに、f(Z)^g(Z)の実数部と虚数部を、以下のようにして求める。(以下の式において、掛け算の記号(*)は煩雑さを避けるため適宜省略する)
f(Z)^g(Z)=(R*e^iθ)^( GZR + i*GZI)
=( R^(GZR+i*GZI) )*( e^(iθ(GZR+iGZI) )
=( R^GZR)* ( e^(-θ*GZI) ) * (R^i*GZI)*(e^iθGZR)
ここで、ZF1= (R^GZR)* ( e^(-θ*GZI) とおけば、
f(Z)^g(Z)=ZF1* (R^i*GZI)*(e^iθGZR)
=ZF1*( e^(logR))^(iGZI) ) * (e^iθGZR) (ここで、logの底はeとする)
=ZF1*e^i*(logR*GZI+θ*GZR)
ここで、ZF2=logR*GZI+θ*GZR とおけば、
f(Z)^g(Z)=ZF1*e^i*ZF2
=ZFI*(cosZF2+i*sinZF2)
となり、f(Z)^g(Z)の実数部=ZF1*cosZF2
f(Z)^g(Z)の虚数部=ZF1*sinZF2
となる。ここで、ZF1= (R^GZR)* ( e^(-θ*GZI)
ZF2=logR*GZI+θ*GZR
である。従って、f(Z)^g(Z)の実数部と虚数部を求めるプログラムをサブルーチン・プロクグラムは以下のようにすればよい。
30000 REM f(Z)^g(Z)の計算:file name FGZ
30010 IF R=0 THEN 30060
30020 ZF1=(R^GZR)*EXP(-TH*GZI)
30030 ZF2=TH*GZR+LOG(R)*GZI
30040 FZGZR=ZF1*COS(ZF2)
30050 FZGZI=ZF1*SIN(ZF2)
30060 RETURN
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6.プログラム実行時のエラー処理
プログラムを実行ときにエラーが発生したとき其のエラーの内容及びエラー発生行を表示させるプログラムをサブルーチン化しておくと便利である。
以下はBASIC/98 での其のサブルーチン・プログラムである。
50000 *エラー処理
50010 'file name ER1
50020 IF ERR=6 OR ERR=11 THEN 50080 ELSE 50030
50030 PRINT "「overflow」及び「ゼロで除算」以外のエラー"
50040 PRINT "エラー番号=";ERR
50050 PRINT "エラー発生行=";ERL
50060 PRINT "J=";J;"K=";K
50070 STOP
50080 RESUME NEXT
+++++++++++++++++++++++++++++++++++++++++++++
2.算術関数:ATAN の計算方法
BASIC/98での、arctan(Y/X)の算術関数ATN(X/Y)の演算結果は、
-π/2~π/2の値となります。従って、上図の図1の、第一及び第四象限では、算術関数ATN(X/Y)は、そのままの値で問題はない。問題となるのは、第二及び第三象限の場合である。
第二及び第三象限の場合でのθ=arctan(Y/X)の計算方法は、いくつか考えられるが、其のいくつかの方法を試みた結果、私は、現在、上図方法で計算している。
この方法が、現在のところ、全象限での画像の連続性は最も良い。
これは経験上のことで未だ理屈として正しいのかどうか確信はない。
もっと理屈にかなったθ=arctan(Y/X)の計算方法が有るかも知れない。
--------------------------------------------------
私は、θ=arctan(Y/X)の計算は下記のようなプログラムでサブルーチン化している。
5000 REM θの計算:file name ARCTAN3A
5010 IF X=0 THEN 5020 ELSE 5050
5020 IF Y=0 THEN TH=0 :GOTO 5090
5030 IF Y>0 THEN TH=P/2 ELSE TH=-P/2
5040 GOTO 5090
5050 AA=Y/X
5060 IF X>0 THEN TH=ATN(AA) :GOTO 5090
5070 IF X<0 AND Y>0 THEN TH=ATN(AA)+P :GOTO 5090
5080 IF X<0 AND Y<0 THEN TH=ATN(AA)-P
5090 RETURN
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.複素関数:Z^Zの計算方法
複素平面上の点Zが与えられていたとき、複素関数:Z^Zの実数部と虚数部の計算をサブルーチン化しておく。 ここで、このサブルーチンを実行するときは、点ZのX,Y,R及びθ(プログラムでの変数名:TH)は、与えられているものとする。また、自然対数eの底(プログラムでの変数名:EE)も与えられているものとする。
X及びYから、R及びθは、R=(X^2+Y^2)^0.5 , θ=arctan(Y/X) より求める。(注:θ=arctan(Y/X) は、あらかじめ、サブルーチン ARCTAN3A で求めておく。)
複素関数:Z^Zの実数部と虚数部の計算方法を以下に示す。
(これも私が数学の公式集を参考にして計算したものであるから誤りがあるかも知れないから御注意!! : 下式で掛け算の記号(*)は適宜付けたり省力したりしている。下式はゴチャゴチャしているが、やっていることは単純なこと。こういうところが数式というものの欠点の一つだと思う。)
Z^Z={R*e^(iθ)}^(X+iY)={R^(X+iY)}*[{e^(iθ)}^{(X+iY)}]
=[(R^X)*{R^(iY)}]*[e^{iθ*(X+iY)}
=[(R^X)*e^(-θY)]*[(R^iY)*(e^iθX)]・・・(1)
ここで、上式を分かりやすくするために、
A=(R^X)*e^(-θY)
とおくと、
Z^Z=A*[(R^iY)*(e^iθX)]・・・(2)
ここで、e^x=R として、x を求める。logの底をeとすると、
logR=log(e^x)=x*log e=x
従って、R=e^x=e^logR だから、(1)式の第2項に、このRを代入すると、
(1)式の第2項=[(R^iY)*(e^iθX)]={(e^logR)^iY}*{(e^iθX)}
={e^i(YlogR)} *{(e^iθX)}
=e^i(YlogR+θX)・・・(3)
ここで、上式を分かりやすくするために、
B=(YlogR+θX)
とおくと、
(1)式の第2項=(3)式=e^iB=cosB+isinB
となるから、(1)式、即ち、Z^Z は、
Z^Z=A*(3)式=A*( cosB+isinB)=AcosB +i(AsinB)
となる。従って、
Z^Zの実数部= AcosB
Z^Zの虚数部= AsinB
となる。ここで、
A=(R^X)*e^(-θY) , B=(YlogR+θX)
以上より、Z^Zの実数部と虚数部を計算するサブルーチン・プログラムは、下記のようにします。下記のプログラムの行9010,9020,9040,9060及び9070は、使用しているBASICの制約によるもので、本来は不要です。
9000 REM Z^ZのRe.ZとIm.Zの計算
9002 REM ZのX,Y,R,θ(TH)は与えられているものとする。
9004 REM 自然対数の底e:EE=2.718281も与えられているものとする。
9010 IF TH*Y<-709 THEN TH*Y=-709 :GOTO 9030
9020 IF TH*Y>709 THEN TH*Y=709
9030 A1=(R^X)*EE^(-TH*Y)
9040 IF R=0 THEN R=1E^-100
9050 B=Y*LOG(R)+TH*X
9060 IF B>1.0E+9 THEN B=1.0E+9 :GOTO 9080
9070 IF B<-1.0E+9 THEN B=-1.0E+9
9080 ZZR=A1*COS(B)
9090 ZZI=A1*SIN(B)
9100 RETURN
上記のプログラムにおいて、Z^Zの実数部値をZZRとおき、Z^Zの虚数部値をZZIとした、それらをメイン・プログラムへ、RETURNすればよい。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4.複素関数:Z^f(Z)の実数部と虚数部の計算
Zを複素平面上の点とし、f(Z)を任意の複素関数とするとき、複素関数:Z^f(Z)の実数部と虚数部を求める計算プログラムをサブルーチン化ておく。
そのために、Z^f(Z)の実数部と虚数部を以下のようにして求める。
Z=X+iY=R*e^iθとし,ここで、R=(X^2+Y^2)^0.5 ,θ=arctan(Y/X)から、Rとθは、このサブルーチンの入力値とする。また、任意のf(Z)の実数部(これをREFとする)と虚数部(これをIMFとする)も既に与えられているとする。
即ち、f(Z)=FZR+i*FZI とする。 (ここで、FZR , FZI は既知の実数とする)
(以下の計算式において掛け算の記号(*)は煩雑さを避けるため適宜省略する。)
Z^f(Z)=( R*e^iθ)^( FZR+i*FZI)=( (R*e^iθ)^FZR)*( (R*e^iθ)^iFZI )
=(R^FZR)*(e^(iθ*FZR))*(R^iFZI)*e^(-θ*FZI)
=(R^FZR)*e^(-θ*FZI)*e^(iθ*FZR)*R^(i*FZI)
ここで、ZF1=(R^FZR)*e^(-θ*FZI) とおくと、
Z^f(Z)=ZF1* ( e^(iθ*FZR)*R^(i*FZI) ) ・・・・・(1)
ここで、R=e^logR (但し、logの底はeとする) だから
R^(i*FZI)=(e^logR)^(i*FZI)=e^(i*logR*FZI)
従って、(1)より、
Z^f(Z)=ZF1*e^i(θ*FZR+logR*FZI)
ここで、ZF2=θ*FZR+logR*FZI とおくと、
Z^f(Z)=ZF1*e^(*ZF2)=ZF1*(cosZF2+i*sinZF2)
=ZF1*cosZF2 + i*(ZF1*sinZF2)
となるから、
Z^f(Z)の実数部= ZF1*cosZF2
Z^f(Z)の虚数部= ZF1*sinZF2
( 但し、ZF1=(R^FZR)*e^(-θ*FZI) , ZF2=θ*FZR+logR*FZI )
となり、Z^f(Z)の実数部と虚数部が求まった。
従って、Z^f(Z)の実数部と虚数部を、それぞれ、ZFZR,ZFZIとすれば、求めるサブルーチン・プログラムは下記のようになる。
20000 REM Z^(f(z)の計算:file name ZFZ
20010 IF R=0 THEN 20060
20020 ZF1=(R^FZR)*EXP(-TH*FZI)
20030 ZF2=TH*FZR+LOG(R)*FZI
20040 ZFZR=ZF1*COS(ZF2)
20050 ZFZI=ZF1*SIN(ZF2)
20060 RETURN
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5.f(Z)^g(Z)の実数部と虚数部の計算
f(Z)とg(Z)を任意の複素関数とするとき、f(Z)^g(Z)の実数部と虚数部を求めるプログラムをサブルーチン化しておく。ここで、このサブルーチンの入力値として、f(Z)及びg(Z)の、おのおのの実数部、虚数部は以下のように与えられているとする。
f(Z)の実数部、虚数部を、それぞれ、FZR、FZI とする。
即ち、f(Z)=FZR + i*FZI
g(Z)の実数部、虚数部を、それぞれ、GZR、GZI とする。
即ち、g(Z)=GZR + i*GZI
また、f(Z)は極座標でも表して、f(Z)= =FZR + i*FZI=R*e^iθ とする。
ここで、R=(FZR^2+FZI^2)^0.5 , θ=arctan(FZI/FZR) である。
上記の条件のもとに、f(Z)^g(Z)の実数部と虚数部を、以下のようにして求める。(以下の式において、掛け算の記号(*)は煩雑さを避けるため適宜省略する)
f(Z)^g(Z)=(R*e^iθ)^( GZR + i*GZI)
=( R^(GZR+i*GZI) )*( e^(iθ(GZR+iGZI) )
=( R^GZR)* ( e^(-θ*GZI) ) * (R^i*GZI)*(e^iθGZR)
ここで、ZF1= (R^GZR)* ( e^(-θ*GZI) とおけば、
f(Z)^g(Z)=ZF1* (R^i*GZI)*(e^iθGZR)
=ZF1*( e^(logR))^(iGZI) ) * (e^iθGZR) (ここで、logの底はeとする)
=ZF1*e^i*(logR*GZI+θ*GZR)
ここで、ZF2=logR*GZI+θ*GZR とおけば、
f(Z)^g(Z)=ZF1*e^i*ZF2
=ZFI*(cosZF2+i*sinZF2)
となり、f(Z)^g(Z)の実数部=ZF1*cosZF2
f(Z)^g(Z)の虚数部=ZF1*sinZF2
となる。ここで、ZF1= (R^GZR)* ( e^(-θ*GZI)
ZF2=logR*GZI+θ*GZR
である。従って、f(Z)^g(Z)の実数部と虚数部を求めるプログラムをサブルーチン・プロクグラムは以下のようにすればよい。
30000 REM f(Z)^g(Z)の計算:file name FGZ
30010 IF R=0 THEN 30060
30020 ZF1=(R^GZR)*EXP(-TH*GZI)
30030 ZF2=TH*GZR+LOG(R)*GZI
30040 FZGZR=ZF1*COS(ZF2)
30050 FZGZI=ZF1*SIN(ZF2)
30060 RETURN
6.プログラム実行時のエラー処理
プログラムを実行ときにエラーが発生したとき其のエラーの内容及びエラー発生行を表示させるプログラムをサブルーチン化しておくと便利である。
以下はBASIC/98 での其のサブルーチン・プログラムである。
50000 *エラー処理
50010 'file name ER1
50020 IF ERR=6 OR ERR=11 THEN 50080 ELSE 50030
50030 PRINT "「overflow」及び「ゼロで除算」以外のエラー"
50040 PRINT "エラー番号=";ERR
50050 PRINT "エラー発生行=";ERL
50060 PRINT "J=";J;"K=";K
50070 STOP
50080 RESUME NEXT



