SSブログ

ねこ騙し数学、ページビュー累計100万突破!! [ひとこと言わねば]

本日、4月18日に、
ねこ騙し数学、ページビュー累計100万突破!!


当初の予定では、「4月15日までには100万を突破できるだろう」と、取らぬ狸の皮算用をしていたのだが、それより3日ほど遅れてしまった。


上の記事をアップした3月18日から、So-netブログは、アクセス障害、サーバー障害、これらに伴う緊急メンテナンスなど、色々と事件が起きたからね〜。このため、この記事をアップしてから、100万超えまで、ちょうど、1ヶ月の時を要してしまった。思惑通りに事態が推移しないのが世の中であり、人生だから、これはしょうがない。

ではあるが、今日4月18日に、めでたく、100万を超えた。これを祝して、


さらに、「けものフレンズ」総出で


さらに、登場キャラを増やして


このブログ、「ねこ騙し数学」を始めて3年以上の年月をかけて、ようやく100万超え。思えば、実に長い年月であった。

現在、記事はまったく更新していないけれど、ページビュー累計100万超えは、ネムネコがこのブログと並行してやっていたブログ「ねむねこ幻想郷」の方で、昨年の2月に達成している。



「ねむねこ幻想郷」は2年ほどで100万超えたので、それから、1年遅れで、100万を越えることができた。1日あたりの訪問者数は、昨年の半ばくらいから、「ねこ騙し数学」の方が多かったけれど、「ねむねこ幻想郷」は、いつしか、ニュース紹介のブログになっていたので、1日の記事数が多くて(20〜30くらい)、ページビューは多かった。「ねむねこ幻想郷」にアクセスすると、世の中の動きなどを素早く知ることができるということで、結構、便利なサイトだったらしいけれど、午前7時、正午、午後7時の1日3回、それを毎日続けることは辛すぎるということで、今年に入ってから、記事の更新をやめて、事実上、「ねむねこ幻想郷」は閉鎖したにゃ。

「ねむねこ幻想郷」というブログを削除したいという思いはあるのだけれど、このブログ「ねこ騙し数学」の初期の微分積分などの記事は、「ねむねこ幻想郷」の記事をコピペしたもので、これらの記事中に使われている数式(画像データ)はすべて「ねむねこ幻想郷」に保存されているので、「ねむ猫幻想郷」というブログを削除すると、微分積分などの式が消え去ってしまう。ということで、消すに消せないという状況なんだケロ。それで、「ねむねこ幻想郷」は、未だにゾンビ・ブログとして存続しているにゃ。


