スプレッドシートにBESSELJ関数はない|#NAME?になる理由と3つの代替方法

スポンサーリンク

「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関数の使い方をどうぞ。

関連記事

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