SSブログ

オレって実はスゴイ(笑) Part2 [ひとこと言わねば]

ネムネコが、昨夜、閃いた(思いついた)、4次のルンゲ・クッタ法を用いた2階常微分方程式の境界値問題の解法は、第一種の境界条件と第2種の境界条件の両方が使用されている場合にも、適用が可能なようだね。

  

h=0.1で、上の境界値問題を解いた場合の計算結果は次の通り。

 

Nemuneko-ho.png

 

参考までに、h=0.01とし、差分を用いた結果も以下に示す。

 

 

h=0.01とルンゲ・クッタ法の10倍計算格子の間隔を細かくとっているものより、心もち、高精度で計算できていることがわかる。

 

 

ではあるが、

混合条件にまで拡張できるか、どうやって拡張したらよいかについてはまったくの白紙状態。

大体、ネムネコは、数値計算に関しては素人だにゃ。

化けネコではあるが、ネコがここまでできるってこと自体が既に驚異だにゃ。

そう思わないかい?




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

今日のアニソン、「名探偵ホームズ」から『グッバイ・スウィートハート』 [今日のアニソン]

今日のアニソンは、映画「名探偵ホームズ」から『グッバイ・スウィートハート』です。


ネムネコは、この曲↑、すごく好きなんだケロ。


ED曲、いいよね。そう思わないケロか?


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

差分法による2階常微分方程式の境界値問題の数値解法3 [数値解析]

差分法による2階常微分方程式の境界値問題の数値解法3

 

前回、次の微分方程式

  

x=1における第2種の境界条件(ノイマンの境界条件)

  

を後退差分

  

と近似し計算したところ、うまくいかなかった。(下図参照)

 

kyoukaichi-graph-002.png

 

これは、

(1)式を差分方程式にするときに用いた

  

であるのに対し、x=1における境界条件の近似で用いた

  

の誤差がO(h)と、(2)、(3)式に対して誤差が大きく、これが数値解の精度を悪化させたためである。

したがって、この問題を解決するためには、x=1における境界条件の近似を(4)より高精度にする必要がある。

そこで、

  

[0,1]の外に仮想の点を設け、さらに、微分方程式

  

x=1でも成立すると仮定する。

すると、x=1における差分方程式は

   

になる。

x=1における境界条件に中心差分を用いると

  

これを(5)に代入すると、

  

これと、k=1n−1に関する差分方程式

  

を合わせると、未知数の個数はn個、対して、方程式の数もnとなるので、次の連立方程式を解くことによって、を全て求めることができる。

  

この方針に従ってプログラムを書き換え、n=10h=0.1の場合について計算した結果は次の通り。

前回と異なり、良好な計算結果が得られていることがわかるだろう。

 

Kyoukaichi-Graph-001.png

 

なお、本計算に使用したプログラムは、(1)より一般の

  

を解くものであり、以下に、計算結果とプログラムを示す。

 

Keisan-Kekka-001.png 

 

! 差分法を用いて y''+f(x)y'+g(x)y=h(x) の境界値問題(ノイマン条件)を解くプログラム
! ただし、固有値問題は解けない!!
parameter (ns=100)
real x(0:ns), y(0:ns)

x = 0.; y =0; ! 変数の初期化

n=10 ! nは分割数

a=0.; b=1. ! 境界のx座標
x(0)=a; x(n)=b
y(0)=1. ! 境界条件

call Solver(x,y,n)

! 計算結果の出力
write(*,*) ' i      x         y      Exact'
do i=0, n, 1
    write(*,100) i, x(i), y(i), exact(x(i))
end do

100 format(i3,1x,f9.5,1x,f9.5,1x,f9.5)
end

function exact(x)
e=exp(1.)
exact=2/(2-e)*exp(-x)- e/(2-e)*exp(-2.*x)
end

function f(x)
f=3.
end

function g(x)
g=2.
end

function h(x)
h=0.
end

! ここより下はいじると危険
! ブラックボックスとして使うべし


subroutine Solver(x,y,n)
real a(n),b(n),c(n),d(n)
real x(0:n), y(0:n)

n1=n-1
dx=(x(n)-x(0))/n
dx2=dx*dx

do i=1,n1
    x(i)=x(0)+i*dx
end do

! 差分法によって得られる連立方程式の係数の計算
do i=1,n1
    a(i)=1-dx/2.*f(x(i))
    b(i)=-(2-dx2*g(x(i)))
    c(i)=1+dx/2.*f(x(i))
    d(i)=dx2*h(x(i))
end do

! 境界条件
    d(1)=d(1)-a(1)*y(0) ! x=0 ディリクレ条件
!    x=1 dy/dx=0 ノイマン条件
    a(n)=2.
    b(n)=(dx2*g(x(n))-2.)
    c(n)=0.
    d(n)=dx2*h(x(n))

call tdma(a,b,c,d,n) ! TDMAで連立方程式を解く

do i=1,n
    y(i)=d(i) ! 計算結果をセット
end do

end

!  TDMA
subroutine tdma(a,b,c,d,n)
real a(n), b(n), c(n),d(n)
do i=1,n-1
    ratio=a(i+1)/b(i)
    b(i+1)=b(i+1)-ratio*c(i)
    d(i+1)=d(i+1)-ratio*d(i)
end do
d(n)=d(n)/b(n)
do i=n-1,1,-1
    d(i)=(d(i)-c(i)*d(i+1))/b(i)
end do

end

 

x=0.3近傍、y=0付近での数値解と厳密解との差が多少気になるので、n=100h=0.01で計算した結果を以下に示す。

 

Keisan-Kekka-002.png

 

h=0.1のとき、小数点2桁目に、h=0.01の場合は、小数点4桁目で、数値解と厳密解が異なっているが、数値計算の精度がこの程度だから、これはしょうがない。

 

 


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

オレって実はスゴイ(笑) [ひとこと言わねば]

ルンゲ・クッタ法(4次)で境界値問題

  

が簡単に解けてしまう(・・?

 

ルンゲ・クッタを3回使うだけで、何故か分からないけれど、簡単に解けてしまったケロよ。

この解法を思いついたネムネコがすごいってことか(笑)。

 

 

何でこんなに簡単に解けるだろう。不思議だな〜。



すげぇな、4次のルンゲ・クッタ法って。



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

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