「GoogleスプレッドシートでBESSELJ関数を入力したら #NAME? エラーになった」。それ、数式のミスではありません。
先に結論をお伝えします。GoogleスプレッドシートにBESSELJ関数はありません。BESSELJは Excel 専用のエンジニアリング関数で、スプレッドシートには実装されていないんです。
この記事では、実際に検証した結果と、スプレッドシートユーザーが第1種ベッセル関数 J_n(x) を計算するための3つの代替方法を紹介します。
スプレッドシートでBESSELJは使えない(実機検証)
実際にGoogleスプレッドシートのセルに入力してみると、次のようになります。
=BESSELJ(1.5, 1) → #NAME? エラー
#NAME? は「そんな名前の関数は知らない」というエラーです。スペルミスでも設定の問題でもなく、Googleスプレッドシートの関数リストにBESSELJが存在しないことが原因です。BESSELY・BESSELI・BESSELKも同様に未実装で、すべて #NAME? になります。
ExcelにはBESSELJ・BESSELY・BESSELI・BESSELKの4関数が標準搭載されていますが、Googleスプレッドシートはエンジニアリング関数の一部しか実装しておらず、ベッセル関数系は対象外です。Web上には「スプレッドシートでBESSELJが使える」と書かれた解説も見かけますが、Excelの仕様と混同したものなので注意してください。
代替方法1: Excelで計算する(いちばん手軽)
BESSELJが必要なら、Excelを使うのが最も確実です。デスクトップ版だけでなく、無料のExcel On the web(Web版Excel)でもBESSELJは使えます。
=BESSELJ(1.5, 1) → 0.5579(Excelでの結果)
構文は =BESSELJ(x, n) で、xに評価する値、nに次数(0以上の整数)を指定します。引数の意味やエラー対処の詳細は、ExcelのBESSELJ関数の使い方で解説しています。
Excelで計算した場合の参考値を載せておきます。検算にお使いください。
| 数式 | 結果(概算) |
|---|---|
| =BESSELJ(1.5, 0) | 0.5118 |
| =BESSELJ(1.5, 1) | 0.5579 |
| =BESSELJ(1.5, 2) | 0.2321 |
| =BESSELJ(2, 0) | 0.2239 |
| =BESSELJ(2, 1) | 0.5767 |
代替方法2: GASカスタム関数を自作する
「どうしてもスプレッドシート内で完結させたい」場合は、Google Apps Script(GAS)でカスタム関数を作る方法があります。第1種ベッセル関数は級数展開で計算できるので、実装は比較的シンプルです。
スプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、次のコードを貼り付けて保存してください。
/**
* 第1種ベッセル関数 J_n(x) を級数展開で計算するカスタム関数
*
* @param {number} x 評価する値
* @param {number} n 次数(0以上の整数)
* @return {number} J_n(x) の値
* @customfunction
*/
function BESSELJ_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;
}
保存後、セルで次のように使えます。
=BESSELJ_GAS(1.5, 1) → 0.557937
この実装はJ_n(x)の級数定義をそのまま計算するもので、|x|が20程度までの実用範囲ではExcelのBESSELJと小数点以下6桁レベルで一致することを確認済みです。|x|が非常に大きい領域では桁落ちで精度が低下するため、その場合は方法1か方法3を使ってください。
NOTE
カスタム関数は初回実行時に少し時間がかかります。また、シートを共有した相手にもスクリプトごと共有されます。
代替方法3: 外部ツールで計算する
単発で値が知りたいだけなら、外部ツールを使うのも手です。
- Wolfram Alpha: 検索欄に「BesselJ(1, 1.5)」と入力するだけで値が得られます
- Python(SciPy):
scipy.special.jv(n, x)で高精度に計算できます
計算結果をスプレッドシートに貼り付ければ十分、というケースは意外と多いですよ。
そもそもBESSELJ(第1種ベッセル関数)とは
第1種ベッセル関数 J_n(x) は、円筒座標系の微分方程式を解くときに登場する特殊関数です。主に次のような場面で必要になります。
- 円形膜(太鼓の膜)の振動モード計算
- 電磁波の解析(円形導波管の固有モード、アンテナ設計)
- 音響解析(スピーカーの放射パターン)
- FM変調のスペクトル解析(変調指数βのn次側波帯の振幅がJ_n(β)になる)
J_n(x) は x の増加とともに振動しながら減衰していくのが特徴です。また、J_0(0) = 1、J_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スプレッドシートにBESSELJ関数はない。入力すると
#NAME?エラーになる(BESSELY/I/Kも同様) - いちばん手軽な代替はExcel(Web版でも使える)。
=BESSELJ(x, n)で計算できる - スプレッドシート内で完結させたいならGASカスタム関数を自作する(この記事のコードをコピペでOK)
- 単発の計算ならWolfram AlphaやPython(SciPy)でも十分
「スプレッドシートに関数がない」とわかるだけでも、原因調査の時間をかなり節約できます。Excelでの詳しい使い方はExcelのBESSELJ関数の使い方をどうぞ。

