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

スポンサーリンク

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

関連記事

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