「GoogleスプレッドシートでBESSELK関数を入力したら #NAME? エラーになった」。それ、数式のミスではありません。
先に結論をお伝えします。GoogleスプレッドシートにBESSELK関数はありません。BESSELKは Excel 専用のエンジニアリング関数で、スプレッドシートには実装されていないんです。
この記事では、実際に検証した結果と、スプレッドシートユーザーが第2種変形ベッセル関数 K_n(x) を計算するための代替方法を紹介します。
スプレッドシートでBESSELKは使えない(実機検証)
実際にGoogleスプレッドシートのセルに入力してみると、次のようになります。
=BESSELK(1, 0) → #NAME? エラー
#NAME? は「そんな名前の関数は知らない」というエラーです。スペルミスでも設定の問題でもなく、Googleスプレッドシートの関数リストにBESSELKが存在しないことが原因です。BESSELJ・BESSELY・BESSELIも同様に未実装で、すべて #NAME? になります。
ExcelにはBESSELJ・BESSELY・BESSELI・BESSELKの4関数が標準搭載されていますが、Googleスプレッドシートはエンジニアリング関数の一部しか実装しておらず、ベッセル関数系は対象外です。Web上には「スプレッドシートでBESSELKが使える」と書かれた解説も見かけますが、Excelの仕様と混同したものなので注意してください。
代替方法1: Excelで計算する(いちばん手軽)
BESSELKが必要なら、Excelを使うのが最も確実です。デスクトップ版だけでなく、無料のExcel On the web(Web版Excel)でもBESSELKは使えます。
=BESSELK(1, 0) → 0.4210(Excelでの結果)
構文は =BESSELK(x, n) で、xに評価する値(正の数)、nに次数(0以上の整数)を指定します。引数の意味やエラー対処の詳細は、ExcelのBESSELK関数の使い方で解説しています。
Excelで計算した場合の参考値を載せておきます。検算にお使いください。
| 数式 | 結果(概算) |
|---|---|
| =BESSELK(1, 0) | 0.4210 |
| =BESSELK(1, 1) | 0.6019 |
| =BESSELK(2, 0) | 0.1139 |
| =BESSELK(2, 1) | 0.1399 |
Excelで使うときのエラー対処
Excel側で発生しやすいエラーもまとめておきます。
- #NUM! エラー: x に 0 以下を指定した場合に発生します。K_n(x) は x→0 で無限大に発散するため、x は正の数で指定してください。次数 n に負の値を指定した場合も同様です
- #VALUE! エラー: 引数に文字列を渡した場合に発生します。セル参照の場合は参照先が数値か確認してください
- 次数 n に小数を指定すると、小数点以下が切り捨てられて整数として計算されます
代替方法2: 外部ツールで計算する
単発で値が知りたいだけなら、外部ツールを使うのが手軽です。
- Wolfram Alpha: 検索欄に「BesselK(0, 1)」と入力するだけで値が得られます
- Python(SciPy):
scipy.special.kv(n, x)で高精度に計算できます
計算結果をスプレッドシートに貼り付ければ十分、というケースは意外と多いですよ。
代替方法3: GASカスタム関数(ただしK_nは自作向きではない)
Google Apps Script(GAS)でカスタム関数を自作する方法もあります。ただし、第2種変形ベッセル関数 K_n(x) は級数展開に対数項やディガンマ関数が含まれており、単純な級数では書けません。精度を保った自作はかなり大変なので、K_n(x) に関しては方法1か方法2をおすすめします。
級数が単純な第1種ベッセル関数 J_n(x) と第1種変形ベッセル関数 I_n(x) は自作しやすく、コピペで使えるGASコードをBESSELJの記事とBESSELIの記事に載せています。
そもそもBESSELK(第2種変形ベッセル関数)とは
第2種変形ベッセル関数 K_n(x) は、円筒座標系の熱伝導・拡散の微分方程式を解くときに登場する特殊関数です。主に次のような場面で必要になります。
- 円柱外側の温度分布の計算(熱伝導)
- 電磁場の減衰解析(シールド・表皮効果)
- 光ファイバーのクラッド領域のモード解析
- 拡散現象の遠方場の解析
第1種変形ベッセル関数 I_n(x) が指数関数的に増大するのに対し、K_n(x) は単調に減少(指数関数的に減衰)するのが特徴です。また、x→0 で無限大に発散するため、原点を含まない領域(円柱の外側など)の解として使われます。
Excelの4つのベッセル関数の使い分け
Excelに搭載されている4関数の違いも整理しておきます(いずれもスプレッドシートでは未実装です)。
| 関数名 | 正式名称 | 数学記号 | 特性 | 主な用途 |
|---|---|---|---|---|
| BESSELJ | 第1種ベッセル関数 | J_n(x) | 振動的・原点で有限 | 振動・波動の正則解 |
| BESSELY | 第2種ベッセル関数 | Y_n(x) | x→0 で発散・振動的 | 振動・波動の特異解 |
| BESSELI | 第1種変形ベッセル関数 | I_n(x) | 単調増加(指数発散) | 熱伝導・拡散の正則解 |
| BESSELK | 第2種変形ベッセル関数 | K_n(x) | 単調減少(指数減衰) | 熱伝導・拡散の特異解 |
振動・波動現象ならJ/Y、熱伝導・拡散現象ならI/K、原点で有限の解が欲しければJ/I、という使い分けです。
まとめ
ポイントを振り返っておきましょう。
- GoogleスプレッドシートにBESSELK関数はない。入力すると
#NAME?エラーになる(BESSELJ/Y/Iも同様) - いちばん手軽な代替はExcel(Web版でも使える)。
=BESSELK(x, n)で計算できる - 単発の計算ならWolfram AlphaやPython(SciPy)が便利
- K_n(x) はGASカスタム関数の自作には向かない(級数が複雑)。J_n(x)・I_n(x)なら自作コードあり
「スプレッドシートに関数がない」とわかるだけでも、原因調査の時間をかなり節約できます。Excelでの詳しい使い方はExcelのBESSELK関数の使い方をどうぞ。
