(非)線形微分方程式の数値解法 その4 | バディ〜のブログ

バディ〜のブログ

 バディ〜のブログ

こんにちは

 

 

「その3」に続いて今回はいよいよ、

μ≠0 のときの方程式の解を考えてみます。

 

ここからが、とてもおもしろく(?)なってきます。(私だけか?)

 

 

あらためて微分方程式は

Van del pol 方程式と呼ばれているものです。

これは

   d^2y(t)/dt^2  +  y(t)  = μ(1-y(t)^2)dy(t)/dt 

 但し、μ>0 

と表せます。

 

 

 

ちなみに、

この方程式の歴史的な話や全体像の解説が

ネット検索したらPDFで見つかりました。

 

情報はこちらです。↓

「 電気学会雑誌 J. I. E. E. J. 7/'73 技術総説 

 電気工学における非線形問題 」

電気屋さん、特にハード屋さんには

なじみがあるかもしれません。

 

 

話を戻します。

 

 

 

 

まず、

μを一定値に固定して初期値を変えた場合の動きを調べてみます、

いくつでもいいのですが、今回はμ=0.5 としました。

 

 

線形の微分方程式では初期値が変われば

その解も変わるのが当然なのですが、

この方程式の場合全く異なる動きになります。

とりあえず、

初期値を色々変えて数値積分して

その解を相平面に表したものが図1です。

積分の刻み幅は

0.1/(2の13乗)=0.1/8192のものを使用しています。

 

あとでグラフが出てきますが

推定残差(比率)の最大値は

およそ1e-3、最小値はおよそ5e-7です。

 

あくまで「その3」の結果から類推したものですが、

かなりザックリ言って

解の桁の上から4桁目が怪しいことになります。

 

(やっとこれを書くことができました。)

 これを知ることが私の本来の目的なのでした。

 (^.^)

「その1」から「その3」の内容は

たったこれだけを知るためだったのですが・・・

知るのと知らないのは大違いなのであります。

 

では、話を本筋に戻します。

 

 

          図1

 

 

グラフにマーカ(太い丸印)があると太すぎて見づらいので、

直線だけの表示にしたものが図2です。

 

 

*****

