задачка :)

Bitterman

Новичок
zerkms
Да, согласен, насчет тривиальности я поспешил )). Первое впечатление не всегда бывает верным. Тем не менее, это не отменяет основной мысли поста: такие задачки должны решаться расчетами, а не моделированием, чтобы получить ответ в любом случае.
 

korchasa

LIMB infected
Автор оригинала: Bitterman
zerkms
Да, согласен, насчет тривиальности я поспешил )). Первое впечатление не всегда бывает верным. Тем не менее, это не отменяет основной мысли поста: такие задачки должны решаться расчетами, а не моделированием, чтобы получить ответ в любом случае.
Кому должны? За что должны?
 

korchasa

LIMB infected
Автор оригинала: Bitterman
korchasa
Что ты хочешь услышать в ответ?
Например, условия наступления "не любого" случая ;)

-~{}~ 26.03.08 15:44:

Тьфу! Наступления случая, отличного от моделируемого
 

Bitterman

Новичок
korchasa
Ну, например, скорость равная 0 ))) В условиях же речь идет о любых условиях.
Ну а если более реально подходить к задаче, то если решением будет являться не 2875-я итерация, а сколько-то там миллионная, то решение с помощью моделирования, ИМХО, будет нерациональным.
Кроме того, я говорил задачах, а не только об этой конкретной. То есть, если эта задача, возможно, будет всегда иметь решение с положительными входными данными (лень думать, так это или нет), то другая подобная может выродиться в бесконечный цикл.
Как-то так.
 

korchasa

LIMB infected
Автор оригинала: Bitterman
korchasa
Ну, например, скорость равная 0 ))) В условиях же речь идет о любых условиях.
А тут даже ничего вычислять не надо x = x[i-1] + 0 :)

Ну а если более реально подходить к задаче, то если решением будет являться не 2875-я итерация, а сколько-то там миллионная, то решение с помощью моделирования, ИМХО, будет нерациональным.
Кроме того, я говорил задачах, а не только об этой конкретной. То есть, если эта задача, возможно, будет всегда иметь решение с положительными входными данными (лень думать, так это или нет), то другая подобная может выродиться в бесконечный цикл.
Как-то так.
В общем случае, на больших цифрах вычисления, рулят.

А касаемо этой задачи - мне сложнее было сделать вычисление, чем набросать модель. По ней уже видно что наличие решения от переметров почти не зависит.
 

tashkentchi

Новичок
1я итерация: улитка отползла на 1см, резинка растянулась, равномерно на 5 см, теперь улитка (как материальная точка), также переместилась от края на 5/100, и находится на расстоянии 1.05см от края, а ползти осталось, 103.95см...
Неправда. После первого часа (т.е. вашей итерации) улитка будет находится на расстоянии 1.0245934475581 см. от края.

Ваши итерации дают значительную погрешность. И эта погрешность нарастает с каждой итерацией.

Все таки решил уравнение движения улитки (см. мой первый пост). Вот в явном виде:

PHP:
$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;
Отсюда недалеко до решения задачи.

-~{}~ 26.03.08 21:26:

Плин :( замордовался с вычислениями на четыре листа. Вышеприведенный код ошибочен. Вот правильный (хотя при $f0 = 0 оба работают одинаково):

PHP:
$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;
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
-1
вопрос про самолет на транспортере круче!
 

berkut

Новичок
как здорово математику знать... а что такое:
log(($v1*$t + $g0)/$g0)) / $g0;
 

tashkentchi

Новичок
отношение натурального логарифма отношения суммы произведения 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 > 0; $v2 >0; $g0 > 0; $f0 >= 0; $f0 < $g0.

Это видно из того, что f(0) < g(0), но f(t) растет быстрее, чем g(t) при t->&#8734;

-~{}~ 27.03.08 10:41:

Т.е. оба графика обязаны пересечься при каком-то t

-~{}~ 27.03.08 10:49:

А раз такое дело, и если нет желания явно отыскать t из уравнения f(t)=g(t), то вполне можно приспособить алгоритм половинного деления для решения задачи в общем виде.

-~{}~ 27.03.08 11:56:

PHP:
$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) . ' часов';
-~{}~ 27.03.08 12:03:

Итого: 2948.263 часов
 

berkut

Новичок
отношение натурального логарифма отношения суммы произведения v1*t и g0 к g0 к g0
Так понятнее?
о да, теперь всё стало на свои места!!;) я говорил про формулу - так сказать откуда она и чё значит. ну да ладно
 

crocodile2u

http://vbolshov.org.ru
Я, может быть, пропустил что-то, сорри, если так... но: что будет с кодом korchasa при отрицательных значениях скорости улитки и положительных - скорости растягивания?
 

Tarakan

Новичок
вы жжоте!
итак, свисает резинка и по ней вниз ползет улитка (если бы ползла вверх - резинка сокращалась бы)
следовательно, резинка растягивается за улиткой и нам невожно на сколько см.
т.о. улитко доползет до конца за 100 часов
 

baev

‹°°¬•
Команда форума
Tarakan, судя по Вашему нику, Вы при всём этом присутствовали?
 

zerkms

TDD infected
Команда форума
tashkentchi
а расскажи логику составления зависимости f(t)
просто получается что вне зависимости от отношения скорости приращения резинки к скорости улитки предел f(t) - g(t) при t->бесконечность будет > 0, т.е. улитка доползёт при любых начальных условиях, что, имхо, неправда :)
 
Сверху