スプレッドシートのIMPOWER関数|複素数のべき乗と誤差の消し方

スポンサーリンク

「スプレッドシートで複素数を2乗したら、2i のはずが 1.22464679914735E-16+2i と出てきた…」。交流回路や数学の課題で複素数を扱っていると、こんな見慣れない値に手が止まることがありますよね。

負の数の平方根を出そうとして、POWER関数でエラーになった人もいるかもしれません。1/3乗で立方根を求めたのに、思っていた答えと違う値が返ってくることもあります。

GoogleスプレッドシートのIMPOWER関数なら、複素数と指数を渡すだけでべき乗を1つのセルに返してくれます。この記事では、構文と結果の早見表から誤差の消し方・エラーの直し方までをまとめました。

スプレッドシートのIMPOWER関数とは?書き方(構文と引数)と結果の早見表

IMPOWER関数は、複素数の底を指数でべき乗した結果を文字列で返すGoogleスプレッドシートの関数です。読み方は「アイエム・パワー」。imaginary(虚数)と power(べき乗)を組み合わせた名前ですね。

エンジニアリング関数(工学系の計算で使う関数群)のひとつです。2乗・3乗だけでなく、平方根や逆数も1つの式で求められます。

IMPOWER関数の構文と引数

=IMPOWER(複素数の底, 指数)

引数は2つで、どちらも省略できません。

引数内容例
複素数の底べき乗される複素数。「a+bi」または「a+bj」の形“3+4i”、A2、COMPLEX(3,4)
指数底を何乗するかを表す数値。小数・負の数も指定できる2、0.5、-1、1/3

虚数単位は小文字の i と j のどちらでも書けます。数学では i、電気・電子の分野では j を使うのが一般的です。

Googleの公式ヘルプでは、複素数のべき乗は極形式で定義されると説明されています。大きさ(絶対値)r と角度(偏角)θ を使うと、次の式になります。

(a+bi)^n = r^n × (cos(nθ) + i sin(nθ))
r = √(a² + b²)、θ = 複素数の偏角

「大きさは n 乗、角度は n 倍」と覚えておけば十分でしょう。この角度を使った計算が、後で紹介する「E-16」の誤差の原因にもなっています。

よく使う指数の結果早見表(2乗・3乗・平方根・立方根・逆数・0乗)

底を 3+4i にして、よく使う指数の結果を並べました。

目的数式結果
2乗=IMPOWER(“3+4i”, 2)-7+24i
3乗=IMPOWER(“3+4i”, 3)-117+44i
平方根(0.5乗)=IMPOWER(“3+4i”, 0.5)2+i
立方根(1/3乗)=IMPOWER(“3+4i”, 1/3)約 1.6289+0.5202i
逆数(-1乗)=IMPOWER(“3+4i”, -1)0.12-0.16i
0乗=IMPOWER(“3+4i”, 0)1

この6式は、実際のセルでも右の列と同じ表示になります(立方根は 1.62893714592218+0.520174502304546i のように小数15桁ほどで表示)。虚部が 1 のときは「2+i」のように係数の 1 が省略されます。

一方、1+1i の2乗のように角度がちょうど π/2 になる計算では、整数になるはずの部分に小さな誤差が付くことがあります。詳しくは後の章で解説します。

平方根と立方根は、いくつかある解のうち1つ(主値)だけが返る点も覚えておきたいところ。

IMPOWER関数の基本の使い方

ここからは、指数の種類ごとに書き方と結果を確認していきます。サンプルの値は、手計算でも追える簡単なものを選びました。

2乗・3乗を求める

指数に整数を渡すと、その回数だけ掛け合わせた値が返ります。

=IMPOWER("2+3i", 2)    → -5+12i
=IMPOWER("1+2i", 3)    → -11-2i
=IMPOWER("5+2i", 3)    → 65+142i

1行目を手計算すると、(2+3i)² = 4+12i+9i² = -5+12i です。3行目は公式ヘルプに載っている例で、結果は 65+142i と紹介されています。

この3つは実機でも誤差なしで表示されます。ただし、結果が純虚数や実数になる計算(たとえば 1+1i の2乗)では小さな端数が付くことがあります。端数の消し方は次の章で紹介するので、まずは書き方だけ押さえておきましょう。

