スプレッドシートのIMPRODUCT関数|複素数の掛け算とエラー対処

スポンサーリンク

「スプレッドシートで (1+2i)×(3−i) を計算したいけど、手で展開するのは面倒…」。交流回路の課題やインピーダンスの検算をしていると、複素数の掛け算は避けて通れませんよね。

i² = −1 を使って展開すると、どうしても符号の取り違えが起きがち。IMPRODUCT関数を試したら #NUM! が出た、結果を足そうとしたら #VALUE! になった。そんなところで手が止まった人もいるはずです。

GoogleスプレッドシートのIMPRODUCT関数なら、複素数を渡すだけで積を1つのセルに返してくれます。この記事では構文から行ごとの積の出し方、交流回路での使い方、エラーの直し方までをまとめました。

スプレッドシートのIMPRODUCT関数とは?書き方(構文と引数)

IMPRODUCT関数は、複素数どうしの積(掛け算)を返すGoogleスプレッドシートの関数です。読み方は「アイエム・プロダクト」。imaginary(虚数)と product(積)を組み合わせた名前ですね。

エンジニアリング関数(工学系の計算で使う関数群)のひとつで、交流回路や制御の計算で出番があります。2つだけでなく、3つ以上の複素数もまとめて掛けられるのが特徴です。

構文と引数(因数は範囲・実数も渡せる)

=IMPRODUCT(因数1, [因数2, ...])
引数内容例
因数1掛ける複素数、またはその範囲(必須)“1+2i”、A2、A2:A10
因数2以降追加で掛ける複素数や範囲(省略可)“3-i”、3、B2:B10

因数には、文字列・セル参照・範囲・実数を混ぜて渡せます。次の式は、複素数と実数の3と純虚数の4iを掛けている例です。

=IMPRODUCT("1+2i", 3, "4i")

結果は -24+12i になります。(1+2i)×3 で 3+6i、そこに 4i を掛けて 12i+24i² = −24+12i という流れです。

計算のしくみと戻り値は文字列

中で行われているのは、次の展開です。

(a + bi)(c + di) = (ac − bd) + (ad + bc)i

i² = −1 なので、実部に「−bd」が入るのがポイント。手計算で符号を間違えやすいのも、まさにこの部分です。

IMPRODUCTの結果は「-10+10i」のような文字列で返ります。虚部が0になる積は「25」のように実部だけ、実部が0なら「2i」のように虚部だけが表示されます。

見た目が数字だけの「25」も、戻り値としては文字列です。結果を足し合わせるときの注意は、エラーの章でまとめて紹介しますね。

IMSUM・IMSUB・IMDIV・IMPOWERとの使い分け

複素数の四則演算とべき乗は、関数がそれぞれ分かれています。文字列の複素数は演算子の + や * では計算できないので、目的に合う関数を選びましょう。

計算関数書き方の例
足し算(和)IMSUM=IMSUM(“1+2i”, “3-i”)
引き算(差)IMSUB=IMSUB(“1+2i”, “3-i”)
掛け算(積)IMPRODUCT=IMPRODUCT(“1+2i”, “3-i”)
割り算(商)IMDIV=IMDIV(“1+2i”, “3-i”)
べき乗IMPOWER=IMPOWER(“1+2i”, 2)

IMSUMとIMPRODUCTは、3つ以上の引数や範囲を受け付けます。一方、IMSUBとIMDIVは2つの複素数どうしの計算です。

同じ数を何度も掛けるなら、IMPOWERで指数を指定するのが手軽でしょう。ただ、結果に小さな差が出る例もあります。

=IMPRODUCT("2+3i", "2+3i", "2+3i")   → -46+9i
=IMPOWER("2+3i", 3)                    → -46+9.00000000000001i

この例では、IMPRODUCTの方は -46+9i ちょうどでした。整数の累乗なら、IMPRODUCTで掛けた方が誤差が出にくい場合がある、くらいに覚えておくと安心です。IMPOWER側の誤差の消し方は、IMPOWER関数の記事で解説しています。

Excelとの違い

ExcelにもIMPRODUCT関数があり、同じ構文で使えます。ただ、この記事の計算結果やエラーの種類は、Googleスプレッドシートで実際に確かめたものです。Excelでは挙動が異なる場合があります。

Excelでの使い方を調べている人は、ExcelのIMPRODUCT関数の使い方を参考にしてください。

