「GoogleスプレッドシートでBESSELI関数を入力したら #NAME? エラーになった」。それ、数式のミスではありません。
先に結論をお伝えします。GoogleスプレッドシートにBESSELI関数はありません。BESSELIは Excel 専用のエンジニアリング関数で、スプレッドシートには実装されていないんです。
この記事では、実際に検証した結果と、スプレッドシートユーザーが第1種変形ベッセル関数 I_n(x) を計算するための3つの代替方法を紹介します。
スプレッドシートでBESSELIは使えない(実機検証)
実際にGoogleスプレッドシートのセルに入力してみると、次のようになります。
=BESSELI(1, 0) → #NAME? エラー
#NAME? は「そんな名前の関数は知らない」というエラーです。スペルミスでも設定の問題でもなく、Googleスプレッドシートの関数リストにBESSELIが存在しないことが原因です。BESSELJ・BESSELY・BESSELKも同様に未実装で、すべて #NAME? になります。
ExcelにはBESSELJ・BESSELY・BESSELI・BESSELKの4関数が標準搭載されていますが、Googleスプレッドシートはエンジニアリング関数の一部しか実装しておらず、ベッセル関数系は対象外です。Web上には「スプレッドシートでBESSELIが使える」と書かれた解説も見かけますが、Excelの仕様と混同したものなので注意してください。
代替方法1: Excelで計算する(いちばん手軽)
BESSELIが必要なら、Excelを使うのが最も確実です。デスクトップ版だけでなく、無料のExcel On the web(Web版Excel)でもBESSELIは使えます。
=BESSELI(1, 0) → 1.2661(Excelでの結果)
構文は =BESSELI(x, n) で、xに評価する値、nに次数(0以上の整数)を指定します。引数の意味やエラー対処の詳細は、ExcelのBESSELI関数の使い方で解説しています。
Excelで計算した場合の参考値を載せておきます。検算にお使いください。
| 数式 | 結果(概算) |
|---|---|
| =BESSELI(1, 0) | 1.2661 |
| =BESSELI(1, 1) | 0.5652 |
| =BESSELI(2, 0) | 2.2796 |
| =BESSELI(2, 1) | 1.5906 |
代替方法2: GASカスタム関数を自作する
「どうしてもスプレッドシート内で完結させたい」場合は、Google Apps Script(GAS)でカスタム関数を作る方法があります。第1種変形ベッセル関数は級数展開で計算でき、すべての項が正なので桁落ちも起こりにくく、自作に向いている関数です。
スプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、次のコードを貼り付けて保存してください。
/**
* 第1種変形ベッセル関数 I_n(x) を級数展開で計算するカスタム関数
*
* @param {number} x 評価する値
* @param {number} n 次数(0以上の整数)
* @return {number} I_n(x) の値
* @customfunction
*/
function BESSELI_GAS(x, n) {
n = Math.floor(n);
if (n < 0) throw new Error("次数nは0以上の整数を指定してください");
var term = Math.pow(x / 2, n);
for (var i = 1; i <= n; i++) {
term /= i; // (x/2)^n / n!
}
var sum = 0;
for (var k = 0; k < 200; k++) {
sum += term;
term *= (x * x / 4) / ((k + 1) * (k + n + 1));
if (Math.abs(term) < 1e-15) break;
}
return sum;
}
保存後、セルで次のように使えます。
=BESSELI_GAS(2, 1) → 1.590637
この実装はI_n(x)の級数定義をそのまま計算するもので、実用範囲ではExcelのBESSELIと小数点以下6桁レベルで一致することを確認済みです。I_n(x)はxが大きくなると指数関数的に増大するため、極端に大きいxでは方法1か方法3を使ってください。
NOTE
カスタム関数は初回実行時に少し時間がかかります。また、シートを共有した相手にもスクリプトごと共有されます。
代替方法3: 外部ツールで計算する
単発で値が知りたいだけなら、外部ツールを使うのも手です。
- Wolfram Alpha: 検索欄に「BesselI(0, 1)」と入力するだけで値が得られます
- Python(SciPy):
scipy.special.iv(n, x)で高精度に計算できます
計算結果をスプレッドシートに貼り付ければ十分、というケースは意外と多いですよ。
そもそもBESSELI(第1種変形ベッセル関数)とは
第1種変形ベッセル関数 I_n(x) は、円筒座標系の熱伝導・拡散の微分方程式を解くときに登場する特殊関数です。主に次のような場面で必要になります。
- 円柱の定常温度分布の計算(熱伝導)
- 拡散方程式の解析
- 信号処理のカイザー窓関数の計算(I_0(x) を使う)
- 統計学(フォン・ミーゼス分布の正規化定数など)
通常のベッセル関数 J_n(x) が振動しながら減衰するのに対し、I_n(x) は単調に増加(指数関数的に発散)するのが特徴です。また、I_0(0) = 1、I_n(0) = 0(n ≥ 1)という性質があり、原点で有限の値を持つため「正則解」として使われます。
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スプレッドシートにBESSELI関数はない。入力すると
#NAME?エラーになる(BESSELJ/Y/Kも同様) - いちばん手軽な代替はExcel(Web版でも使える)。
=BESSELI(x, n)で計算できる - スプレッドシート内で完結させたいならGASカスタム関数を自作する(この記事のコードをコピペでOK)
- 単発の計算ならWolfram AlphaやPython(SciPy)でも十分
「スプレッドシートに関数がない」とわかるだけでも、原因調査の時間をかなり節約できます。Excelでの詳しい使い方はExcelのBESSELI関数の使い方をどうぞ。