0.5乗・1/3乗で平方根・立方根を求める(返るのは解の1つだけ)

指数を 0.5 にすると平方根、1/3 にすると立方根になります。

=IMPOWER("3+4i", 0.5)   → 2+i
=IMPOWER("8", 1/3)      → 2
=IMPOWER("-8", 1/3)     → 約 1+1.73205080756888i

注意したいのは、0 以外の複素数には立方根が3つあるのに、返るのは1つだけという点です。たとえば 8 の立方根は 2 と -1±1.732i の3つ。IMPOWERが返すのは「主値」と呼ばれる 2 です。

-8 の結果は、もっと意外に感じるかもしれません。実数の答え -2 ではなく、主値の 1+1.732…i が返ります。

主値とは、偏角を -π より大きく π 以下の範囲で取って計算した値のことです。残り2つの解は、主値の角度に 2π/3 ずつ足すと求められます。角度の確認には、IMARGUMENT関数を使ってみてください。

平方根だけが目的なら、IMSQRT関数でも同じ主値が得られます。=IMSQRT(“3+4i”) と =IMPOWER(“3+4i”, 0.5) は、数学的には同じ値で、実機でもどちらも 2+i と表示されます。

負の指数で逆数を求める

指数に -1 を渡すと、複素数の逆数になります。

=IMPOWER("3+4i", -1)    → 0.12-0.16i
=IMPOWER("-1-j", -1)    → -0.5+0.5j

1/(3+4i) は (3-4i)/25 なので、手計算どおりの値ですね。2行目は公式ヘルプの例で、j で書いた底の結果も -0.5+0.5j と j で示されています。

指数 -2 なら 1/z²、-0.5 なら 1/√z という具合に、負の指数は「逆数の○乗」として使えます。割り算の関数を使わずに済むので、式が短くなるのがうれしいところ。

セル参照とCOMPLEX関数で複素数を渡す

実務では、セルに入った複素数を使うことが多いはずです。次のような表なら、C2 に式を入れて C5 までコピーします。

行A(底)B(指数)C(結果)
22+3i2-5+12i
31+2i3-11-2i
43+4i-10.12-0.16i
5-40.51.22464679914735E-16+2i
=IMPOWER(A2, B2)

実機でも C2〜C4 は表のとおりに表示されます。C5 だけは、数学上は 2i のところ、実部に E-16 の誤差が付いて表のように表示されます。

実部と虚部が別の列に分かれているなら、COMPLEX関数で複素数を組み立ててから渡しましょう。

=IMPOWER(COMPLEX(2, 3), 2)         → -5+12i
=IMPOWER(COMPLEX(10, 20, "j"), 2)  → -300+400j

COMPLEX の第3引数に “j” を指定すると、j の複素数を作れます。電気系のシートで表記を j にそろえたいときに便利ですね。j の底を渡すと、結果も j で返ります。

ARRAYFORMULAで列をまとめて計算する

A2:A5 に 1+1i、2+3i、3+4i、1+2i が並んでいるとします。ARRAYFORMULA と組み合わせれば、1つの式で4行分の2乗を出せます。

=ARRAYFORMULA(IMPOWER(A2:A5, 2))

結果は上から 1.22464679914735E-16+2i、-5+12i、-7+24i、-3+4i の順に展開されます。1行目の 1+1i は、数学上は 2i ですが、次の章で扱う誤差が付いて表示されます。

途中に空白行がある範囲なら、IF で空白を飛ばしておくと安心です。

=ARRAYFORMULA(IF(A2:A10="", "", IMPOWER(A2:A10, 2)))

結果に「E-16」が出るのはなぜ?微小誤差の消し方

IMPOWERを使っていて一番戸惑うのが、この「E-16」ではないでしょうか。

整数乗でも誤差が出る理由

=IMPOWER(“1+1i”, 2) の答えは、数学的には 2i です。ところがセルには、1.22464679914735E-16+2i のような値が表示されます。

E-16 は「×10のマイナス16乗」を表す指数表記。つまり実部は 0.000000000000000122… という、ほぼ 0 の値です。