IMPRODUCT関数の基本の使い方

文字列で複素数を直接指定する

いちばんシンプルなのは、複素数を文字列のまま書く方法です。

=IMPRODUCT("1+2i", "3-i")

結果は 5+5i です。実部は 1×3 − 2×(−1) = 5、虚部は 1×(−1) + 2×3 = 5 と計算されています。

文字列はダブルクォーテーションで囲みましょう。虚部の係数が1なら、「3-i」のように1を省いて書けます。

セル参照で掛ける

実務では、セルに入った複素数を掛けることが多いはず。次のサンプル表で試してみましょう。

行A(複素数1)B(複素数2)C(積)
21+2i22+4i
33-i1+i4+2i
42i3+4i-8+6i

C2に次の式を入れ、フィルハンドルで下へコピーします。

=IMPRODUCT(A2, B2)

C3・C4にも、それぞれの行の積が並びます。2行目のように実数の2を掛けると、実部と虚部がどちらも2倍になるだけです。

3つ以上・範囲をまとめて掛ける

複数の複素数をまとめて掛けるなら、範囲をそのまま渡せます。サンプル表のA列3つを全部掛けると、次のとおりです。

=IMPRODUCT(A2:A4)

結果は -10+10i。(1+2i)×(3−i) で 5+5i、そこに 2i を掛けて −10+10i になります。

範囲と個別の値を混ぜて =IMPRODUCT("1+2i", "3+5i", A2:A50) のように書くこともできます。範囲の途中に空白セルがあっても、そのセルは無視されて計算が続く仕組みです。

たとえば A6 に 1+2i、A7 が空白、A8 に 3-i が入っているとしましょう。=IMPRODUCT(A6:A8) の結果は 5+5i で、空白が0として掛けられることはありません。

数値の入ったセルも、そのまま因数として使えます。A9 に数値の 2 が入っていれば、=IMPRODUCT(A6, A9) の結果は 2+4i。

COMPLEX関数で作った値を掛ける

実部と虚部が別々の列に入っているなら、COMPLEX関数で複素数にしてから渡します。

=IMPRODUCT(COMPLEX(3, 4), 2)

COMPLEX(3, 4) が 3+4i を作り、2を掛けて結果は 6+8i です。実部と虚部がA〜D列に分かれた表なら、=IMPRODUCT(COMPLEX(A2, B2), COMPLEX(C2, D2)) のように書けます。

電気の分野で虚数単位に j を使いたいときは、COMPLEXの第3引数に “j” を指定しましょう。COMPLEX(3, 4, "j") で 3+4j が作れます。

j で書いた複素数どうしを掛けると、結果も j で返ってきます。

=IMPRODUCT("10+5j", "2+8j")

結果は -20+90j です。ただし、i と j を1つの式に混ぜると #NUM! になるので注意してください。

複数行をまとめて計算する(行ごとの積・累積積)

IMPRODUCTは、範囲を「掛け合わせる数の集まり」として受け取ります。そのため、範囲の渡し方しだいで結果が大きく変わる点に注意が必要です。

全体の積・行ごとの積・累積積の書き分け表

前の章のサンプル表(A2:A4 と B2:B4)を使った場合の書き分けは、次のとおりです。

やりたいこと書き方サンプルでの結果
A列の全部を掛ける(1つ)=IMPRODUCT(A2:A4)-10+10i
A列とB列の全部を掛ける(1つ)=IMPRODUCT(A2:B4)-120-160i
行ごとの積(3つ)=MAP(A2:A4, B2:B4, LAMBDA(a, b, IMPRODUCT(a, b)))2+4i/4+2i/-8+6i
上からの累積積(3つ)=SCAN(“1”, A2:A4, LAMBDA(acc, x, IMPRODUCT(acc, x)))1+2i/5+5i/-10+10i

全体の積が欲しいだけなら、範囲を直接渡すのがいちばん簡単。MAPやSCANが必要になるのは、結果を行ごとに並べたいときだけですね。

行ごとの積はMAPで(ARRAYFORMULAでは行ごとにならない)

複数行をまとめて計算しようとして、次のように書く人は多いのではないでしょうか。

=ARRAYFORMULA(IMPRODUCT(A2:A4, B2:B4))

