スタートページJavaScriptライブラリ目次

複素数関連 JavaScript関数ライブラリ cpx.js の利用解説書

ご利用にあたって

複素数の演算 

変数の型
  a,b 入力    複素数 [ar, ai] ar:実数部、ai:虚数部
  z  出力    複素数 z[0]:実数部、z[1]:虚数部
  x  入力、出力 実数スカラー
  d  入力、出力 複素数配列 [ [ar0,ai0], [ar1,ai1], … [arn,ain] ]
命令形式
  z = cps(a, op, b)  +,-,*,/,^(累乗)
  z = cps(a, op, x)  +,-,*,/,^(累乗), θ(回転)
  z = cps(x, op, b)  +,-,*,/,^(累乗)
  z = cpx(op, a)    +,-. /(逆数), i,-i(*i), conj(共役), e(指数)
  x = cpx(op, a)   abs(絶対値), θ(atan)
  d = cpx(op, a)   √(平方根)
  d = cps(x, op, b)  n√(n乗根)
  z = cpx(op, d)   Σ(sum), Π(prod)
例示
  2+3i → a = [2, 3]
  4+5i → b = [4, 5]
  (2+3i) + (4+5i) → cpx([2,3], "+", [4, 5]) → cpx(a, "+", b) ⇒ [6, 8]
  √(((2+3i) + (4+5i)) → cpx("√", cpx(a, "+", b))
記述例とテスト
  var z = cpx("-", [3,4]);       // 単独の例
  var x = cpx("abs", cpx("-", [3,4])); // 組合せの例
  alert("z = " + z + "  x = " + x);

式=

●重要な制約

命令の連結ができない
例えば cpx("-", [3,4]) で、[Math.abs(-3), 2*2] のように、関数内では通常の記述が有効ですが、
cpx("-", [3,4]) + cpx("i", [1,2]) のように複数の演算を記述することはできません。
 ・JavaScript では、配列を含む計算を1命令で表現する簡単な記述法がないこと
 ・そのため、+ では文字列連結になり、それ以外の演算子を用いると NaN になってしまいます。

計算誤差が発生する
命令のなかには、三角関数や自然対数を用いているため、有効桁数がかなり小さくなっています。
本来は内部で倍精度計算をすべきなのですが採用していません。
出力された数値の丸めを行うほうが適切な場合もあります。

複素平面

複素数のグラフ

z = cpx(op, a)

"-"               cpx("-", [3,4])    = [-3,-4]
"i"               cpx("i", [3,4])    = [-4, 3]
"-i"              cpx("-i", [3,4])   = [ 4,-3]
"/"               cpx("/", [3,4])    = [-0.428,0.571]   // 1/(3 + 4l) 逆数
"conj" "共役"     cpx("conj", [3,4]) = [ 3,-4]
"e"               cpx("e", [3,4])    = [-13.12,-15.20   // e3 + 4*i
op=""  a=( + i)  z=( + i) 

z = cpx(a, op, x)

"+"         cpx([3,4], "+", 2) = [5, 4]     // 虚数部はそのまま
"-"         cpx([3,4], "-", 2) = [1, 4]     // 虚数部はそのまま
"*"         cpx([3,4], "*", 2) = [6, 8]
"/"         cpx([3,4], "/", 2) = [1.5, 2]
"^", "**","pow"          dpx([3,4], "^", 3) = [-117,44]   // ai≠0 のときは,、x は整数のこと
"rθ", "rθn", "rθ°"   dox[[1.732, 1], "rθ°, 30) = [1, 1.732]
             原点を中心に反時計回りに角度θ回転
    rθ° 30    45    60    90    120   135   180   270   360    度分法
    rθ   0.524 0.785 1.047 1.571 2.094 3.927 3.142 4.713 6.283  ラジアン法
       rθn  1/12  1/8   1/6   1/4   1/3   5/8   1/2   3/4   1   2π=1に対する比率
a=( + i)  op=""  x= z=( + i) 

z = cpx(x, op, b)

"+"               dpx(2, "+", [3,4]) = [5,4]     // 虚数部はそのまま
"-"               dpx(2, "-", [3,4]) = [-1,4]    // 虚数部はそのまま
"*"               dpx(2, "*", [3,4]) = [6,8]
"/"               dpx(2, "/", [2,3]) = [-0.8, 1.2]
x= op=""  b=( + i)  z=( + i) 

z = cpx(a, op, b)

"+"               cpx([1,2], "+", [3,4]) = [4, 6]
"-"               cpx([1,2], "-", [3,4]) = [-2, -2]
"*"               cpx([1,2], "*", [3,4]) = [-5, 10]
"/"               cpx([1,2], "/", [3,4]) = [-1.57, -0.286]
"^", "**","pow"   cpx([1,2], "^", [3,4]) = [0.129, 0.034]
                                     無限多価関数になるので主解のみを表示 
a=( + i)  op=""  b=( + i)  z=( + i) 

x = cpx(op, a)

"||", "abs"        cpx("abs", [3,4])  = 5     (√(32+42))
"θ", "atan"       cpx("atan", [3,4]) = 1.333 (=4/3)
op=""  a=( + i)  x=

d = cpx(op, a)

"√", "sqrt"       cpx("√", [3,4]) = [ [2,1], [-2, 1] ]
op=""  a=( + i) 
d=( + i)
 ( + i)

d = cpx(x, op, b)

"√" "n√" "乗根"      cpx(3, "n√", [2,11]) = [ [2,1], [-1.87,1.23], [-0.13,-2.23] ]
(x > 8 のときも計算しますが、下の表では8組だけを表示します)
x= op=""  b=( + i) 
d=( + i)
 ( + i)
 ( + i)
 ( + i)
 ( + i)
 ( + i)
 ( + i)
 ( + i)

z = cpx(op, d)

"Σ", "sum"     cpx("Σ", [[1,2],[3,4],[5,6]])   = [9,12]
"Π", "prod"    cpx("prod", [[1,2],[3,4],[5,6]]) = [-85,20]
op="" 
d=( + i)
 ( + i)
 ( + i)
 ( + i)
 ( + i)
z=( + i)