1次元波動方程式の数値計算例(Javaアプレット) |
- プログラムソース
今回はある四角形の形をしたパルス派の進行を数値計算してみる。両端は固定端なので、パルス派は正負逆転するはずである。
import java.applet.*;
import java.awt.*;
/*
* <applet code="Wave1applet" width=300 height=300>
* </applet>
*/
public class Wave1applet extends Applet implements Runnable
{
int tmax,i,count;
double c,dt,dx;
double y[][]=new double[3][100];
Thread t;
public void init()
{
tmax=30;
c=1.0;
dt=1.0;
dx=1.0;
count=0;
t=new Thread(this);
t.start();
}
public void run()
{
try
{
for(i=0;i<100;i++)
{
if(i>10 && i<20)
{
y[0][i]=1.0;
}
else
{
y[0][i]=0.0;
}
}
repaint();
count++;
Thread.sleep(100);
for(i=1;i<100-1;i++)
{
y[1][i]=y[0][i]+c*c/2.0*dt*dt/(dx*dx)*(y[0][i+1]+y[0][i-1]-2.0*y[0][i]);
}
y[1][i]=y[1][100-1]=0.0; //境界条件
repaint();
count++;
Thread.sleep(100);
while(true)
{
for(i=1;i<100-1;i++)
{
y[2][i]=2.0*y[1][i]-y[0][i]+c*c*dt*dt/(dx*dx)*(y[1][i+1]+y[1][i-1]-2.0*y[1][i]);
}
y[2][0]=y[2][100-1]=0.0; //境界条件
for(i=0;i<100;i++)
{
y[0][i]=y[1][i];
y[1][i]=y[2][i];
}
repaint();
count++;
Thread.sleep(100);
}
}
catch(Exception e)
{
System.out.println(e);
}
}
public void paint(Graphics g)
{
Dimension d=getSize();
g.setColor(Color.black);
int w=d.width/100;
int h=d.height-1;
int y1,y2;
for(i=0;i<99;i++)
{
if(count==0)
{
y1=(int)((h-h*y[0][i])/2);
y2=(int)((h-h*y[0][i+1])/2);
}
else if(count==1)
{
y1=(int)((h-h*y[1][i])/2);
y2=(int)((h-h*y[1][i+1])/2);
}
else
{
y1=(int)((h-h*y[2][i])/2);
y2=(int)((h-h*y[2][i+1])/2);
}
g.drawLine(i*w,y1,(i+1)*w,y2);
}
}
}
- アプレット表示
初期状態のパルスは、左右に半分ずつの高さになり別れ、一方では固定端で反射して、正負逆転していることがわかる。
アプレットの表示ができない場合は、Sun Microsystems 社のJavaソフトウェアが必要です。ダウンロードは http://java.com/ja/download/index.jsp でできます。
|
|
|
|
|
|