原因は、角度を使う極形式で計算していることにあると考えられます。1+1i の角度は π/4 なので、2乗すると角度は π/2 になります。cos(π/2) は本来 0 のはず。

ところがコンピューターの小数(倍精度浮動小数点数)では、π を正確に表せません。そのため cos(π/2) が約 6.12×10⁻¹⁷ になり、大きさの 2 を掛けた約 1.22×10⁻¹⁶ が実部に残ります。

この誤差は計算の仕組みから出るもので、数式の間違いではありません。純虚数や実数になるはずの結果(角度が π/2 や π)で目にしやすいでしょう。

ROUNDとCOMPLEXで誤差を消す数式

実部と虚部を取り出して丸め、もう一度複素数に組み立て直すのが基本です。B2 に IMPOWER の結果がある場合は、次の式を使います。

=COMPLEX(ROUND(IMREAL(B2), 10), ROUND(IMAGINARY(B2), 10))

IMREAL関数で実部を、IMAGINARY関数で虚部を取り出します。それぞれを ROUND で小数点以下10桁に丸め、COMPLEX で「a+bi」の形に戻す流れです。

B2 が 1.22464679914735E-16+2i なら実部は 0、虚部は 2 に丸まり、2i に戻る計算ですね。実機でも IMREAL・IMAGINARY は E 表記入りの文字列を読め、結果は 2i になります。

1つのセルで済ませたいなら、IMPOWER をそのまま入れ子にします。

=COMPLEX(ROUND(IMREAL(IMPOWER(A2, 2)), 10), ROUND(IMAGINARY(IMPOWER(A2, 2)), 10))

j で返したいときは、COMPLEX の第3引数に “j” を足してください。丸める桁は10桁が目安です。結果の値が大きいほど誤差も大きくなるので、桁数を少し減らすと確実でしょう。

IMPRODUCTで掛け合わせた場合との比較

整数乗なら、IMPRODUCT関数で同じ複素数を掛け合わせる方法もあります。

=IMPOWER("1+1i", 2)                  → 2i(誤差が付くことがある)
=IMPRODUCT("1+1i", "1+1i")           → 2i
=IMPRODUCT("1+1i", "1+1i", "1+1i")   → -2+2i

IMPRODUCT の掛け算は、実部と虚部の足し引きだけで済む計算です。角度を経由しないので、実機でも誤差のない 2i が返ります。

方法整数乗小数・負の指数式の長さ
IMPOWER○(誤差が付くことがある)○指数が大きくても短い
IMPRODUCT○×(掛け算のみ)指数の数だけ引数が増える
IMPOWER+ROUND/COMPLEX○(誤差を消せる)○長くなる

2〜3乗で誤差が気になるなら IMPRODUCT、それ以外は IMPOWER+丸め。この使い分けが現実的です。

表示形式では消えない理由(戻り値は文字列)

E-16 を消そうとして、表示形式で小数点以下の桁数を減らした人もいるかもしれません。ところが IMPOWER の戻り値は、数値ではなく文字列です。

表示形式は文字列には効かないため、見た目は変わりません。誤差を消すには、前の数式のように中身の値そのものを丸める必要があります。

0 かどうかを判定したいだけなら、しきい値で比べる方法も使えます。=ABS(IMREAL(B2))<1E-10 なら、実部がほぼ 0 のときに TRUE が返る仕組みです。

IMPOWER関数の実務での使い方

基本がわかったところで、実務や課題で役立つ使い方を3つ紹介します。どれも POWER関数や手計算では手間がかかる場面ばかり。

負の数の平方根・累乗根を求める(POWER関数との比較)

実数のべき乗を計算するPOWER関数は、負の数の小数乗を苦手とします。負の数の平方根は、実数の範囲に存在しないためです。

数式結果ポイント
=POWER(-4, 0.5)#NUM!実数の平方根は存在しない
=IMPOWER(“-4”, 0.5)1.22464679914735E-16+2i複素数として計算できる(実部は E-16 の誤差)
=POWER(-8, 3)-512整数乗なら POWER で問題ない
=IMPOWER(“-8”, 1/3)約 1+1.732i主値なので -2 にはならない