あ、前回の記事{その3」はこちらです。↓

サムネイル(?)の画像にどうしても図1を入れたかったので、

ここに入れました。必要のないかたはスルーで。 (^^;

 

 

 

*****

 

 

 

 

 

             図2

 

 

図1(図2)では6種類の初期値を適当に選んで、その解を計算し

x(t)とy(t)をプロットしたものです。

(ひとつは別のカーブに完全に重なって見えませんが・・・)

 

 

原点を除いた任意の初期値x(0)、y(0)がら初めても、

時間が経過するにつれて同じ周期解に収束しています。

まるで巻き付いているようですね。

 

これがこの非線形微分方程式のおもしろい特徴のひとつです。

この周期解はリミットサイクルと呼ばれ、

色々な非線形現象にも出てきます。

 

単純に数値積分をやった

(正しくはPCがエクセルのマクロのプログラムを実行した)

だけですが、とりあえずリミットサイクルは確認できました。

よかった 、よかった  (^^;

 

電気・電子系のかたはご存じかも知れませんが、

有限桁の数値計算でフィルタリングする

IIRデジタルフィルタにも

リミットサイクルが発生する場合があることがわかっています。

普通は好ましくないのですが、

現在も有効な解決策はないようです。

40年ほど前にデジタルフィルタを設計する機会があり、

そのときに初めてこの現象を知ったのですが、

いまだに未解決のようです。

結局IIRは止めてFIRデジタルフィルタにした経験があります。

若干話がそれました。

 

もとに戻します。

 

 

相平面では解の波形がピンとこないので、

時間変化をグラフで表してみます。

6種類の解のなかから変化の大きい2種類を選びました。

これが図3と図4です。

 

ふたつとも赤い丸印のところが初期値で、

ここから急激に変化して周期解になるようすがわかりますね。

 

 

 

            図3

 

 

            図4

 

 

 

さて、

肝心の残差(比率)ですが、

この非線形微分方程式は解析的な厳密解はない

(近似的に求める方法はあります)ので、

推定残差(比率)だけになります。

これを6種類の解について求めてみました。

6種類のx(t)、y(t)はほぼ同じ形になったので、

ここではその中の一つを図5に示します。

 

 

            図5

 

図5の赤い丸印の刻み幅(最も推定残差(比率)が小さいもの)

の解を図1(図2)に使いました。

 

 

 

ということで、

6種類の解の推定残差(比率)をひとつにまとめたもの

図6です。

最小値に凸凹がありますが、

桁的にはほぼ同じなのがわかりますね。

 

 

            図6

 

 

 

では、

ここで条件を変えて

初期値を一定にして、

パラメータμを変化させたときのようすをみてみます。

 

初期値はx(0)=0、y(0)=1の一定値で、

μは0.1から0.9まで、0.1刻みで変えてみました、。

 

その前に各々の推定残差(比率)を確認しておきます。

図7と図8がそのグラフです。

最大値、最小値のいずれも若干の変動はありますが、

桁的にはほぼ同じと言えますね。

 

 

           図7

 

 

 

          図8

 

 

 

それでは

相平面のグラフが図9、図10、図11です。

9種類の解をひとつにまとめると見づらいので

3種類をまとめて、3枚のグラフにしました。

(マーカも見づらいので省略し、直線だけにしています。)

 

 

 

          図9

 

 

 

           図10

 

 

 

          図11

 

 

 

μが増加するにつれて、

リミットサイクルが次第に円から形がくずれ、

歪んでいくのがわかりますね、

 

ただ、x(t)つまり横軸方向は歪みが大きいのですが、

y(t)=縦軸方向の歪みは横軸ほど大きくはないですね。

 

さらに、縦軸y(t)の最大値(=振幅)はμの値に無関係に

ほぼ2になります。

この方程式の解のおもしろい特徴です。

(実は若干増加しますが、これはこのあとで調べます。)

 

 

 

 

相平面よりも時間変化のほうがピンとくるので

初期値(=0秒)から30秒までの時間を横軸とした

y(t)の3枚のグラフを図12、図13、図14に示します。

 

 

          図12

 

 

          図13

 

 

 

          図14

 

 

 

 

最初の30秒は、さほと大きな差は見当たりませんが・・・

今度は終わり辺りの時間、

400秒から409.5秒までのy(t)の時間変化を見てみます。

これが図15,図16、図17です。

 

 

 

          図15

 

 

           図16

 

 

          図17

 

 

 

 

この3枚は明らかに違いますね。

波の形が時間的にずれています。

これを位相がずれていると言い、

一般的に連続した周期波形では周波数が違うとこうなります。

 

また、

波形の縦軸の大きさ(振幅)はどれも

±2でグラフでは同じように見えます。

(マーカが太いのでやや見づらいですが)

 

 

ついでに

y(t)の時間微分x(t)の時間変化も400秒から409.5秒まで

グラフに表してみました。

これが図18、図19、図20です。

 

 

 

           図18

 

 

           図19

 

 

          図20

 

これら3つのグラフのカーブは、

個人的には全く違和感がなく、どこかで見たことがある(気がする)

波形ばかりです。

どこで見たかは思い出せませんが・・・

 

 

 

 

 

ではでは

ここからはμが変わるとy(t)の周波数が変わっていることと

振幅が2から僅かに増加することの

ふたつについて調べてみます。

 

 

 

 

ます、μに対する周波数の変化です。

図12から図17のような時系列データy(t)について、

各々のμことにエクセルでフーリエ解析を行い

周波数分布を求めたものが図21です。

 

横軸はスペクトル番号Nで、

周波数fとの関係は

分解周波数Δfを

Δf= 時系列のサンプリング周波数 / 時系列データ数

  = (1/0.1) / 4096

  = 0.00244140625 (Hz))  (=一定値)

としたとき

 f = N * Δf

となります。

ここでのフーリエ解析では、

Nは 0,1,2,3,・・・,2045,2046,2047の自然数で、

Nから求めた周波数fはΔfに比例し離散化された値となります。

 

縦軸は振幅レベル(デシベル)で表しています。

 

 

9種類のμについて1枚のグラフにまとめました。

これだけでは概略しかわかりませんが・・・

図21の赤い丸印が最も低い周波数(基本周波数)で、

その奇数倍の高調波を含んだ周波数分布になっていますね。

 

また、高調波の減衰度(対数表記)は、

周波数に対し直線的に変化しています。

普段よく見るパターンは周波数(横軸)も対数表示にしたときに

縦軸が直線的に変化するのですが・・・

この形も特徴になりそうです、

 

 

 

           図21

 

 

図21の基本周波数部分を部分拡大したものが図22です。

どの解の振幅もほぼ2なので、

グラフでは20*log10(2)=6デシベルにピークを持ちます。

 

μが増加するに従い

ピークの周波数が小さくなっているのがわかります。

 

 

 

             図22

 

 

ここで、μに対する周波数変化を示す2次の近似式を

手持ちの本から見つけました。

基本周波数をfbとすると

   fb ={ 1- (μ^2)/16 } / 2π

となります。

これをスペクトル番号Nに対応させると

   N = fb / Δf

になり、プロットしたものが図23になります。

μが増加するとNが減少します、

 

 

 

 

            図23

 

さらに

図22を縦横の各方向に拡大して、

図23のNの値を追加したものが図24です。

比較が簡単なように

図23のNは縦軸の値が10dBの直線としました。

 

図24の赤い矢印がμ=0のときのNになり、

緑色の矢印が図23のNと

そのときのμに対応する周波数分布のピークとをつないだものです。

矢印がまっすぐ下に降りていればふたつのNは同じになります。

 

 

           図24

 

 

グラフでの比較なので定性的になりますが、

μが小さいときは

フーリエ解析したスペクトルのピーク(エクセルでの近似カーブ)と

図23のNは殆ど違いはなく

μが大きくなるにつれて差が大きくなる傾向です。

図23は2次の近似式なので、

おそらくμが増加するにつれて確度が下がるためだと思いますが、

詳細は調べていません、

ということでこの話題はここで終了です。

 

 

 

 

 

では、次の話題です。

 

図9,図10,図11のところにも書きましたが、

この方程式の解y(t)の周期解の振幅は

約2で微小増加することがわかっています。

 

たまたま、ネット検索で、

とある修士論文要旨にμと振幅の数値データを見つけました。

μの範囲は0.1から0.9まで刻み幅が0.1だったので、

実は、これに合わせて数値積分をやってみた次第です。

(そのほかにも色々と条件を変えては計算しています。)

 

では、

入手したデータ(これを理論値とします)の値はいくつかというと

 

  μが0.1のとき  2.00010398

        :

        :

  μが0.9のとき  2.00724521

という殆ど2と変わらない程度のものです。

このグラフが図25です。

図25の横軸がμを、縦軸がy(t)の周期解の振幅です。

ここに数値積分した結果

(2種類:数値積分結果の最大値と最小値の絶対値))も入れたので

3本のカーブになりますが、

完全に重なってしまい1本に見えます

 

 

 

 

            図25

 

 

 

では、ここで各μごとに残差を比較します。

今回は真値(=理論値)がわかっているので

真値残差(比率)が計算でき、推定残差(比率)とも比較できますね。

 

図26は、図8のy(t)だけを表記したグラフに

振幅の真値残差(比率)を追加したもので赤い丸印で囲みました、

とりあえず最大値と最小値の間にあるので、

おかしくはありませんね。

 

 

           図26

 

 

次に、真値残差(比率)と推定残差(比率)の比較です。

これが図27です。

それぞれ振幅のプラス側とマイナス側に分けて、

4種類のデータになります。

横軸はμの値で、縦軸は2種類の残差(比率)です。

 

 

 

           図27

 

4個の残差(比率)は

μ=0.9のところが違いがあり

その他も多少の凸凹はありますが

ザックリ桁的には(図26の丸い囲みのように)

ほぼ同じとみていいでしょう。

 

この桁、つまり7e-6の各残差(比率)は

図26では最大値と最小値のちょうど中央あたりになります。

これはどこから来るのか?なぜそうなるのか?

を今までのデータから調べてみました。

 

 

図28がμ=0.9のときのy(t)とその推定残差(比率)の関係です。

横軸がy(t)でこの最大値は、

右側の縦長の赤い丸印付近にあたります。

また、この位置に相当する縦軸、

つまり横長の赤い丸印付近の値が推定残差(比率)になります、

ということで、この部分を横方向に拡大したものが図29です。

 

 

          図28

 

 

図29のグラフの緑色の丸印の位置がy(t)の最大値で、

これに対応する縦軸の値(緑色の丸印)が

残差(比率)になります。

この位置は推定残差(比率)の最大値より

3桁ほど低くなっています。

ということでこの違いが説明できました。

 

 

 

 

 

             図29

 

 

 

 

 

とここまで書いたところで、

重大な(?)思い違いに気が付きました。

 

入手した振幅の値(=理論値)は、

周期解の極大値かつ最大値なのですが、

数値積分した結果の最大値は

0.1秒刻みで計算した中の最大値であり、

必ずしも極大値と一致しているわけではない

ということです。

例えば、

極大値が0.1秒刻みの中間の時間0.05秒にあるかもしれない・・・

極大値こなる保証がまったくないまま

議論していたことになりますね。

なので、

残念ながら

今までの周期解の振幅については真値残差、推定残差の両方とも

意味がないことになります。

 

現状での計算結果で言えることは、

少なくとも真値残差(比率)の極性(プラスマイナスの符号)は

(最大値が極値に完全に一致しない限り)

必ずマイナスでなければならないはずが、

プラスになっているということくらいです。

これは

おそらく積分の刻み幅を数桁小さくすれば改善されるでしょう。

今までの実績から見て、

PCのマクロ実行時間が10日以上掛かるとは思いますが・・・

 

 

まあ、

推定残差(比率)が三桁とか四桁とか言っているところに

文字通り、桁違いの話をするのもどうかと思うのですが・・・

(^^;

 

 

 

 

最後の問題、というか課題はやや厄介ですね。

 

尤も

本来の目的とはずいぶんかけ離れているので

おそらくやらないとは思いますが

もし、やるとすれば

 

極大値の検出は

現在の方法、つまり

0.1秒の刻み幅表示(=エクセルのセルへの書き込み)する方法だと

ほぼ不可能です。

基本的なアルゴリズムを変更して

積分処理の最小ループの中に

最大値と最小値の検出処理を入れて

最小の刻み幅単位での検出を毎回実行するように

プログラムを変更する必要がありますね。

おそらくPCのマクロ実行時間が一けた以上増えると思います。

さらに

最大値と最小値の検出は

周期解(=リミットサイクル)に入ったあとの時間から

行わなければなりません。

初期値を限定すればなんとかなりそうですが、

あまり汎用性のないプログラムにはしたくないので、

この検出方法も考える必要があります。

気が向いて、気分がいいときにやるときが来るか・・・な??

 

色々使えるプログラムにするには

想定される問題を事前に明確にしたあとで ←これ大事!

ひとつひとつ解決しないといけないものです。

どこかの国のなんとかカードの問題とよく似ていますね。