ところがこの式は、行ごとの積になりません。結果は式を入れたセルに -120-160i が1つ出るだけで、下のセルは空のままです。

-120-160i は、A2:A4 と B2:B4 の6セルすべてを掛けた総積。IMPRODUCTは、範囲の中身を全部掛け合わせる関数です。そのため、ARRAYFORMULAで包んでも行ごとには分かれません。

行ごとの積を1つの式で出すなら、MAP関数を使いましょう。

=MAP(A2:A4, B2:B4, LAMBDA(a, b, IMPRODUCT(a, b)))

MAPは、A列とB列から1行ずつ値を取り出してLAMBDAの a と b に渡します。各行で IMPRODUCT(a, b) を計算し、結果を下のセルへ順に展開する流れです。

結果は 2+4i/4+2i/-8+6i で、C列にフィルコピーした値と一致します。行が増えたら、範囲を A2:A100 のように広げるだけで対応できますよ。

累積積はSCANで列に出す

「1行目まで」「2行目まで」と、上から順に掛けた途中経過を並べたいこともあります。そんなときはSCAN関数の出番です。

=SCAN("1", A2:A4, LAMBDA(acc, x, IMPRODUCT(acc, x)))

第1引数の “1” は、掛け算のスタート地点です。acc にはそれまでの積が入り、新しい行の値 x を掛けて次の行へ引き継いでいきます。

結果は 1+2i/5+5i/-10+10i。最後の -10+10i は =IMPRODUCT(A2:A4) と同じ値なので、検算にも使えます。

制御の段接続のように、各段までの総合特性を順に確かめたい場面で便利です。

交流回路での活用例

交流回路の計算では、虚数単位に j を使うのが一般的です。IMPRODUCTは j で入力すれば結果も j で返すので、教科書の表記のまま計算できます。

先に1つ整理しておきましょう。直列につないだインピーダンスの合成は「和」なので、使うのはIMSUM関数です。積が出てくるのは、次のような場面になります。

オームの法則 V=Z×I

電圧は、インピーダンスと電流の積で求まります。インピーダンス Z = 10+5j Ω に電流 I = 2+8j A が流れるときの電圧は、次のとおりです。

=IMPRODUCT("10+5j", "2+8j")

結果は -20+90j V。実部は 10×2 − 5×8 = −20、虚部は 10×8 + 5×2 = 90 です。

電圧の大きさや位相を知りたいときは、結果をIMABS関数やIMARGUMENT関数に渡しましょう。

並列合成インピーダンス Z1Z2/(Z1+Z2)

2つのインピーダンスを並列につないだときの合成は、「積 ÷ 和」で求まります。分子をIMPRODUCT、分母をIMSUMで作り、IMDIV関数で割る形です。

=IMDIV(IMPRODUCT("2+2j", "2-2j"), IMSUM("2+2j", "2-2j"))

Z1 = 2+2j Ω と Z2 = 2−2j Ω の場合、積は 8、和は 4 です。合成インピーダンスは 8÷4 = 2 となり、セルには「2」と表示されます。

誘導性の Z1 と容量性の Z2 で虚部が打ち消し合い、純粋な抵抗 2Ω になるイメージですね。値をセルに入れているなら、=IMDIV(IMPRODUCT(B2, B3), IMSUM(B2, B3)) と書けます。

なお、この「積 ÷ 和」は2素子のときの式です。3つ以上を並列にするときは、そのままでは使えません。

複素電力 S=V×conj(I)

複素電力は、電圧と「電流の共役複素数」の積で求めます。共役を作るのはIMCONJUGATE関数の役目です。

電圧 V = 100 V(位相の基準)、電流 I = 3−4j A の例で計算してみましょう。

=IMPRODUCT("100", IMCONJUGATE("3-4j"))

結果は 300+400j です。実部の 300 が有効電力 P[W]、虚部の 400 が無効電力 Q[var] にあたります。

皮相電力 |S| は =IMABS(IMPRODUCT("100", IMCONJUGATE("3-4j"))) で 500 VA。力率は 300 ÷ 500 = 0.6 です。

有効電力・無効電力を個別に取り出すなら、IMREAL関数とIMAGINARY関数を使いましょう。

この記事では、電圧と電流を実効値で表し、S = V×(Iの共役) と定義しています。この定義だと、遅れ電流(誘導性)のとき Q がプラスになると覚えておきましょう。振幅(最大値)で表す場合は、S = ½V×(Iの共役) です。

