Сторінка
10
<tr><td>Ім'я вихідного файлу:
<br><input size="40" type="text" value="houtput.txt" name="filo"></td></tr>
<tr><td><input type="submit" name="Submit" value="Пішов!"></td></tr>
<tr><td><table width="50%" border="0">
<tr><td></td></tr></table></td></tr></table></form>
<?php print "<BR>Copyright (C) 2003-2004 Yurko Natanzon. All rights reserved. Копірайт (К) 2003-2004, Юрко Натанзон. Всіх прав дотримано."; ?>
Фото 1. Загальний вигляд програми, що здійснює розрахунки.
Програмний код файлу calculate.php3
<HTML>
<TITLE>Розв"язок системи дифрівнянь .</TITLE>
<BODY>
Ідуть підрахунки, чекайте .<BR><BR>
<?php //Початок php коду
//Функції f1-f4 характеризують рівняння системи (3.4)-(3.7)
function f1 ($j, $fi_np1, $fi_nm1, $g0, $u, $fi)
{
$result = 0-$j*($fi_np1 + $fi_nm1)+$g0*$u*$fi;
return $result;
}
function f2 ($j,$f_np1, $f_nm1, $g0, $u, $f)
{
$result = $j*($f_np1 + $f_nm1)-$g0*$u*$f;
return $result;
}
function f3 ($g0, $c0, $fi, $f, $u, $hamma, $p)
{
$result = 0-($g0/$c0)*($fi*$fi+$f*$f)-$u-$hamma*$p;
return $result;
}
function f4 ($p)
{ return $p; }
/* Тут починається тіло скрипта
Параметри, що передаються:
$j, $g0, $c0, - параметри рівнянь
$hamma - коефіцієнт тертя
$dt - крок
$T - кінцевий час, бажано задати цілим
$N - кіль-сть молекул в ланцюжці
$filo – ім’я файла, в який слід записувати результати
Всі ці параметри в даному скрипті є константами
(вводяться з клавіатури у форму soliton.php і передаються цьому файлу)
*/
// Початкові умови
// Обрахунок параметрів рівнянь
$tau = $T;
$dtau = $dt;
//вивід параметрів на екран
print "Параметри:<BR>N=$N, tau=$tau, dtau=$dtau, j=$j, g0=$g0, c0=$c0, hamma=$hamma<BR>";
$xwail=fopen($filo, w);
fputs($xwail, "№ t f^2+fi^2 u(x,t)\n");
$norm = 0;
$nulli = fopen ("0.txt", w);
for ($m=1; $m <= $N; $m++)
//Задаємо початкове збудження для всіх молекул
{
if ($m == $N/2)
$f[$m][0] = 0.8;
if (($m == $N/2+1)||($m == $N/2-1))
$f[$m][0] = 0.4;
if (($m == $N/2+2)||($m == $N/2-2))
$f[$m][0] = sqrt(0.02);
$fi[$m][0] = 0;
$norm += $f[$m][0]*$f[$m][0] + $fi[$m][0]*$fi[$m][0];
$p[$m][0] = 0;
$u[$m][0] = 0;
$fu = $u[$m][0];//Тотожність, зручно записувати у файл
//просто змінну не масива
$fm = $f[$m][0]*$f[$m][0]+$fi[$m][0]*$fi[$m][0];
//Запис $m $t $fm $fu
fputs($xwail, "$m 0 $fm $fu\n");
fputs($nulli, "$m $fm $fu\n");
}
fclose ($nulli);
print "У початковий момент часу норма = $norm<br>";
//Накладаємо періодичні умови, "нульова" молекула тотожня до N-ї
$f[0][0] = $f[$N][0];
$fi[0][0] = $fi[$N][0];
$p[0][0] = $p[$N][0];
$u[0][0] = $u[$N][0];
//Так само вчинимо з молекулою N+1
$f[$N+1][0] = $f[1][0];
$fi[$N+1][0] = $fi[1][0];
$p[$N+1][0] = $p[1][0];
$u[$N+1][0] = $u[1][0];
for ($t=$dtau; $t < $tau+$dtau; $t=$t+$dtau) //Зсув за часом
{
$norm = 0;
$pot = fopen ("$t.txt", w);
for ($m = 1; $m <= $N; $m++) //Пішов обрахунок N молекул
{
//Для молекул рахуємо методом Рунґе-Кутта
//Функції v, w ,y, z стосуються невідомих f, fi, p, u
$tm1 = $t-$dtau;
$mp1 = $m+1;
$mm1 = $m-1;
$v1[$m][$tm1] =
f1($j, $fi[$mp1][$tm1], $fi[$mm1][$tm1], $g0, $u[$m][$tm1], $fi[$m][$tm1]);
$w1[$m][$tm1] =
f2($j, $f[$mp1][$tm1], $f[$mm1][$tm1], $g0,$u[$m][$tm1],$f[$m][$tm1]);
$y1[$m][$tm1] =
f3($g0,$c0, $fi[$m][$tm1], $f[$m][$tm1], $u[$m][$tm1], $hamma, $p[$m][$tm1]);
$z1[$m][$tm1] = f4($p[$m][$tm1]);
$v2[$m][$tm1] = f1($j, $fi[$mp1][$tm1]+$w1[$mp1][$tm1]/2, $fi[$mm1][$tm1]+$w1[$mm1][$tm1]/2, $g0, $u[$m][$tm1]+$z1[$m][$tm1]/2, $fi[$m][$tm1]+$w1[$m][$tm1]/2);
$w2[$m][$tm1] = f2($j, $f[$mp1][$tm1]+$v1[$mp1][$tm1]/2, $f[$mm1][$tm1]+$v1[$mm1][$tm1]/2, $g0, $u[$m][$tm1]+$z1[$m][$tm1]/2, $f[$m][$tm1]+$v1[$m][$tm1]/2);
$y2[$m][$tm1] = f3($g0,$c0, $fi[$m][$tm1]+$w1[$m][$tm1]/2, $f[$m][$tm1]+$v1[$m][$tm1]/2, $u[$m][$tm1]+$z1[$m][$tm1]/2, $hamma, $p[$m][$tm1]+$y1[$m][$tm1]/2);
$z2[$m][$tm1] = f4($p[$m][$tm1]+$y1[$m][$tm1]/2);
$v3[$m][$tm1] = f1($j, $fi[$mp1][$tm1]+$w2[$mp1][$tm1]/2, $fi[$mm1][$tm1]+$w2[$mm1][$tm1]/2, $g0, $u[$m][$tm1]+$z2[$m][$tm1]/2, $fi[$m][$tm1]+$w2[$m][$tm1]/2);
$w3[$m][$tm1] = f2($j, $f[$mp1][$tm1]+$v2[$mp1][$tm1]/2, $f[$mm1][$tm1]+$v2[$mm1][$tm1]/2, $g0, $u[$m][$tm1]+$z2[$m][$tm1]/2, $f[$m][$tm1]+$v2[$m][$tm1]/2);
$y3[$m][$tm1] = f3($g0,$c0, $fi[$m][$tm1]+$w2[$m][$tm1]/2, $f[$m][$tm1]+$v2[$m][$tm1]/2, $u[$m][$tm1]+$z2[$m][$tm1]/2, $hamma, $p[$m][$tm1]+$y2[$m][$tm1]/2);
$z3[$m][$tm1] = f4($p[$m][$tm1]+$y2[$m][$tm1]/2);
$v4[$m][$tm1] = f1($j, $fi[$mp1][$tm1]+$w3[$mp1][$tm1], $fi[$mm1][$tm1]+$w3[$mm1][$tm1], $g0, $u[$m][$tm1]+$z3[$m][$tm1], $fi[$m][$tm1]+$w3[$m][$tm1]);
$w4[$m][$tm1] = f2($j, $f[$mp1][$tm1]+$v3[$mp1][$tm1], $f[$mm1][$tm1]+$v3[$mm1][$tm1], $g0, $u[$m][$tm1]+$z3[$m][$tm1], $f[$m][$tm1]+$v3[$m][$tm1]);
$y4[$m][$tm1] = f3($g0,$c0, $fi[$m][$tm1]+$w3[$m][$tm1], $f[$m][$tm1]+$v3[$m][$tm1], $u[$m][$tm1]+$z3[$m][$tm1], $hamma, $p[$m][$tm1]+$y3[$m][$tm1]);
$z4[$m][$tm1] = f4($p[$m][$tm1]+$y3[$m][$tm1]);
//Маємо результати
$f[$m][$t] = $f[$m][$tm1] + ($dtau/6)*($v1[$m][$tm1] + 2*$v2[$m][$tm1] + 2*$v3[$m][$tm1] + $v4[$m][$tm1]);
$fi[$m][$t] = $fi[$m][$tm1] + ($dtau/6)*($w1[$m][$tm1] + 2*$w2[$m][$tm1] + 2*$w3[$m][$tm1] + $w4[$m][$tm1]);
$p[$m][$t] = $p[$m][$tm1] + ($dtau/6)*($y1[$m][$tm1] + 2*$y2[$m][$tm1] + 2*$y3[$m][$tm1] + $y4[$m][$tm1]);