質問<1562>2004/1/21
「d^2f(x)/dx^2=-f(x)」を「d^2f(x)/dx^2=f(x+2h)-2f(x+h)+f(x)/h^2」 (hは適当な微少な正の実数)のように微分を差分に直して、 f(x+2h)の値をf(x)とf(x+h)の値から求めて、 微分方程式を解く方法を教えてください。 境界条件はf(0)=0,df(0)/dx=1です。 また、hの取り方が、どのように解に影響を与えるかも教えて くださるとありがたいです。お願いします。
お便り2004/2/5
from=Tetsuya Kobayashi
f(x+2h) = 2f(x+h)-(1+h^2)f(x) のように変形するとちょっとは漸化式っぽいかな? せっかくなのでJavaで可視化したプログラムを書いてみました。 コンパイルしてコンソールから java main (h の値) とやれば、真の解である y=sin(x) と、上記差分方程式の解をプロットします。 h を小さくすれば小さくするほど真の解に近づきます。h=0.001くらいになると 一周期分くらいでは見た目ではほとんど差が出ません。 以下、プログラムリスト。 // f(x+2h) = 2f(x+h)-(1+h^2)f(x) import java.awt.*; class main { public static void main(String[] args) { if (args.length <= 0) return; double h = java.lang.Double.parseDouble(args[0]); Frame f = new Frame(); MyCanvas c = new MyCanvas(h); c.setSize(800,600); f.add(c, "South"); f.setBackground(Color.white); f.setForeground(Color.black); f.pack(); f.show(); } } class MyCanvas extends Canvas { double h; MyCanvas(double d) { h = d; } public void paint(Graphics g) { for (int i=0; i<8000; i++) { double p = i/1000.0; double q = Math.sin(p); putPixel(g,Color.green,p,q); } // Initial Conditions: f(0)=0, f(h)=h double p2 = 0.0, p1 = h, p0; // Second-Order Differencial for (double t=2*h; t<8; t+=h) { p0 = 2*p1-(1+h*h)*p2; putPixel(g,t,p0); p2 = p1; p1 = p0; } } void putPixel(Graphics g, Color c, double p, double q) { int x = (int)(p*100); int y = 300-(int)(q*100); g.setColor(c); g.drawLine(x,y,x,y); } void putPixel(Graphics g, double p, double q) { putPixel(g,Color.black,p,q); } } (注)プログラム中の「<」はすべて半角にしてください。(武田談)