共役との積で|z|²を検算

複素数に自分の共役を掛けると、絶対値の2乗 |z|² になります。大きさの2乗を確かめたいときの検算に使える性質です。

=IMPRODUCT("3+4i", IMCONJUGATE("3+4i"))   → 25
=IMABS("3+4i")^2                          → 25

どちらも 25 で一致しますね。ただし、上の結果は文字列の「25」、下はIMABSが返す数値の 25 です。値の型が違うので、2つを並べて比べるときは気をつけてください。

IMPRODUCT関数のエラーと対処

入力と結果の早見表

IMPRODUCTのエラーは、ほとんどが #NUM! です。入力の形と結果の対応を表にまとめました。

入力の例結果原因と対処
=IMPRODUCT(“1+1i”, “1+1j”)#NUM!i と j が混在。どちらかに揃える
=IMPRODUCT(“1+2i”, “3+I”)#NUM!大文字の I。小文字の i にする
=IMPRODUCT(“1+2i”, “3+i”)#NUM!全角の+。半角に直す
全角の空白を含む “3 + 4i”#NUM!全角の空白を削除する
i・j 以外の文字(”3+4k”)#NUM!虚数単位を i か j にする
=IMPRODUCT(“1+1i”, TRUE)#NUM!論理値は掛けられない
=IMPRODUCT(“1+1i”, NA())#N/A参照先のエラーがそのまま返る
=IMPRODUCT()#N/A因数を1つ以上指定する
=IMPRODUCT(“1 + 2i”, “3-i”)5+5i半角の空白はエラーにならない

半角の空白は無視されるので、見た目が正しいのに #NUM! が出るなら全角の文字を疑いましょう。コピーしてきたデータは、全角の+や空白が紛れ込んでいることがよくあります。

大文字の I・J は、LOWER関数で小文字にしてから渡しましょう。=IMPRODUCT(LOWER(A2), LOWER(B2)) で計算できます。

全角の空白は SUBSTITUTE(A2, " ", "") で取り除けます。

#N/A のときは、IMPRODUCT自体より参照先のセルを確認するのが近道です。

結果を+で足すと#VALUE!(足すならIMSUM)

IMPRODUCTの結果は文字列なので、そのまま + で計算すると #VALUE! になります。

=IMPRODUCT(A2:A4)+0   → #VALUE!

積どうしを足し合わせたいなら、IMSUMを使いましょう。サンプル表のC列(2+4i/4+2i/-8+6i)の合計は、次の式で求まります。

=IMSUM(C2:C4)

結果は -2+12i。実部は 2+4−8 = −2、虚部は 4+2+6 = 12 になります。

なお「25」のように数字だけの結果は、+ で数値として扱われることがあります。結果の形によって挙動が変わるので、複素数の足し算はIMSUMにそろえておくのが確実です。

IFERRORで表示を整える

入力途中の行でエラー表示を出したくないなら、IFERRORで包むのも手。

=IFERROR(IMPRODUCT(A2, B2), "入力を確認")

ただし、IFERRORはエラーの原因を隠してしまいます。まずは早見表で原因を直し、そのうえで表示を整える用途に使うのがおすすめです。

まとめ

スプレッドシートのIMPRODUCT関数は、複素数の掛け算を1つのセルで済ませられる関数です。押さえておきたいポイントを振り返りましょう。

  • 構文は =IMPRODUCT(因数1, [因数2, ...])。文字列・セル・範囲・実数を混ぜて渡せる
  • 戻り値は文字列。「25」や「2」のような結果も文字列で返る
  • 範囲を渡すと全部の積が1つ返る。空白セルは無視される
  • 行ごとの積はMAP、累積積はSCAN。ARRAYFORMULAで包んでも行ごとにはならない
  • j で入力すれば結果も j。i と j を混ぜると #NUM!
  • 並列合成は IMDIV(IMPRODUCT, IMSUM)、複素電力は IMPRODUCT(V, IMCONJUGATE(I))
  • 結果を足すなら + ではなくIMSUM

迷ったら、サンプル表の値で手計算と照らし合わせてみてください。積の展開に慣れると、交流回路の検算がぐっと楽になりますよ。

複素数の計算をさらに進めたい人は、次の記事もどうぞ。

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