今年に入ってから、このブログでは、アニソンだけではなく、コアなクラシック音楽――一般的なクラシックファンは聞かない、存在自体しらないマイナーな(作曲家の)曲が多い(^^ゞ――も紹介しているので、100万越えの慶事を祝して、ワーグナー作曲『楽劇 ニュルンベルグのマイスタージンガー』の前奏曲を埋め込むにゃ。


さらに、ベートーヴェン作曲『歌劇 フィデリオ』から『レオノーレ序曲第3番』でお祭りの雰囲気を高めるにゃ。


お前らがどう思うが、このブログの主要テーマの一つは変わらぬ愛だにゃ。だから、レオノーレ序曲第3番はピッタリだと思うケロ。

最後に


だにゃ。このブログは、かならず、歴史やナンパのブログに打ち勝つと思うにゃ。

だって、


だからだにゃ。

信じるにゃ、ネムネコとこのブログを!!



nice!(2)  コメント(0) 
共通テーマ:音楽

境界値問題の前進積分による解法2 [数値解析]

境界値問題の前進積分による解法2

 

次の微分方程式があるとする。

  

この解は、

  

 

2階常微分方程式(1)の境界値問題を4次のルンゲ・クッタ法で解く方法を思いついたので、紹介する。

微分方程式

  

は、

  

とおくと、

  

となり、次の連立微分方程式に書き換えることが可能。

  

そして、(2)は、x=x₀におけるypの初期値y₀p₀が与えられれば、(2)は(4次の)ルンゲ・クッタ法を用いて前進的に解くことができる。

しかし、(1)の境界値問題では、pの初期値p₀が与えられていない。

そこで、y₀=0p₀=1と推測し、n=10h=0.1として、ルンゲ・クッタ法で解くと、次のような計算結果が得られる。

 

RunRun-tab-001.png

 

x=1におけるyの値はy(0)=1だから、として計算したyの誤差

  

次に、とし、ルンゲ・クッタ法を用いて解くと、次のようになる。

 

RunRun-tab-002.png

 

このとき、x=1におけるyの計算値は1.425591だから、誤差

  

である。

この計算結果を用いてx=0におけるpを次のように推測する。

  

になる。

ところで、この微分方程式の厳密解は

  

であり、これを用いてy'(0)を求めると、

  

だから、何と、小数点5位まで正確な値を推測できる。

先に求めたを小数点7位で四捨五入した

  

として計算した結果は次の通り。

 

RunRun-tab-003.png

 

x=1でのyの計算値は1になっており、この境界値問題を(4次の)ルンゲ・クッタ法を用いて見事解くことができた!!

 

3回も計算するのは面倒なので、推測機能を備えたプログラムを新たにC言語で作った。

 ――最近、Fortranでずっとプログラムを書いていたから、Cでプログラムを書くことに、結構、手こずった(^^ゞ――

それを用いて解いた結果は次の通り。

 

RunRun-tab-004.png

 

計算に使用したプログラムは次の通り。

 

#include <stdio.h>
#include <math.h>
#define N 10

double f(double , double, double);
double g(double , double, double);
double exact(double);

void Runge_Kutta(double *x, double *y, double *z, double h, int n) {
    double dk[2][4];
    int i;
   
    for (i=0; i < n; i++) {
        dk[0][0] = h*f(x[i],y[i],z[i]);
        dk[1][0] = h*g(x[i],y[i],z[i]);
        dk[0][1] = h*f(x[i]+h/2, y[i]+dk[0][0]/2, z[i]+dk[1][0]/2.);
        dk[1][1] = h*g(x[i]+h/2, y[i]+dk[0][0]/2, z[i]+dk[1][0]/2.);
        dk[0][2] = h*f(x[i]+h/2, y[i]+dk[0][1]/2, z[i]+dk[1][1]/2.);
        dk[1][2] = h*g(x[i]+h/2, y[i]+dk[0][1]/2, z[i]+dk[1][1]/2.);
        dk[0][3] = h*f(x[i]+h, y[i]+dk[0][2], z[i]+dk[1][2]);
        dk[1][3] = h*g(x[i]+h, y[i]+dk[0][2], z[i]+dk[1][2]);
       
        x[i+1]=x[i]+h;
        y[i+1]=y[i]+(dk[0][0]+2*dk[0][1]+2.*dk[0][2]+dk[0][3])/6.;
        z[i+1]=z[i]+(dk[1][0]+2*dk[1][1]+2.*dk[1][2]+dk[1][3])/6.;
    }
}

main() {
    double x[N+1],y[N+1],p[N+1];
    double h=0.1;
    double p0=1., p1=2., w;
    double eps0, eps1, eps=0.000001;
    double yn;
    int i, cnt, n = N;


    x[0]=0.; y[0]=0.; p[0]=p0; yn=1.0; // p0はx=0におけるp=dy/dxの推測値、yn=y(1)はx=1におけるyの値
    Runge_Kutta(x, y, p, h, n);  // y0=1、p0=1としてルンゲ・クッタ法で計算
    eps0=y[n]-yn; // x=1におけるyの誤差を計算
    p[0]=p1; //p₀の推測値を更新
    Runge_Kutta(x, y, p, h, n);  // y0=1、p0=2としてルンゲ・クッタ法で計算
    eps1=y[n]-yn; // x=1におけるyの誤差を計算

    w=(eps1*p0-eps0*p1)/(eps1-eps0); // 補間法を用いてp₀を推測
    p0=p1; p1=w;
   
    cnt=1;
    while(cnt <= 20) {
        eps0=eps1;
        p[0]=p1;
        Runge_Kutta(x, y, p, h, n); // 推測値を用いて再計算
        eps1=y[n]-yn;  // 誤差を計算
        if (fabs(eps1)<eps) break; // 収束条件を満たしていたら計算終了
        w=(eps1*p0-eps0*p1)/(eps1-eps0); // 補間を用いてp₀を推測
        p0=p1; p1=w;
        cnt++;
    }

    printf("    x       y      厳密解\n");
    for(i=0;i<=n;i++) {
        printf("%f %f %f\n",x[i],y[i],exact(x[i]));
    }
}

double f(double x,double y, double z) {
    return z;
}

double g(double x, double y, double z) {
    return -2.*x*z - x*x*y;
}

double exact(double x) {
    double e;
    e=exp(1);
    return pow(e,3./2.)/(e*e-1)*(exp(x)-exp(-x))*exp(-x*x/2);
}

 

そして、「どうだ」と、胸を張るネムネコであった。

 

 

画像元:YouTubeの上の動画

 

さらに、自画自賛ソングを!!

 

 

なお、ループ(while)が存在するのは、非同次線形微分方程式だけではなく、非線形の微分方程式にも対応できるようにしたため。

線形微分方程式ならば、whileループは不要!!

 

 


nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。