Exemplo n.º 1
0
function test()
{
    $pi = 3.141592653589793;
    $solar_mass = 4 * $pi * $pi;
    $days_per_year = 365.24;
    $bodies = array(array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, $solar_mass), array(4.841431442464721, -1.1603200440274284, -0.10362204447112311, 0.001660076642744037 * $days_per_year, 0.007699011184197404 * $days_per_year, -6.90460016972063E-5 * $days_per_year, 0.0009547919384243266 * $solar_mass), array(8.34336671824458, 4.124798564124305, -0.4035234171143214, -0.002767425107268624 * $days_per_year, 0.004998528012349172 * $days_per_year, 2.3041729757376393E-5 * $days_per_year, 0.0002858859806661308 * $solar_mass), array(12.894369562139131, -15.111151401698631, -0.22330757889265573, 0.002964601375647616 * $days_per_year, 0.0023784717395948095 * $days_per_year, -2.9658956854023756E-5 * $days_per_year, 4.366244043351563E-5 * $solar_mass), array(15.379697114850917, -25.919314609987964, 0.17925877295037118, 0.0026806777249038932 * $days_per_year, 0.001628241700382423 * $days_per_year, -9.515922545197159E-5 * $days_per_year, 5.1513890204661145E-5 * $solar_mass));
    // offset_momentum
    $px = $py = $pz = 0.0;
    foreach ($bodies as &$e) {
        $px += $e[3] * $e[6];
        $py += $e[4] * $e[6];
        $pz += $e[5] * $e[6];
    }
    $bodies[0][3] = -$px / $solar_mass;
    $bodies[0][4] = -$py / $solar_mass;
    $bodies[0][5] = -$pz / $solar_mass;
    $pairs = array();
    for ($i = 0, $m = count($bodies); $i < $m; $i++) {
        for ($j = $i + 1; $j < $m; $j++) {
            $pairs[] = array(&$bodies[$i], &$bodies[$j]);
        }
    }
    $n = 2;
    // printf("%0.9f\n", energy($bodies));
    $i = 0;
    do {
        foreach ($pairs as &$p) {
            $a =& $p[0];
            $b =& $p[1];
            $dx = $a[0] - $b[0];
            $dy = $a[1] - $b[1];
            $dz = $a[2] - $b[2];
            $dist = sqrt($dx * $dx + $dy * $dy + $dz * $dz);
            $mag = 0.01 / ($dist * $dist * $dist);
            $mag_a = $a[6] * $mag;
            $mag_b = $b[6] * $mag;
            $a[3] -= $dx * $mag_b;
            $a[4] -= $dy * $mag_b;
            $a[5] -= $dz * $mag_b;
            $b[3] += $dx * $mag_a;
            $b[4] += $dy * $mag_a;
            $b[5] += $dz * $mag_a;
        }
        foreach ($bodies as &$b) {
            $b[0] += 0.01 * $b[3];
            $b[1] += 0.01 * $b[4];
            $b[2] += 0.01 * $b[5];
        }
    } while (++$i < $n);
    return energy($bodies);
}
Exemplo n.º 2
0
    }
}
$n = $argv[1];
printf("%0.9f\n", energy($bodies));
$i = 0;
do {
    foreach ($pairs as &$p) {
        $a =& $p[0];
        $b =& $p[1];
        $dx = $a[0] - $b[0];
        $dy = $a[1] - $b[1];
        $dz = $a[2] - $b[2];
        $dist = sqrt($dx * $dx + $dy * $dy + $dz * $dz);
        $mag = 0.01 / ($dist * $dist * $dist);
        $mag_a = $a[6] * $mag;
        $mag_b = $b[6] * $mag;
        $a[3] -= $dx * $mag_b;
        $a[4] -= $dy * $mag_b;
        $a[5] -= $dz * $mag_b;
        $b[3] += $dx * $mag_a;
        $b[4] += $dy * $mag_a;
        $b[5] += $dz * $mag_a;
    }
    foreach ($bodies as &$b) {
        $b[0] += 0.01 * $b[3];
        $b[1] += 0.01 * $b[4];
        $b[2] += 0.01 * $b[5];
    }
} while (++$i < $n);
printf("%0.9f\n", energy($bodies));