质量为m的地球的动能
地球动能
质量为m的相对太阳的引力势能
设太阳的质量为M,其无穷远处的势能为零点,当质量为m的物体从无穷远处移动到太阳r处时,引力做功
引力做功
从无穷远处来到r处,引力势能变化
引力势能变化
所以r处的引力势能为
引力势能
我们此时知道了地球的引力势能与动能,使用拉格朗日函数
拉格朗日函数
找到r的关系
image.png解出来就是
image.png
找到θ的关系
因为θ与L没有关系,所以偏导数就是0
image.png
计算r的加速度
距离的二阶导数就是加速度
function calculateDistanceAcceleration(state) {
` // [acceleration of distance] = [distance][angular velocity]^2 - G * M / [distance]^2
return state.distance.value * Math.pow(state.angle.speed, 2) -
(constants.gravitationalConstant * state.massOfTheSunKg) / Math.pow(state.distance.value, 2);
}
计算角度θ的加速度
function calculateAngleAcceleration(state) {
// [acceleration of angle] = - 2[speed][angular velocity] / [distance]
return -2.0 * state.distance.speed * state.angle.speed / state.distance.value;
}
接下来使用欧拉法预测数据,deltaT是一个微小的量,derivative是时间的导数
function newValue(currentValue, deltaT, derivative) {
return currentValue + deltaT * derivative;
}
计算距离r
var distanceAcceleration = calculateDistanceAcceleration(state);
state.distance.speed = newValue(state.distance.speed, deltaT, distanceAcceleration);
state.distance.value = newValue(state.distance.value, deltaT, state.distance.speed);
计算角度θ
var angleAcceleration = calculateAngleAcceleration(state);
state.angle.speed = newValue(state.angle.speed, deltaT, angleAcceleration);
state.angle.value = newValue(state.angle.value, deltaT, state.angle.speed);
计算地球位置
function calculateEarthPosition(distance, angle) {
middleX = Math.floor(canvas.width / 2);
middleY = Math.floor(canvas.height / 2);
var centerX = Math.cos(angle) * distance + middleX;
var centerY = Math.sin(-angle) * distance + middleY;
return {
x: centerX,
y: centerY
};
}
网友评论