SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

データサイエンス基礎を高校数学から復習

三角関数で傾向(周期)をイメージとして捉えてみよう

データサイエンス基礎を高校数学から復習しよう 第4回

太陽と月の影響から海水の高さを予測する(2)

波形のデータを作成する

 月の影響をシミュレーションするためには、時間の経過に沿って引力の変化を計算し、グラフ用のデータセットを作成する必要があります。その具体的な実装が以下のリストです。

[リスト1]円内に線を描くサンプル(js/sample/SinWaveController.jsの抜粋)
// (1) 描画用のデータを作成する
renderMoonWave(group,scale,start,end){
    const dataset = [];
    // (2) 12.4時間で1周(2PIラジアン)となる角速度を算出
    const moonAngularVelocity = (2 * Math.PI) / 12.4;

    // 太陽に比べて2.2倍の力(振幅)に設定
    const amplitude = 2.2;

    for(let t = start ; t < end; t++) {
        for(let i = 0 ; i < 60; i++) {
            // (3) 1分ごとの計算結果をデータセットに格納
            dataset.push({
                x: t + (i / 60),
                // 時間 t に対する月の引力の強さを算出
                y: amplitude * Math.sin(moonAngularVelocity * ( t + (i / 60))),
            });
        }
    }
    // (省略)
}

 コードのポイントは以下のとおりです。

(1)期間の指定

 引数のstartは開始時刻(例:0時)、endは終了時刻(例:24時間後)を指し、シミュレーションする範囲を決定します。

(2)プログラム特有の単位「ラジアン」

 プログラムで三角関数を扱う際は、度数(0~360度)ではなく「弧度法(ラジアン)」を用います。12.4時間で一周(2π)するように「角速度」を定義することで、月の正確なリズムを再現しています。

(3)滑らかなグラフを作る工夫

 時間tを入力として、その瞬間の影響度yを算出します。この際、グラフがカクつかないよう、内部で1分刻みの細かなデータを生成しているのが、実務的な工夫のひとつです。

 このロジックを応用し、太陽のデータや、それらを足し合わせた「合成波」のデータを用意することで、複雑な潮位の変動を予測できるようになります。

それぞれの波を合成してみる

 作成した「太陽の波」と「月の波」、そしてその2つを単純に足し合わせた「合成波」を、まずは1日分(24時間)の長さで並べてみます(図3)。

図3:1日の周期グラフ(オレンジ:太陽、青:月、赤:合成)
図3:1日の周期グラフ(オレンジ:太陽、青:月、赤:合成)

 この時点では、太陽と月はほとんど同じリズムを刻んでいるように見えます。しかし、視点を広げて30日間という長期スパンで表示させると、景色が一変します(図4)。

図4:30日の周期グラフ(長期的な干渉の可視化)
図4:30日の周期グラフ(長期的な干渉の可視化)

 グラフを見ると、波が重なり合うことで全体に大きな「うねり」が生まれているのがわかります。これこそが、カレンダーでおなじみの「大潮(=干満の差が大きい)」と「小潮(=干満の差が小さい)」の正体です。わずか0.4時間という「リズムのズレ」が、15日間(約360時間)という長い時間をかけて、「山と山が重なって高くなる時期」と「山と谷が打ち消し合う時期」を交互に作り出しているのです。

 このように、個別のデータを見るだけでは気づけない「長期的なうねり」を可視化できるのが、三角関数の持つ大きな力です。

和積の数式で表現を変えてみる

 高校数学で学んだ「和積の公式(図5)」を覚えているでしょうか。2つの異なる波の「足し算」を「掛け算」の形に書き換える公式です。当時は「なぜこんな変換をするのか」と疑問に思った方も多いはずです。

図5:和積変換の公式
図5:和積変換の公式

 この公式を、先ほどの「太陽と月の合成波」に当てはめてみましょう。厳密には振幅が異なりますが、傾向を掴むために、最大振幅3.2(太陽1.0+月2.2)に合わせて近似的に変換すると、以下の数式になります。

図6:和積変換の公式を元に近似を表現した式
図6:和積変換の公式を元に近似を表現した式

 この数式が面白いのは、複雑に絡み合った一つの合成波を、「非常に速い振動(sin成分)」と「非常にゆっくりとした変動(cos成分)」の掛け算として再定義できる点にあります。

図7:和積変換によって抽出された「速い波(sin)」と「遅い波(cos)」
図7:和積変換によって抽出された「速い波(sin)」と「遅い波(cos)」

 この2つの成分を、まずは1日(24時間)のミクロな視点で見てみましょう(図8)。

図8:和積変換によって抽出された「速い波(sin)」と「遅い波(cos)」
図8:和積変換によって抽出された「速い波(sin)」と「遅い波(cos)」

 赤色の合成波は、緑色の「速い波(sin)」とほぼ重なっています。1日という短いスパンで見れば、海面は「平均的な周期」で上下しているだけに見え、紫色の「遅い波(cos)」はほとんど変化せず、単なる一定の値(定数)のように見えます。

 しかし、これを30日間のマクロ視点に伸ばすと、全く別のイメージが浮かび上がります(図9)。

図9:sin成分とcos成分で30日分をグラフにした図
図9:sin成分とcos成分で30日分をグラフにした図

 先ほどまで「定数」のように見えていた紫色の波(cos)が、ゆったりとした大きな「うねり」となって現れました。対して、緑色の波(sin)だけでは、大潮や小潮による振幅の変化を説明できず、予測は破綻してしまいます。

 ここで重要な法則が導き出されます。

  • sin成分(速い波): 「日々の満潮・干潮」というミクロな周期
  • cos成分(遅い波): 「大潮・小潮」というマクロな変動

 物理学で「うなり」と呼ばれるこの現象の正体は、実はこれら2つの視点の掛け算によって生まれる干渉模様なのです。和積の公式は、単なる数式の変形ではなく、データを「短期的な動き」と「長期的な傾向」に分離して捉えるための高度な分析手法と言えるでしょう。

次のページ
波の分解

この記事は参考になりましたか?

データサイエンス基礎を高校数学から復習連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/23071 2026/01/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング