Кому должны? За что должны?Автор оригинала: Bitterman
zerkms
Да, согласен, насчет тривиальности я поспешил )). Первое впечатление не всегда бывает верным. Тем не менее, это не отменяет основной мысли поста: такие задачки должны решаться расчетами, а не моделированием, чтобы получить ответ в любом случае.
Например, условия наступления "не любого" случаяАвтор оригинала: Bitterman
korchasa
Что ты хочешь услышать в ответ?
А тут даже ничего вычислять не надо x = x[i-1] + 0Автор оригинала: Bitterman
korchasa
Ну, например, скорость равная 0 ))) В условиях же речь идет о любых условиях.
В общем случае, на больших цифрах вычисления, рулят.Ну а если более реально подходить к задаче, то если решением будет являться не 2875-я итерация, а сколько-то там миллионная, то решение с помощью моделирования, ИМХО, будет нерациональным.
Кроме того, я говорил задачах, а не только об этой конкретной. То есть, если эта задача, возможно, будет всегда иметь решение с положительными входными данными (лень думать, так это или нет), то другая подобная может выродиться в бесконечный цикл.
Как-то так.
Неправда. После первого часа (т.е. вашей итерации) улитка будет находится на расстоянии 1.0245934475581 см. от края.1я итерация: улитка отползла на 1см, резинка растянулась, равномерно на 5 см, теперь улитка (как материальная точка), также переместилась от края на 5/100, и находится на расстоянии 1.05см от края, а ползти осталось, 103.95см...
$t = 1; // время в часах
$v1 = 5; // скорость растяжения резинки (см/ч)
$v2 = 1; // скорость улитки (см/ч)
$g0 = 100; // первоначальная длина резинки (см)
$f0 = 0; // первоначальная координата улитки (см)
// Длина резинки
$g = $g0 + $v1 * $t;
// Расстояние, которое проползла улитка
$f = ($v1*$t + $g0) * ($f0 + ($v1*$f0 - $v2*$g0) * log($g0/($v1*$t + $g0)) / $v1) / $g0;
$t = 1; // время в часах
$v1 = 5; // скорость растяжения резинки (см/ч)
$v2 = 1; // скорость улитки (см/ч)
$g0 = 100; // первоначальная длина резинки (см)
$f0 = 90; // первоначальная координата улитки (см)
// Длина резинки
$g = $g0 + $v1 * $t;
// Расстояние, которое проползла улитка
$f = ($v1*$t + $g0) * ($f0 + $g0* ($v2 / $v1) * log(($v1*$t + $g0)/$g0)) / $g0;
g(t) = g0 + v1 * t
f(t) = f0 + v2 * t + v1 * \int_0^t \frac{f(s)}{g(s)} ds
$v1 = 5; // скорость растяжения резинки (см/ч)
$v2 = 1; // скорость улитки (см/ч)
$g0 = 100; // первоначальная длина резинки (см)
$f0 = 0; // первоначальная координата улитки (см)
/*
Длина резинки в момент времени $t:
$g = $g0 + $v1 * $t;
Расстояние, которое проползла улитка к моменту времени $t:
$f = ($v1*$t + $g0) * ($f0 + $g0* ($v2 / $v1) * log(($v1*$t + $g0)/$g0)) / $g0;
*/
// Возвращает часы, которые понадобятся улитке, чтобы "перегнать" резинку.
function snailForward($v1 = 5, $v2 = 1, $g0 = 100, $f0 = 0)
{
$v1 = (float) $v1;
$v2 = (float) $v2;
$g0 = (float) $g0;
$f0 = (float) $f0;
if ($v1 <= 0 || $v2 <= 0 || $f0 < 0 || $g0 < $f0) {
return null;
}
$begin = 0;
$end = 0;
$admission = 0.0001; // точность, с которой будет вычисляться время
do {
$begin = $end;
$end = $begin ? $begin * 2 : 1;
$g = $g0 + $v1 * $end;
$f = ($v1*$end + $g0) * ($f0 + $g0* ($v2 / $v1) * log(($v1*$end + $g0)/$g0)) / $g0;
} while ($f < $g);
while ($end - $begin > $admission) {
$middle = ($end + $begin) / 2;
$g = $g0 + $v1 * $middle;
$f = ($v1*$middle + $g0) * ($f0 + $g0* ($v2 / $v1) * log(($v1*$middle + $g0)/$g0)) / $g0;
if ($f >= $g) {
$end = $middle;
} else {
$begin = $middle;
}
}
return $end;
}
echo snailForward($v1, $v2, $g0, $f0) . ' часов';
о да, теперь всё стало на свои места!!отношение натурального логарифма отношения суммы произведения v1*t и g0 к g0 к g0
Так понятнее?