JPのブログ

読書記録や勉強したことをまとめていきます。

恋愛方程式

非線形・カオスに興味があり、「ストロガッツ 非線形ダイナミクスとカオス」を読んだ。

ストロガッツ 非線形ダイナミクスとカオス

ストロガッツ 非線形ダイナミクスとカオス

この本の5.3節の「恋愛問題」の内容が大変面白かったため、Pythonで検討を行ってみた。

問題設定

ロミオとジュリエットの恋愛の行方(ダイナミクス)を計算する。
具体的には、以下の2つの変数の時間変化を計算する。

R(t) = 時刻tでロミオがジュリエットを好きな/嫌いな度合い
J(t) = 時刻tでジュリエットがロミオを好きな/嫌いな度合い

ここで、R, Jの正の値は好き、負の値は嫌いを意味する。

このとき、二人の恋愛の数学モデルは以下のようにあらわせる。
 \displaystyle\frac{dR}{dt} = aR + bJ
 \displaystyle\frac{dJ}{dt} = cR + dJ

ここで、a, b, c, dは正負いずれの値も取りうる。
例えば、一つ目の式でa > 0, b > 0の時、
・ ロミオは自分がジュリエットを好きなほど、よりジュリエットが好きになる。
・ ロミオはジュリエットが自分を好きなほど、よりジュリエットが好きなる。
ということを意味し、かなりロミオは恋愛に燃え上がるタイプだと言える。

横軸にR,, 縦軸にJを取ると以下のような可視化ができる。

f:id:ReliableEng:20191123100417j:plain

第1~4象限がそれぞれ、相思相愛、Juliet片思い、互いに嫌い、Romeo片思いを意味する。
この図(力学系では二次元相空間と呼ぶ)上で、任意の初期状態(恋の始まり)から時間経過とともにどのように二人の関係が変化していくかシミュレーションすることができる。上図では初期状態が原点であり、互いに無関心な状態と言える。

ケース分け

以下のケースを実施してみた。

f:id:ReliableEng:20191123110520p:plain

解法

Pythonの科学計算用のパッケージにあるscipyの”odeint”を用いて微分方程式を任意の初期条件から数値的に解いた。
可視化にはmatplotlibのAnimation機能を使用した。

結果

ケース1(自分の気持ちには無関心)

相思相愛になるのは1/4の周期のみで、二人の気持ちの変遷は同じ軌道を繰り返す。

f:id:ReliableEng:20191123102733g:plain
Case 1

ケース2(自分の気持ちに慎重な、似たもの同士)

互いに慎重になりすぎて、お互いに無関心な状態に行き着いてしまう。残念。

f:id:ReliableEng:20191123110003g:plain
Case2

ケース3(相手の気持ちに敏感な、似たもの同士)

ロミオの片思いの状態から一度気持ちが冷め始めるが、一転最高のクライマックスを迎える。

f:id:ReliableEng:20191123110031g:plain
Case3

ケース4(Case 3の初期条件をわずかに変更)

初期条件がケース3とわずかに異なる。(ケース3と比べてロミオの片想い具合はわずかに小さい)
始めはケース3と似た軌道だが、不幸なことに最終的に仲違いしてしまう。

f:id:ReliableEng:20191123110051g:plain
Case4

感想

本当の恋愛はもっと様々要素が関係した複雑なものであると思うが、ケース 3と4の違いのように恋の始まり方によって終わり方が異なるなど、現実でもありそうな傾向が簡単なシミュレーションから出てくるところが面白い。

本書では、二次元の線形系相空間のとっつき易いモデルとして恋愛問題が紹介されているが、初めて微分方程式を勉強する人にとっても良い例題だと思う。微分方程式を解くと何が嬉しいのか、楽しく勉強できるのではないか。
(たぶん無いと思うが)私が将来微分方程式を誰かに教える機会があれば、ぜひ説明に恋愛方程式を取り入れてみたい。