二次方程式の判別式が負になったときなど、虚数の答えが欲しい場面では IMPOWER を使いましょう。IMPOWER(“-4”, 0.5) の実部には、前の章の E-16 が付きます。きれいな 2i にしたいときは、前の章の ROUND+COMPLEX を使ってください。

逆に「-8 の立方根として -2 が欲しい」なら、IMPOWERではなく実数の式で求めます。

=SIGN(A2) * POWER(ABS(A2), 1/3)    → A2 が -8 なら -2

符号を外して立方根を求め、最後に符号を戻す書き方です。3乗根や5乗根のような奇数乗根で使えます。

ド・モアブルの定理で結果を検算する(IMABS・IMARGUMENT)

複素数を n 乗すると、大きさは n 乗、角度は n 倍になります。これがド・モアブルの定理ですね。IMABS関数とIMARGUMENT関数を使えば、IMPOWERの結果をシート上で検算できます。

A2 に 2+3i、B2 に指数 2 が入っているとします。

セル数式結果(約)意味
C2=IMABS(A2)^B213元の大きさの n 乗
D2=IMABS(IMPOWER(A2, B2))13結果の大きさ
E2=IMARGUMENT(A2)*B21.9656元の角度の n 倍
F2=IMARGUMENT(IMPOWER(A2, B2))1.9656結果の角度

C2 と D2、E2 と F2 がそれぞれ一致すれば計算どおりです。誤差を考えて、一致の判定はしきい値で行いましょう。

=AND(ABS(D2-C2)<1E-9, ABS(F2-E2)<1E-9)    → TRUE

1つ注意したいのは、角度が -π〜π の範囲に折り返される点です。2+3i を4乗すると、角度は 0.9828×4 ≈ 3.931 で π を超えます。

このとき IMARGUMENT は 3.931-2π ≈ -2.352 を返します。E列とF列の差がちょうど 2π なら、計算は正常です。

インピーダンスの逆数(アドミタンス)を求める

交流回路では、インピーダンス Z の逆数 1/Z をアドミタンスと呼びます。並列回路の合成は、アドミタンスを足してから逆数に戻すのが定番。指数 -1 の IMPOWER がそのまま使えます。

セル内容入力・数式結果
A2Z1(抵抗3Ω+コイル4Ω)3+4j―
A3Z2(抵抗3Ω+コンデンサ4Ω)3-4j―
B2Y1 = 1/Z1=IMPOWER(A2, -1)0.12-0.16j
B3Y2 = 1/Z2=IMPOWER(A3, -1)0.12+0.16j
B4合成インピーダンス=IMPOWER(IMSUM(B2, B3), -1)4.16666666666667

アドミタンスの合計は 0.24 で、その逆数の約 4.1667Ω が合成インピーダンスです。コイルとコンデンサの虚部が打ち消し合い、抵抗だけ(実数)になる例ですね。実機でも B2・B3 は j のまま返り、B4 に虚部は残りません。

IMPOWER関数のエラーと注意点(#NUM!・#VALUE!・#N/A)

IMPOWERのエラーは、原因ごとに種類が決まっています。まずは全体像を表で確認しましょう。

エラー主な原因例
#NUM!底の書き方の誤り“1+1I”、”1+1i”
#VALUE!指数が数値に変換できない指数に “a”
#N/A引数が #N/A・引数の数の誤り=IMPOWER(“1+1i”)

#NUM!:複素数の書き方の誤り

底が複素数として読めないと #NUM! になります。

=IMPOWER("1+1I", 2)       → #NUM!(大文字の I)
=IMPOWER("1+1k", 2)       → #NUM!(i・j 以外の文字)
=IMPOWER("1+1i", 2)     → #NUM!(全角の数字)
=IMPOWER("3 + 4i", 2)   → #NUM!(全角の空白)
=IMPOWER("1 + 1i", 2)     → "1+1i" と同じ結果(半角の空白は問題なし)

半角の空白は無視されますが、全角の空白はエラーの原因になります。他のファイルから貼り付けた複素数は、全角が混じっていないか確かめてください。

底が 0 のときも注意が必要です。0 の負の数乗は 0 で割る計算になり、0 の 0 乗は定義が分かれます。実機では、IMPOWER(“0”, -1) も IMPOWER(“0”, 0) も #NUM! になります。

底のセルが空白のときはエラーにならず、0 として扱われて結果が 0 になります。気づきにくいので、IF で空白を除外しておくと安全です。

#VALUE!:指数に数値以外を渡した

指数に数値に変換できない文字列を渡すと、#VALUE! になります。

=IMPOWER("1+1i", "a")     → #VALUE!
=IMPOWER("1+1i", "2")     → 2乗として計算される
=IMPOWER("1+1i", TRUE)    → 1+i(TRUE は 1 として計算)

“2” のような数字だけの文字列は、数値に読み替えられて計算されます。論理値の TRUE も 1 扱い。ほかのIM系関数では論理値が #NUM! になるので、IMPOWERの指数は例外といえます。

#N/A:エラー値・引数の数の誤り

参照先のセルが #N/A のときは、結果も #N/A がそのまま返ります。=IMPOWER(“1+1i”) のように指数を書き忘れたときも #N/A です(引数を3つ書いた場合も #N/A)。

IFERROR で包めばエラー表示は消せますが、原因まで隠れてしまいます。先に原因を切り分けてから使いましょう。

戻り値は文字列なので四則演算はIM系関数で

IMPOWERの戻り値は文字列なので、そのまま + で足すと #VALUE! になります。

=IMPOWER("1+1i", 3) + 1            → #VALUE!
=IMSUM(IMPOWER("1+1i", 3), 1)      → -1+2i
=IMREAL(IMPOWER("1+1i", 3)) + 1    → -1

複素数のまま計算を続けるなら IMSUM、実部だけを数値で使うなら IMREAL で取り出しましょう。

Excelとの違いと関連関数

Excelにも同じ名前のIMPOWER関数があり、底と指数の2つを渡す書き方は共通です。ただし、誤差の出方や表示の細部が同じとは限りません。ファイルをやり取りするときは、結果を一度確かめておくと安心です。

Excelでの使い方はExcelのIMPOWER関数の解説にまとめています。

IMPOWERと一緒に使うことが多い関数は次のとおりです。

関数できること
COMPLEX実部と虚部から複素数を作る
IMREAL / IMAGINARY実部・虚部を取り出す
IMABS / IMARGUMENT大きさ・角度を求める
IMPRODUCT複素数どうしを掛ける
IMSQRT平方根を求める
IMEXP / IMLN指数関数・自然対数を求める
POWER実数のべき乗を求める

IMPOWERの指数に渡せるのは実数だけ。指数にも複素数を使いたいときは、z^w = e^(w×ln z) の関係を使い、IMEXP と IMLN を組み合わせます。

=IMEXP(IMPRODUCT(B2, IMLN(A2)))    → A2 の B2 乗(A2・B2 とも複素数)

まとめ:スプレッドシートのIMPOWER関数のポイント

GoogleスプレッドシートのIMPOWER関数は、複素数のべき乗を1つの式で求められる関数です。最後にポイントを整理しておきます。

  • 構文は =IMPOWER(複素数の底, 指数) で、戻り値は文字列
  • 指数は 2・3 の整数のほか、0.5(平方根)・1/3(立方根)・-1(逆数)も使える
  • 分数乗で返るのは解のうち1つ(主値)だけ。-8 の立方根は -2 にならない
  • 整数乗でも E-16 のような微小な誤差が付くことがある
  • 誤差は COMPLEX(ROUND(IMREAL(x),10), ROUND(IMAGINARY(x),10)) で消せる
  • 表示形式では誤差は消えない(戻り値が文字列のため)
  • POWER では計算できない負の数の平方根も求められる
  • 大文字の I・全角文字・全角空白は #NUM!、指数の “a” は #VALUE!
  • 計算を続けるときは IMSUM や IMREAL など、IM系関数で受け取る

E-16 の誤差さえ押さえておけば、IMPOWERは頼れる道具になります。まずは早見表の式をシートに貼って、結果を手元で確かめてみてください。

タイトルとURLをコピーしました