シミュレーションプログラムの基礎として、砲弾の軌道計算を紹介します。
その場合、ある短い時間幅を考え、その間は速度は変化しないと考えて計算する方法があります。
短い時間幅で移動する距離は、短い時間幅とその時の速度を掛けて求めます。
速度の変化分は、短い時間幅と速度の変化分(加速度)を掛けて求めます。
この様に、短い時間幅で少しづつ計算しながら進めていき、解を求めていく方法が数値計算です。
また、砲弾の軌道を計算する場合に、空気抵抗を考慮すると、速度の変化分(加速度)は、速度に比例して変化します。
以上の点をまとめると、短い時間で変化する移動距離、速度、および、空気抵抗を考慮した加速度は以下の様になります。
移動距離 = 短い時間幅 * 速度
速度変化 = 短い時間幅 * 加速度
加速度 = 重力加速度 - 空気抵抗係数 * 速度
尚、以下のプログラムで、th は打ち上げ角度、v0 は初速、k は空気抵抗係数を表します。
var canvas = document.getElementById('jsccanvas');
var context = canvas.getContext('2d');
function point(x, y) {
x = x / 4;
y = 400 - y / 2;
context.strokeStyle = 'rgb(0, 0, 0)';
context.fillStyle = 'rgb(255, 255, 0)';
context.beginPath();
context.arc(x, y, 3, 0, 2*Math.PI, true);
context.fill();
}
var th = 30;
var v0 = 300;
var k = 0.1;
var px = 0;
var py = 0;
var vx = v0 * Math.cos(th / 180 * Math.PI);
var vy = v0 * Math.sin(th / 180 * Math.PI);
var ax = 0;
var ay = -10;
var dt = 0.1;
var i = 0;
for(i = 0; i < 10000; ++ i) {
px += dt * vx;
py += dt * vy;
vx += dt * ax;
vy += dt * ay;
ax = 0 - k * vx;
ay = -10 - k * vy;
if(py < 0) break;
// console.log(px + ", " + py + ", " + vx + ", " + vy);
point(px, py);
}