Здравствуйте, SlaVVVa, Вы писали:
SVV>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>Логически: SVV>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
Через время t резинка станет длиной 1+t. Паучок ползет с постоянной скоростью 0.1 м/с относительной резинки.
Давайте резинку не растягивать, а скажем, что просто паучок ползет со скоростью .1/(1+t) относительно значальной резинки. Действительно, проползти s относительно растянутой резинки длиной 1+t то же самое, что проползти s/(1+t) относительно изначальной нерастянутой резинки длины 1.
Тогда в момент t скорость .1/(1+t), надо проползти 1. 1 = int[0,t](.1/(1+s))ds=.1*ln(1+t), т.е. догонит за exp(10)-1 секунд = 22025.465794806716516957900645284 секунд = 6 часов 7 минут 5.5 секунд.
Здравствуйте, SlaVVVa, Вы писали: SVV>Логически: SVV>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
Да, вроде, за пять минут можно решить в лоб, если помнить дифуры.
v — скорость паучка, V — человека, L — длина веревки.
Для паучка:
x' = x/(Vt+L)*V + v или x'(Vt+L) — xV = v(Vt+L)
x(0) = 0
Это стандартный дифур, интегрирующий множитель 1/(Vt+L)
Получаем x(t) = (Vt+L)ln(Vt+L)v/V + C.
C = — L*ln(L)v/V.
Осталось подставить в условие встречи: VT+L = (VT+L)*ln(VT+L)v/V — L*ln(L)v/V
числа из условия: (T+1) = (T+1)ln(T+1)*0.1 или T = e^10-1
Потребуется где-то часов 6.
Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с.
Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
Логически:
Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
Здравствуйте, SlaVVVa, Вы писали:
SVV>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
Удобнее привязать систему координат к человеку.
То есть, переформулировать задачу так:
Резинку держат двое. Один стоит на месте, а второй (вместе со стенкой) начинает отходить.
Паучок стартует со второго к первому.
В этом случае очевидно, что паучок дойдёт.
Пусть он разделяет резинку x+y на части: x до первого и y до второго, в пропорции r=y:x
Если бы он стоял на месте, то пропорция сохранялась бы. А он движется, постепенно меняя её.
x' = v*x/(x+y) — s
y' = v*y/(x+y) + s
Дальше надо решать дифур... Он, вроде бы, простой, но влом.
C>А как учитывается расстояние которое паук уже прошел т/е прошел он 2 метра и движется со скоростью 10 * на растяжение C>то итоговое расстояние будет 2 метра * растяжение + 10 умноженное на растяжение C>т/е влияет и количество пути которое прошел паук
В том-то и дело, что в таком подходе это неважно. Через время t человек уйдет на расстояние t, т.е. резинка растянется на расстояние 1+t равномерно. В этот момент паук, проползающий за бесконечно малое время dt расстояние ds=0.1dt по растянутой резинке, проползает расстояние ds/(1+t) по нерастянутой. Т.е. если Вы ему дадите проползти по ней это расстояние, а потом отпустите резинку в исходное положение, то окажется, что он прополз ds/(1+t). Т.е. его мгновенная скорость в момент времени t, выраженная в метрах нерастянутой резинки, равна ds/(1+t)/dt = 0.1/(1+t). Вот, собственно и вся идея. Ему надо проползти 1 метр нерастянутой резинки, а его скорость в момент времени t равна 0.1/(1+t) метров нерастянутой резинки в секунду. Надеюсь, понятно объяснил.
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали:
C>>Здравствуйте, andyJB, Вы писали:
JB>>>Здравствуйте, codelord, Вы писали:
C>>>>вот как раз таки должно C>>>>резина за пауком по вашему не растягивается ? JB>>>Все, что нужно учесть, учтено в первой строке. Впрочем, это вопрос сходимости приближения снизу или сверху. Но прежде чем обсуждать программу, в ней НЕОБХОДИМО сделать прирост t не 1 секунду, а хотя бы 0.001 секунды. В текущем виде она выдает полную чушь. C>>Не зарывайся с выражениями, JB>Учись, студент, а то так и будешь всю жизнь инструметы подавать. Нашел я багу в твоей корявой программке: в get_cof написано JB>
( time + 1 ) / time
JB>а должно быть JB>
( time + 2 ) / (time+1)
JB>потому, что это на самом деле (100 + (time+1)*100) / (100 + time*100). C>>Я так и не увидел тех 100 шагов которые просил от тебя, JB>Я уже писал временной интервал 1с — это плюс-минус километр. JB>Кстати, вот тебе, втыкай свою программу, приведенную в более пристойный вид с нормальным временным шагом: JB>
JB>#include <iostream>
JB>#include <math.h>
JB>using namespace std;
JB>using namespace std;
JB>int main( int argc, char **argv )
JB>{
JB> double dt = 1e-3;
JB> double x = 0;
JB> for( double t = dt; t < 100000 ; )
JB> {
JB> double coef = (1+t+dt)/(1+t);//there was an error: (t+dt)/t;
JB> x = (x + 10.0*dt) * coef;
JB> t += dt;
JB> double X = 100.0 + t * 100.0;
JB> //cout <<" Moskitos = " << x << " cm, " << "Man = " << X << "cm " << endl;
JB> if ( X < x )
JB> {
JB> cout.width( 20 );
JB> cout <<"___________________________________________" << endl;
JB> cout << "TIME WAS = " << t << endl;
JB> cout << "MOSKITOS = " << x << " cm; ";
JB> cout << ", MAN = " << X << " cm; " << endl;
JB> cout <<"___________________________________________" << endl;
JB> break;
JB> }
JB> }
JB> return 0;
JB>}
JB>
C>>а сколько секунд выставлять разберусь без тебя, JB>Не разберешься. Уже очевидно. C>>По поводу чуши надо обосновывать а не раскидываться словами показывая свою полную несостоятельность. JB>Я лишь констатирую факт. Я не часто встречаю такой оригинальный способ выражения простых вещей. Не удивительно, что в программе была ошибка.
Ты хоть пробовал вывести первые числа которые получаются на твоей переделке ???
я бы сказал полный бред, получается что за первую секунду паук осилит только 3.84 сантиметра
так что лучше не переделывай больше ничего и иди ка ты сам поучись товарисчь "мастер" хочется добавить #ев
но не стану. Неужели понимание до тебя так никогда и не дойдет? ??
Здравствуйте, SlaVVVa, Вы писали:
SVV>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>Логически: SVV>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
Кажется до меня дошло, в чем суть разногласий, и откуда берутся другие результаты (полученные программным путем). Во всем виноваты растяжение и бесконечно малые.
Сначала теория, потом программа и тесты.
Итак, как я сказал до этого, паук, находясь в точке x за следующие dt секунд пробежит ds=.1dt метров. В моем подходе то, что та точка, с которой он стартовал, тоже за это время уедет, неважно, так как я измеряю все относительно резинки. Тем не менее остается вопрос о том, что то расстояние, которое должен пробежать за это время паук, тоже растянется. Весь вопрос в том, "задними или передними лапками" он цепляется за резинку. Действительно, пока он бежит свои ds, это самое ds также растянется. На сколько -- это вопрос того, на сколько резинка уже растянута, однако я берусь показать, что даже если паук "цепляется передними лапками" и, как следствие, пробегает растянутые ds, это дает лишь поправку второго порядка, которая на ответ не влияет.
Итак, если к моменту t резинка растянута до 1+t, то через dt она станет длиной 1+t+dt. Т.е. растянется в coef=(1+dt/(1+t)) раз. Далее, паук за это время пробегает ds, которые растягиваются в coef раз. Если он бежит "на задних лапах", то пробежит по резинке ds, "на пережних" -- ds*coef. Это можно понимать и так: либо мы растягиваем сначала резинку, а затем он бежит по ней ds, либо он сначала бежит ds, а мы затем растягиваем ее, т.е. получается, что он пробежал растянутые ds, т.е. ds*coef. На практике оба процесса в течении dt происходят одновременно, поэтому он пробежит сколько-то между ds и ds*coef. В своей программе я ввел alpha, которое учитывает в какой степени надо принимать растяжение, пока он бежит ds: alpha=0 -- не надо, т.е. пробежит ds, alpha=1 -- надо "по полной", т.е. пробежит ds*coef, промежуточные значения также допустимы.
Самое интересное, что с точки зрения теории нам учет растяжения расстояния ds ничего не дает! Дейтсивтельно, скорость будет определяться как ds*coef/dt = .1*(1+dt/(1+t)). Т.е. в силу того, что поправка на растяжение добавляет максимум ds*dt/(1+t) к расстоянию ds, т.е. величину заведомо меньшего порядка малости, такая поправка не влияет на величину мгновенной скорости в этой точке.
ОДНАКО, при написании программы, ошибкой было бы положить dt заданной какой-то, пусть малой, но все же конечной величиной, ибо здесь уже бесконечно малые второго порядка начинают играть свою роль.
Итак, программа написана, текст ее в самом конце, я ее запущу несколько раз: c alpha=0 (т.е. без учета растяжения ds) и различными dt, а также с alpha=1 (с полным учетом растяжения) и различными dt. ПРОГРАММА НАПИСАНА С ОБЫЧНЫМ ПОДХОДОМ, А НЕ С МОИМ ТЕОРЕТИЧЕСКИМ, Т.Е. НЕ В МЕТРАХ НЕРАСТЯНУТОЙ РЕЗИНКИ, А В ОБЫЧНОЙ СИСТЕМЕ КООРДИНАТ, С ТЕМ, ЧТОБЫ СТОРОННИКИ ПРОСТОГО ПРОГРАММНОГО ПОДХОДА МОГЛИ УБЕДИТЬСЯ, ЧТО НИКАКИХ "ТЕОРЕТИЧЕСКИХ ТРЮКОВ" ЗДЕСЬ НЕТ.
Разумеется, при полном учете растяжения при конечных dt время получается меньше, так как величины второго порядка играют роль. Однако при уменьшении dt все сходится куда надо.
codelord: Обратите также внимание на Ваш "результат" 12367 секунд, когда я принял во внимание растяжение ds по полной (alpha=1) и положил dt=1! Думаю, это ключ. Прочитайте еще раз мой теоретический подход в другом сообщении и подумайте немного. Там все правильно.
Программа:
#include <iostream>
using namespace std;
// The state of the World!struct CState {
double rubberlen;
double bugx;
double manspeed;
double bugspeed;
double rubberlen0;
CState(): rubberlen(1.), bugx(0.), manspeed(1.), bugspeed(.1), rubberlen0(rubberlen) { }
Reset() { rubberlen = rubberlen0; bugx = 0.; }
};
// calculates a new state of the world based on the current state cur,
// alpha, which is the coefficient of the influence of rubber stretching,
// and dt -- small time period,
// alpha=0 -- take into account bug's speed only + the movement of the initial position
// alpha=1 -- take into account the movement of the final position as well
// Returns 1 if the man was caught, o/w returns 0
// Before: bugx=1., rubberlen = 2., dt = .01
// After: new rubber length = 2. + 1. * .01 = 2.01, stretch coefficient = 2.01/2. = 1.005,
// the distance the bug made: ds = .1 * .01 = .001,
// the movement of the start position (due to stretch): from bugx=1. to 1. * 1.005 = 1.005,
// the movement of the final position (due to stretch): from bugx+ds=1.001 to 1.001 * 1.005 = 1.006005,
// if alpha = 0., then new position = start position + ds = 1.005 + .001 = 1.006,
// if alpha = 1., then new position = final position = 1.006005
// if alpha between 0 and 1, then new position is calculated as an weighted sum of those two aboveint move(CState & cur, double alpha, double dt) {
double ds = cur.bugspeed * dt;
double coef = 1 + cur.manspeed * dt / cur.rubberlen;
double startx = cur.bugx * coef; // where is the start due to stretchingdouble finishx = (cur.bugx + ds) * coef; // where is the finish due to stretchingdouble x0 = startx + ds; // if the stretch of the distance is not taken into accountdouble x1 = finishx; // otherwise, i.e. if it is taken
cur.bugx = x0 + alpha * (x1 - x0);
cur.rubberlen += cur.manspeed * dt;
return (cur.bugx >= cur.rubberlen);
}
// prints the statevoid print(CState cur) {
cout << "Man: " << cur.rubberlen << "\tBug: " << cur.bugx << '\n';
}
int main() {
CState state;
for (double alpha = 0.0; alpha <= 1.0; alpha += 1.0) {
cout << "alpha = " << alpha << '\n';
for (double dt = 1; dt >= 0.001; dt /= 10.) {
cout << "dt = " << dt << '\n';
int cou = 0;
while(!move(state, alpha, dt)) {
if (++cou <= 3) print(state);
}
cout << "Caught at manx = " << state.rubberlen << ", bugx = " << state.bugx
<< " after " << (state.rubberlen - state.rubberlen0) / state.manspeed << " secs\n";
state.Reset();
}
}
}
Здравствуйте, SlaVVVa, Вы писали:
SVV>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
Я всё понимаю, но о чём тут дамал целых 5 минут Сахаров?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, SlaVVVa, Вы писали:
SVV>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
Не обязательно. Это может происходить бесконечно. Все зависит от чисел в условии.
Здравствуйте, SlaVVVa, Вы писали:
SVV>Объясните как может объект движущийся с ускорением не догнать движущийся равномерно. По моему от чисел в условии зависит только время, которое для этого потребуется.
Все просто. Когда ускорение отрицательное и стремится к нулю слева при времени, стремящемся к бесконечности.
Общеизвестный пример: каждую секунду вы проходите половину оставшегося пути.
Здравствуйте, codelord, Вы писали:
C>ошибся будет 12357 секунд ( перепутал местами вызов ф-ии ) C>вот так верно : C>логика решения такая резинка у нас растягивается и соответственно C>оказывает влияние на пройденное предыдущее растояние и на расстояние которое C>в данный момент преодолевает паук, т/е C>если в первую секунду C>паук продвинулся на 10 см + 10 сантиметров дала резинка т/к она увеличилась ровно в два раза с 1 метра до 2 C>в следующую секунду на те 20 сантиметров которые паук преодолел резинка оказывает влияние уже меньшее C>т/к резинка растягивается с 2 до 3 , за это же время паук преодолевает свои 10 см и на него оказывает влияние C>тот же коэффициент, далее как выше то что мы прошли за предыдущую функцию умножаем на коэфф и прибавляем скорость паука C>на тот же самый коэффициент растяжения резинки, в решении ниже может где ошибся но логика думаю понятна. C>
C>#include <iostream>
C>#include <math.h>
C>using namespace std;
C>double absolute( double x ) {
C> return (( x >= 0.0 ) ? x : x*(-1) );
C> }
C>double get_cof( double time ) {
C> if( time ==1 ) return 1;
C> double rettime = ( time + 1 ) / time;
C> return rettime;
C> }
C>double get_disnow( double time, double speed ) {
C> double disnow = get_cof( time ) * speed;
C> return disnow;
C> }
C>double get_distance( double time, double speed ) {
C> if( time ==1 ) return 20;
C> double distance = get_disnow( time, speed );
C> return distance;
C> }
C>using namespace std;
C>int main( int argc, char **argv ) {
C> double x = 20.0;
C> for( double t = 2.0; t < 20000 ;t+=1 )
C> {
C> x *= get_cof( t );
C> x += get_distance( t, 10.0 );
C> if( (absolute( x - (t * 100 ) ) < 10) )
C> {
C> cout << " hallelua time = " << t << endl;
C> cout << " Moskitos = " << x << " cm; ";
C> cout << ", Man = " << t * 100 << " cm; " << endl;
C> }
C> }
C> return 0;
C> }
C>
красиво, ничего не скажешь
if( time ==1 ) return 20; — это что?
Здравствуйте, SlaVVVa, Вы писали:
SVV>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>Логически: SVV>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
Хмм мне кажется вы все-таки ошиблись или в формулировке задачи или в вашем логическом решении.
Мне кажется что ситуация будет развиваться примерно так:
За каждую секунду включая первую ( в первую секунду увеличение длины пути паучка будет 0)путь паука по резинке будет удлиняться на 1 метр ( скорость человека с резинкой), при этом паучок будет продвигаться на 0.1 метра по резинке. Скорость паука по резинке — постоянная, но длина все время увеличивается. Т.к. резинка растягивается равномерно, то получается что паучок будет замедлять свою скорость движения относительно резинки (ускорение сообщаемое резинкой будет со временем стремиться к нулю) .
Поясню: Введем яркие отметки на резинке на расстоянии 0.1 м.
после первой секунды расстояние между отметками станет 20 см, т.к. резинка растягивается равномерно (для упрощения — представим что паучок за первую секунду все-таки добежал до первой 10см отметки, хотя с учетом растяжения — это не так).
После первой секунды паучок находится на первой отметке, но расстояние между отметками уже 20 см. Таким образом чтобы добежать до второй отметки ему понадобится уже 2 секунды при условии что человек остановится. Но человек не останавливается. И после второй секунды паучок оказывается на расстоянии 10+ х (где х — небольшое расстояние на которое его протянула растягивающаяся резинка, ). При этом расстояние до второй отметки уже 30 см, а паук находится на расстоянии всего лишь максимум на расстоянии 10+5 (причем х < 5 (тут могу соврать мб даже 3), из-за непрерывности растяжения и движения, причем даже если взять "дискретные" величины, например за 0.1 секунды паучок мгновенно продвигается на 1 см, а потом только резинка растягивается дискретно, уже продвигая паука на какое-то растояние, то выигрыш небольшой). Теперь перед паук находится посередине второго "10-сантиметрового" отрезка и до второй отметки ему ползти уже ~15 см. Путь который помогла пройти резинка ~5 см (при этом она удлинилась на 1 метр)
после третьей секунды он находится на расстоянии ~35см от первой отметки+ резинка помогла ему пройти ~3 см ( потому что она увеличилась не в 1.5 раза как во вторую секунду (с 20 см до 30), а всего лишь в 1 1/3 — c 30 до 40). Таким образом дополнительное расстояние пройденное пауком с помощью резинки уменьшается ( а вы утверждаете что приращение растет, что неверно). Итак перед пауком расстояние до второй резинки — 2 см. (правда до 3ей и всех остальных уже 40 . Таким образом дополнительное ускорение которое сообщает резинка — уменьшается. После определенного порога времени оно будет пренебрежительно мало по сравнению с расстоянием пробегаемым пауком, и им можно будет пренебречь. В итоге мы получаем систему (относительно неподвижного наблюдателя) в которой 2 объекта движутся со равномерной скоростью, один из них (первый) — 1 м/с, второй 0.1 м/c. Даже если на момент "перенебрежения" ускорением растояние между ними было 10 см (что оооочень далеко от истины), то второй объект никогда не догонит первого.
Never argue with an Idiot.He'll drag you down to his level and then beat you with experience.
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали:
C>>вот как раз таки должно C>>резина за пауком по вашему не растягивается ? JB>Все, что нужно учесть, учтено в первой строке. Впрочем, это вопрос сходимости приближения снизу или сверху. Но прежде чем обсуждать программу, в ней НЕОБХОДИМО сделать прирост t не 1 секунду, а хотя бы 0.001 секунды. В текущем виде она выдает полную чушь.
Не зарывайся с выражениями,
Я так и не увидел тех 100 шагов которые просил от тебя,
а сколько секунд выставлять разберусь без тебя,
По поводу чуши надо обосновывать а не раскидываться словами показывая свою полную несостоятельность.
Здравствуйте, andyJB, Вы писали:
C>>Этюд то в общем-то простой, странно что так массово все пошли по пути — "догонит" и начали считать время :D JB>Анекдот в тему: JB>- Алле, дорогой, будь осторожнее на дороге — по радио передали, что какой-то козел уже полчаса едет по центральному проспекту по встречке. JB>- Да тут таких козлов сотни! JB>Небольшой хинт: минут через пять после начала движения скорость паучка превысит 1м/с, и он начнет догонять человека.
Я разве писал что не догонит????
Если уменьшить приращение и сделать его меньше чем 1 секунда то
паук его догонит еще быстрее.
Для примера сейчас сделаю адаптацию программы для приращения 0.001 сек
но это ты похоже не слышишь меня и не хочешь показать свои цифры шагов ???
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали:
C>>Здравствуйте, andyJB, Вы писали:
JB>>>Здравствуйте, codelord, Вы писали:
C>>>>вот как раз таки должно C>>>>резина за пауком по вашему не растягивается ? JB>>>Все, что нужно учесть, учтено в первой строке. Впрочем, это вопрос сходимости приближения снизу или сверху. Но прежде чем обсуждать программу, в ней НЕОБХОДИМО сделать прирост t не 1 секунду, а хотя бы 0.001 секунды. В текущем виде она выдает полную чушь. C>>Не зарывайся с выражениями, JB>Учись, студент, а то так и будешь всю жизнь инструметы подавать. Нашел я багу в твоей корявой программке: в get_cof написано JB>
( time + 1 ) / time
JB>а должно быть JB>
( time + 2 ) / (time+1)
JB>потому, что это на самом деле (100 + (time+1)*100) / (100 + time*100). C>>Я так и не увидел тех 100 шагов которые просил от тебя, JB>Я уже писал временной интервал 1с — это плюс-минус километр. JB>Кстати, вот тебе, втыкай свою программу, приведенную в более пристойный вид с нормальным временным шагом: JB>
JB>#include <iostream>
JB>#include <math.h>
JB>using namespace std;
JB>using namespace std;
JB>int main( int argc, char **argv )
JB>{
JB> double dt = 1e-3;
JB> double x = 0;
JB> for( double t = dt; t < 100000 ; )
JB> {
JB> double coef = (1+t+dt)/(1+t);//there was an error: (t+dt)/t;
JB> x = (x + 10.0*dt) * coef;
JB> t += dt;
JB> double X = 100.0 + t * 100.0;
JB> //cout <<" Moskitos = " << x << " cm, " << "Man = " << X << "cm " << endl;
JB> if ( X < x )
JB> {
JB> cout.width( 20 );
JB> cout <<"___________________________________________" << endl;
JB> cout << "TIME WAS = " << t << endl;
JB> cout << "MOSKITOS = " << x << " cm; ";
JB> cout << ", MAN = " << X << " cm; " << endl;
JB> cout <<"___________________________________________" << endl;
JB> break;
JB> }
JB> }
JB> return 0;
JB>}
JB>
C>>а сколько секунд выставлять разберусь без тебя, JB>Не разберешься. Уже очевидно. C>>По поводу чуши надо обосновывать а не раскидываться словами показывая свою полную несостоятельность. JB>Я лишь констатирую факт. Я не часто встречаю такой оригинальный способ выражения простых вещей. Не удивительно, что в программе была ошибка.
не смеши "мастер" ты ужасен
по поводу что ты так часто видишь, ты просто видимо очень далек от понимания этого
неправильно ты переделал дружок понимаешь или не понимаешь блин
возьми карандаш и отойди от компьютера ты до него не дорос еще
и еще раз подумай что происходит с резиной.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
E>Я всё понимаю, но о чём тут дамал целых 5 минут Сахаров?
А где там сказано, что он думал пять минут? Он не думал, а аккуратно записывал решение. На бумажной салфетке полминуты надо только на то, чтобы ручку расписать.
Обозначения:
L — длина резинки
t — время после начала процесса
V — скорость паука
U — скорость человека
T — время, когда паук догонит человека
Представим, что длина резинки постояння и "равна" 1. То есть резинка является нашей системой координат, которая будет сужвться со временем. Тогда скорость паука непостоянна. Она равна V/(L+Ut). Тогда ответом будет решение уравнения: [интеграл от 0 до T](V*dt/(L+Ut)) = 1
Здравствуйте, Спильный Андрей, Вы писали:
СА>Здравствуйте, Pro100Oleh, Вы писали:
PO>>Тогда ответом будет решение уравнения:
СА>~5.5часов
за это время паучек протопает 2 км.
а человек 20 км
резинка провиснет и паучек дальше пойдет по земле.
никогда не дойдет, потому что он собъется с пути.
Здравствуйте, Pro100Oleh, Вы писали:
SVV>>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время? PO>Не обязательно. Это может происходить бесконечно. Все зависит от чисел в условии.
Объясните как может объект движущийся с ускорением не догнать движущийся равномерно. По моему от чисел в условии зависит только время, которое для этого потребуется.
Здравствуйте, SlaVVVa, Вы писали:
SVV>Объясните как может объект движущийся с ускорением не догнать движущийся равномерно.
Может, если двойной интеграл от ускорения (расстояние, пройденное ускоряющимся телом) на всей области определения меньше, чем интеграл от скорости (расстояние, пройденное равномерно движущимся телом). Ведь из условия не очевидно, что движение паучка равноускоренное.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, SlaVVVa, Вы писали:
SVV>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>Логически: SVV>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
короче таракану тьфу пауку потребуется
6480 секунд чтобы заползти на руку тянущего резину
#include <iostream>
#include <math.h>
using namespace std;
double absolute( double x ) {
return (( x >= 0.0 ) ? x : x*(-1) );
}
double get_cof( double time ) {
if( time ==1 ) return 1;
double rettime = ( time + 1 ) / time;
return rettime;
}
double get_disnow( double time, double speed ) {
double disnow = get_cof( time ) * speed;
return disnow;
}
double get_distance( double time, double speed ) {
if( time ==1 ) return 20;
double distance = get_disnow( time, speed );
return distance;
}
using namespace std;
int main( int argc, char **argv ) {
double x = 0.0;
for( double t = 1.0; t < 10000 ;t+=1 )
{
x += get_distance( t, 10.0 );
x *= get_cof( t );
if( (absolute( x - (t * 100 ) ) < 5) || t == 6480 )
{
cout << " hallelua time = " << t << endl;
cout << " Moskitos = " << x << " cm; ";
cout << ", Man = " << t * 100 << " cm; " << endl;
}
}
return 0;
}
ошибся будет 12357 секунд ( перепутал местами вызов ф-ии )
вот так верно :
логика решения такая резинка у нас растягивается и соответственно
оказывает влияние на пройденное предыдущее растояние и на расстояние которое
в данный момент преодолевает паук, т/е
если в первую секунду
паук продвинулся на 10 см + 10 сантиметров дала резинка т/к она увеличилась ровно в два раза с 1 метра до 2
в следующую секунду на те 20 сантиметров которые паук преодолел резинка оказывает влияние уже меньшее
т/к резинка растягивается с 2 до 3 , за это же время паук преодолевает свои 10 см и на него оказывает влияние
тот же коэффициент, далее как выше то что мы прошли за предыдущую функцию умножаем на коэфф и прибавляем скорость паука
на тот же самый коэффициент растяжения резинки, в решении ниже может где ошибся но логика думаю понятна.
#include <iostream>
#include <math.h>
using namespace std;
double absolute( double x ) {
return (( x >= 0.0 ) ? x : x*(-1) );
}
double get_cof( double time ) {
if( time ==1 ) return 1;
double rettime = ( time + 1 ) / time;
return rettime;
}
double get_disnow( double time, double speed ) {
double disnow = get_cof( time ) * speed;
return disnow;
}
double get_distance( double time, double speed ) {
if( time ==1 ) return 20;
double distance = get_disnow( time, speed );
return distance;
}
using namespace std;
int main( int argc, char **argv ) {
double x = 20.0;
for( double t = 2.0; t < 20000 ;t+=1 )
{
x *= get_cof( t );
x += get_distance( t, 10.0 );
if( (absolute( x - (t * 100 ) ) < 10) )
{
cout << " hallelua time = " << t << endl;
cout << " Moskitos = " << x << " cm; ";
cout << ", Man = " << t * 100 << " cm; " << endl;
}
}
return 0;
}
Здравствуйте, SlaVVVa, Вы писали:
SVV>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
Что-то мне кажется, что если решать "в лоб", то все сводится к дифференциальному уравнению.
Идея с фиксацией длины резинки и "замедлением" времени для паучка мне нравится, только еще не понял, как к ней подступиться.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>>Логически: SVV>>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
V>Через время t резинка станет длиной 1+t. Паучок ползет с постоянной скоростью 0.1 м/с относительной резинки. V>Давайте резинку не растягивать, а скажем, что просто паучок ползет со скоростью .1/(1+t) относительно значальной резинки. Действительно, проползти s относительно растянутой резинки длиной 1+t то же самое, что проползти s/(1+t) относительно изначальной нерастянутой резинки длины 1. V>Тогда в момент t скорость .1/(1+t), надо проползти 1. 1 = int[0,t](.1/(1+s))ds=.1*ln(1+t), т.е. догонит за exp(10)-1 секунд = 22025.465794806716516957900645284 секунд = 6 часов 7 минут 5.5 секунд.
А как учитывается расстояние которое паук уже прошел т/е прошел он 2 метра и движется со скоростью 10 * на растяжение
то итоговое расстояние будет 2 метра * растяжение + 10 умноженное на растяжение
т/е влияет и количество пути которое прошел паук
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, SlaVVVa, Вы писали: SVV>>Логически: SVV>>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время? JB>Да, вроде, за пять минут можно решить в лоб, если помнить дифуры. JB>v — скорость паучка, V — человека, L — длина веревки. JB>Для паучка: JB>x' = x/(Vt+L)*V + v или x'(Vt+L) — xV = v(Vt+L) JB>x(0) = 0 JB>Это стандартный дифур, интегрирующий множитель 1/(Vt+L) JB>Получаем x(t) = (Vt+L)ln(Vt+L)v/V + C. JB>C = — L*ln(L)v/V. JB>Осталось подставить в условие встречи: VT+L = (VT+L)*ln(VT+L)v/V — L*ln(L)v/V JB>числа из условия: (T+1) = (T+1)ln(T+1)*0.1 или T = e^10-1 JB>Потребуется где-то часов 6.
Не выходит шесть часов
~3 часа 26 мин получается
можете попробовать проверить эмпирически
не верное решение видимо у вас.
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, Seon, Вы писали: S>>красиво, ничего не скажешь S>>if( time ==1 ) return 20; — это что?
C>это растояние паук преодолел за первую секунду, C>может и не красиво но я собственно к этому и не стремился
так, это условие у тебя никогда не выполняется, поэтому не нужно. да и вообще оно не надо.
double Lp = 0.0;
double Lr = 1.0;
double Vp = 0.1;
double Vm = 1.0;
double dt = 0.01;
int t = 1;
while (Lp < Lr)
{
Lp = (Lr + Vm * dt) * (Lp / Lr);
Lp += Vp * dt;
Lr += Vm * dt;
printf("T=%d Lp=%f Lf=%f\n", t, Lp, Lr);
t++;
}
printf("T=%d\n", int(t * dt));
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, andyJB, Вы писали:
C>Не выходит шесть часов C>~3 часа 26 мин получается
Кто-то бегал? C>можете попробовать проверить эмпирически
Что именно? Формулу скорости? Простите, но поверю себе на слово.
Я неправильно решил дифур? Тоже не верю. Такая вот, например, программа со мной полностью согласна:
class Program
{
public static void Main()
{
const double dt = 1e-5;
double t = 0;
for (double x = 0, X = 1; X - x > 1e-8; t += dt)
{
if (t > 1e+10) throw new System.OverflowException();
const double V = 1.0;
double v = 0.1 + V*x/X;
X += V*dt;
x += v*dt;
}
System.Console.WriteLine("T={0}", t);
}
}
C>не верное решение видимо у вас.
Ключевое слово — видимо.
Здравствуйте, codelord, Вы писали:
C>Не выходит шесть часов C>не верное решение видимо у вас.
если вы внимательно прочитаете эту ветку сначала, то заметите, что первый численный результат мой — 5,5часов — просто мне не интересно было запускать калькулятор и считать e^10, поэтому прикинул "на глаз" 2,7^10...и он не последний в этой ветке...так что может ошиПка все таки у вас?
Здравствуйте, Pro100Oleh, Вы писали:
PO>Здравствуйте, centur, Вы писали:
PO>много букв, ниасилил
Наверное поэтому и догоняет у вас паучок человека.
Вообще попробуйте начать асиливать учебники, например "Русский язык, 3-ий класс", потом можно взяться за "Математику", класс тот же.
Как дойдете до понимания и решения проблем, что ставят эти мудрые книги — пишите еще. А просто тратить символы на "пустые" ответы — право, не стоит. А то вдруг символы в клавиатуре кончатся...
Never argue with an Idiot.He'll drag you down to his level and then beat you with experience.
Здравствуйте, centur, Вы писали:
C>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>>Логически: SVV>>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
C>Хмм мне кажется вы все-таки ошиблись или в формулировке задачи или в вашем логическом решении. C>Мне кажется что ситуация будет развиваться примерно так: C>За каждую секунду включая первую ( в первую секунду увеличение длины пути паучка будет 0)путь паука по резинке будет удлиняться на 1 метр ( скорость человека с резинкой), при этом паучок будет продвигаться на 0.1 метра по резинке. Скорость паука по резинке — постоянная, но длина все время увеличивается. Т.к. резинка растягивается равномерно, то получается что паучок будет замедлять свою скорость движения относительно резинки (ускорение сообщаемое резинкой будет со временем стремиться к нулю) . C>Поясню: Введем яркие отметки на резинке на расстоянии 0.1 м. C>после первой секунды расстояние между отметками станет 20 см, т.к. резинка растягивается равномерно (для упрощения — представим что паучок за первую секунду все-таки добежал до первой 10см отметки, хотя с учетом растяжения — это не так). C>После первой секунды паучок находится на первой отметке, но расстояние между отметками уже 20 см. Таким образом чтобы добежать до второй отметки ему понадобится уже 2 секунды при условии что человек остановится. Но человек не останавливается. И после второй секунды паучок оказывается на расстоянии 10+ х (где х — небольшое расстояние на которое его протянула растягивающаяся резинка, ). При этом расстояние до второй отметки уже 30 см, а паук находится на расстоянии всего лишь максимум на расстоянии 10+5 (причем х < 5 (тут могу соврать мб даже 3), из-за непрерывности растяжения и движения, причем даже если взять "дискретные" величины, например за 0.1 секунды паучок мгновенно продвигается на 1 см, а потом только резинка растягивается дискретно, уже продвигая паука на какое-то растояние, то выигрыш небольшой). Теперь перед паук находится посередине второго "10-сантиметрового" отрезка и до второй отметки ему ползти уже ~15 см. Путь который помогла пройти резинка ~5 см (при этом она удлинилась на 1 метр) C>после третьей секунды он находится на расстоянии ~35см от первой отметки+ резинка помогла ему пройти ~3 см ( потому что она увеличилась не в 1.5 раза как во вторую секунду (с 20 см до 30), а всего лишь в 1 1/3 — c 30 до 40). Таким образом дополнительное расстояние пройденное пауком с помощью резинки уменьшается ( а вы утверждаете что приращение растет, что неверно). Итак перед пауком расстояние до второй резинки — 2 см. (правда до 3ей и всех остальных уже 40 . Таким образом дополнительное ускорение которое сообщает резинка — уменьшается. После определенного порога времени оно будет пренебрежительно мало по сравнению с расстоянием пробегаемым пауком, и им можно будет пренебречь. В итоге мы получаем систему (относительно неподвижного наблюдателя) в которой 2 объекта движутся со равномерной скоростью, один из них (первый) — 1 м/с, второй 0.1 м/c. Даже если на момент "перенебрежения" ускорением растояние между ними было 10 см (что оооочень далеко от истины), то второй объект никогда не догонит первого.
Вот я согласен с вашей логикой, что и сам хочу собственно сказать, только есть но
ускорением которое придает резинка пренебрегать нельзя за счет собственно него паук все же догонит.
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, codelord, Вы писали:
C>>А как учитывается расстояние которое паук уже прошел т/е прошел он 2 метра и движется со скоростью 10 * на растяжение C>>то итоговое расстояние будет 2 метра * растяжение + 10 умноженное на растяжение C>>т/е влияет и количество пути которое прошел паук
V>В том-то и дело, что в таком подходе это неважно. Через время t человек уйдет на расстояние t, т.е. резинка растянется на расстояние 1+t равномерно. В этот момент паук, проползающий за бесконечно малое время dt расстояние ds=0.1dt по растянутой резинке, проползает расстояние ds/(1+t) по нерастянутой. Т.е. если Вы ему дадите проползти по ней это расстояние, а потом отпустите резинку в исходное положение, то окажется, что он прополз ds/(1+t). Т.е. его мгновенная скорость в момент времени t, выраженная в метрах нерастянутой резинки, равна ds/(1+t)/dt = 0.1/(1+t). Вот, собственно и вся идея. Ему надо проползти 1 метр нерастянутой резинки, а его скорость в момент времени t равна 0.1/(1+t) метров нерастянутой резинки в секунду. Надеюсь, понятно объяснил.
Я все же не понимаю почему в таком подходе это не важно,
важно скорость паука зависит не только от длины резинки в данный момент, но еще и от расстояния которое он прошел,
Опять таки прошу вывести 100 шагов паука и от Вас.
Здравствуйте, Seon, Вы писали:
S>Здравствуйте, codelord, Вы писали:
C>>Здравствуйте, Seon, Вы писали: S>>>красиво, ничего не скажешь S>>>if( time ==1 ) return 20; — это что?
C>>это растояние паук преодолел за первую секунду, C>>может и не красиво но я собственно к этому и не стремился
S>так, это условие у тебя никогда не выполняется, поэтому не нужно. да и вообще оно не надо.
S>
S> double Lp = 0.0;
S> double Lr = 1.0;
S> double Vp = 0.1;
S> double Vm = 1.0;
S> double dt = 0.01;
S> int t = 1;
S> while (Lp < Lr)
S> {
S> Lp = (Lr + Vm * dt) * (Lp / Lr);
S> Lp += Vp * dt;
S> Lr += Vm * dt;
S> printf("T=%d Lp=%f Lf=%f\n", t, Lp, Lr);
S> t++;
S> }
S> printf("T=%d\n", int(t * dt));
S>
S>результат около 22000 сек — 6 часов
То что оно не выполнится условие я в курсе
я не собирался преподавать уроки программирования( причем эта проверка осталась случайно )
позже ф-я выглядела так:
#include <iostream>
#include <math.h>
using namespace std;
double absolute( double x ) {
return (( x >= 0.0 ) ? x : x*(-1) );
}
double get_cof( double time ) {
return ( ( time <=1 ) ? 1.0 : ( time + 1 ) / time );
}
double get_disnow( double time, double speed ) {
return (get_cof( time ) * speed);
}
using namespace std;
int main( int argc, char **argv ) {
double x = 10.0;
for( double t = 1.0; t < 100000 ;t+=1 )
{
x *= get_cof( t );
x += get_disnow( t, 10.0 );
cout <<" Moskitos = " << x << " cm, " << "Man = " << t*100 << "cm " << endl;
if( (absolute( x - (t * 100 ) ) < 10) )
{ cout.width( 20 );
cout <<"___________________________________________" << endl;
cout << "TIME WAS = " << t << endl;
cout << "MOSKITOS = " << x << " cm; ";
cout << ", MAN = " << t * 100 << " cm; " << endl;
cout <<"___________________________________________" << endl;
break;
}
}
return 0;
}
где ясно видно сколько проходит паук и человек можешь проверить на бумажке.,
в твоей функции которая видимо согласна только с тобой я этого не увидел.
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали:
C>>Здравствуйте, andyJB, Вы писали:
C>>Не выходит шесть часов C>>~3 часа 26 мин получается JB>Кто-то бегал? C>>можете попробовать проверить эмпирически JB>Что именно? Формулу скорости? Простите, но поверю себе на слово. JB>Я неправильно решил дифур? Тоже не верю. Такая вот, например, программа со мной полностью согласна: JB>
JB>class Program
JB>{
JB> public static void Main()
JB> {
JB> const double dt = 1e-5;
JB> double t = 0;
JB> for (double x = 0, X = 1; X - x > 1e-8; t += dt)
JB> {
JB> if (t > 1e+10) throw new System.OverflowException();
JB> const double V = 1.0;
JB> double v = 0.1 + V*x/X;
JB> X += V*dt;
JB> x += v*dt;
JB> }
JB> System.Console.WriteLine("T={0}", t);
JB> }
JB>}
JB>
C>>не верное решение видимо у вас. JB>Ключевое слово — видимо.
Если можно выведи мне пожалуйста своей программой первые 100 шагов паука и соответствующие расстояния
и станет понятно у кого ошибка
(писал вам поэтому дублирую т/к выше не очень понятно кому )
сори за то что еще раз постю прогу ( предыдущая на несколько сек ошибается )
но вот кому не лень посмотрите что она выводит
#include <iostream>
#include <math.h>
using namespace std;
double absolute( double x ) {
return (( x >= 0.0 ) ? x : x*(-1) );
}
double get_cof( double time ) {
return ( ( time <=1 ) ? 1.0 : ( time + 1 ) / time );
}
double get_disnow( double time, double speed ) {
return (get_cof( time ) * speed);
}
using namespace std;
int main( int argc, char **argv ) {
double x = 10.0;
for( double t = 1.0; t < 100000 ; )
{
x *= get_cof( t );
x += get_disnow( t, 10.0 );
cout <<" Moskitos = " << x << " cm, " << "Man = " <<++t*100 << "cm " << endl;
if( (absolute( x - (t * 100 ) ) < 10) ) { cout.width( 20 );
cout <<"___________________________________________" << endl;
cout << "TIME WAS = " << t << endl;
cout << "MOSKITOS = " << x << " cm; ";
cout << ", MAN = " << t * 100 << " cm; " << endl;
cout <<"___________________________________________" << endl;
break;
}
}
return 0;
}
Moskitos = 20 cm, Man = 200cm
Moskitos = 45 cm, Man = 300cm
Moskitos = 73.3333 cm, Man = 400cm
Moskitos = 104.167 cm, Man = 500cm
Moskitos = 137 cm, Man = 600cm
Moskitos = 171.5 cm, Man = 700cm
Moskitos = 207.429 cm, Man = 800cm
Moskitos = 244.607 cm, Man = 900cm
Moskitos = 282.897 cm, Man = 1000cm
Moskitos = 322.187 cm, Man = 1100cm
Moskitos = 362.385 cm, Man = 1200cm
Moskitos = 403.417 cm, Man = 1300cm
Moskitos = 445.219 cm, Man = 1400cm
Moskitos = 487.734 cm, Man = 1500cm
Moskitos = 530.917 cm, Man = 1600cm
Moskitos = 574.724 cm, Man = 1700cm
Moskitos = 619.119 cm, Man = 1800cm
Moskitos = 664.071 cm, Man = 1900cm
Moskitos = 709.548 cm, Man = 2000cm
Moskitos = 755.525 cm, Man = 2100cm
Moskitos = 801.979 cm, Man = 2200cm
Moskitos = 848.887 cm, Man = 2300cm
и приведите пример правильный как у вас получается,
потому что при такой последовательности времени уйдет
Здравствуйте, codelord, Вы писали:
C>Если можно выведи мне пожалуйста своей программой первые 100 шагов паука и соответствующие расстояния
С каким dt (шагом времени)? C>и станет понятно у кого ошибка
У меня по этому поводу сомнений нет.
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали:
C>>Если можно выведи мне пожалуйста своей программой первые 100 шагов паука и соответствующие расстояния JB>С каким dt (шагом времени)? C>>и станет понятно у кого ошибка JB>У меня по этому поводу сомнений нет.
Здравствуйте, codelord, Вы писали:
C>сори за то что еще раз постю прогу ( предыдущая на несколько сек ошибается )
С шагом времени в 1 секунду результат будет плюс-минус километр. C>
C> x += get_disnow( t, 10.0 );
C>
Строчка выше неверна, здесь не должно быть поправки на растяжение.
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали:
C>>сори за то что еще раз постю прогу ( предыдущая на несколько сек ошибается ) JB>С шагом времени в 1 секунду результат будет плюс-минус километр. C>>
C>> x += get_disnow( t, 10.0 );
C>>
JB>Строчка выше неверна, здесь не должно быть поправки на растяжение.
вот как раз таки должно
резина за пауком по вашему не растягивается ?
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, andyJB, Вы писали:
JB>>Здравствуйте, codelord, Вы писали:
C>>>сори за то что еще раз постю прогу ( предыдущая на несколько сек ошибается ) JB>>С шагом времени в 1 секунду результат будет плюс-минус километр. C>>>
C>>> x += get_disnow( t, 10.0 );
C>>>
JB>>Строчка выше неверна, здесь не должно быть поправки на растяжение.
C>вот как раз таки должно C>резина за пауком по вашему не растягивается ?
C>если представить то выглядело бы это так
C>_______________________|Паук|____________________________|>человек
C>____________________________|Паук |_______________________________________> человек C>т/е резинка за пауком растет и в это время его скорость тоже
Резинка растет и за и перед ним, причем т.к. паук стартует с самого начала а резинка растягивается РАВНОМЕРНО ( в моем понимании равномерно растянуться в 2 раза означает что любое расстояние между двумя точками увеличивается в 2 раза. Т.е. если паук пробежал до момента растяжения 10 см, то сзади него окажется 20 см, а впереди уже 180!!! т.е. получается что человек, в системе отсчета связанной с пауком (паук в ней неподвижен) все равно движется, следовательно паук его в этой системе никогда не догонит ( а следовательно и в любой другой =) )
Не надо писать сложные программы, просто рассуждайте сначала логически — избавит от рутины программирования, тем более очевидно что вы где то используете неправильные формулы.
Этюд то в общем-то простой, странно что так массово все пошли по пути — "догонит" и начали считать время :D
PS если ее академик решил за 5 минут, то это совершенно не значит что задача сложная а он супер-гений, может просто задача действительно так проста, а 5 минут потрачены на избавление от "излишней сложности" первоначальной оценки.
Never argue with an Idiot.He'll drag you down to his level and then beat you with experience.
Здравствуйте, codelord, Вы писали:
C>вот как раз таки должно C>резина за пауком по вашему не растягивается ?
Все, что нужно учесть, учтено в первой строке. Впрочем, это вопрос сходимости приближения снизу или сверху. Но прежде чем обсуждать программу, в ней НЕОБХОДИМО сделать прирост t не 1 секунду, а хотя бы 0.001 секунды. В текущем виде она выдает полную чушь.
C>Этюд то в общем-то простой, странно что так массово все пошли по пути — "догонит" и начали считать время :D
Анекдот в тему:
— Алле, дорогой, будь осторожнее на дороге — по радио передали, что какой-то козел уже полчаса едет по центральному проспекту по встречке.
— Да тут таких козлов сотни!
Небольшой хинт: минут через пять после начала движения скорость паучка превысит 1м/с, и он начнет догонять человека.
Здравствуйте, andyJB, Вы писали:
C>>Этюд то в общем-то простой, странно что так массово все пошли по пути — "догонит" и начали считать время :D JB>Анекдот в тему: JB>- Алле, дорогой, будь осторожнее на дороге — по радио передали, что какой-то козел уже полчаса едет по центральному проспекту по встречке. JB>- Да тут таких козлов сотни! JB>Небольшой хинт: минут через пять после начала движения скорость паучка превысит 1м/с, и он начнет догонять человека.
вот пожалуйста попробуй, теперь есть dt дельта времени
и соглашусь результат стал более точным и пауку понадобиться меньше времени чем в случае с 1 секундой
можешь вывести и посмотреть что получается, за первую секунду паук пройдет даже большее чем 20 см расстояние
и мне понятно почему, неужели никто не хочет видеть очевидного ??? и тыкаться только в свои "дифуры" ??
#include <iostream>
#include <math.h>
using namespace std;
double absolute( double x ) {
return (( x >= 0.0 ) ? x : x*(-1) );
}
double get_cof( double time, double dt ) {
return ( ( time <=1.0 ) ? 1.0 : ( time + dt ) / time );
}
double get_disnow( double time, double speed, double dt ) {
return ( get_cof( time, dt ) * speed * dt );
}
using namespace std;
int main( int argc, char **argv ) {
double x = 10.0;
double dt = 0.001;// Приращение времениfor( double t = 1.0; t < 100000.0 ; )
{
x *= get_cof( t, dt );
x += get_disnow( t, 10.0, dt );
t += dt;
if( x > t * 100.0 ) { cout << " Length = " << x << ", " << " Time = " << t << endl; break; }
}
return 0;
}
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, andyJB, Вы писали:
JB>>Здравствуйте, codelord, Вы писали:
C>>>вот как раз таки должно C>>>резина за пауком по вашему не растягивается ? JB>>Все, что нужно учесть, учтено в первой строке. Впрочем, это вопрос сходимости приближения снизу или сверху. Но прежде чем обсуждать программу, в ней НЕОБХОДИМО сделать прирост t не 1 секунду, а хотя бы 0.001 секунды. В текущем виде она выдает полную чушь. C>Не зарывайся с выражениями,
Учись, студент, а то так и будешь всю жизнь инструметы подавать. Нашел я багу в твоей корявой программке: в get_cof написано
( time + 1 ) / time
а должно быть
( time + 2 ) / (time+1)
потому, что это на самом деле (100 + (time+1)*100) / (100 + time*100). C>Я так и не увидел тех 100 шагов которые просил от тебя,
Я уже писал временной интервал 1с — это плюс-минус километр.
Кстати, вот тебе, втыкай свою программу, приведенную в более пристойный вид с нормальным временным шагом:
#include <iostream>
#include <math.h>
using namespace std;
using namespace std;
int main( int argc, char **argv )
{
double dt = 1e-3;
double x = 0;
for( double t = dt; t < 100000 ; )
{
double coef = (1+t+dt)/(1+t);//there was an error: (t+dt)/t;
x = (x + 10.0*dt) * coef;
t += dt;
double X = 100.0 + t * 100.0;
//cout <<" Moskitos = " << x << " cm, " << "Man = " << X << "cm " << endl;
if ( X < x )
{
cout.width( 20 );
cout <<"___________________________________________" << endl;
cout << "TIME WAS = " << t << endl;
cout << "MOSKITOS = " << x << " cm; ";
cout << ", MAN = " << X << " cm; " << endl;
cout <<"___________________________________________" << endl;
break;
}
}
return 0;
}
C>а сколько секунд выставлять разберусь без тебя,
Не разберешься. Уже очевидно. C>По поводу чуши надо обосновывать а не раскидываться словами показывая свою полную несостоятельность.
Я лишь констатирую факт. Я не часто встречаю такой оригинальный способ выражения простых вещей. Не удивительно, что в программе была ошибка.
Здравствуйте, codelord, Вы писали: C>не смеши "мастер" ты ужасен C>по поводу что ты так часто видишь, ты просто видимо очень далек от понимания этого C>неправильно ты переделал дружок понимаешь или не понимаешь блин C>возьми карандаш и отойди от компьютера ты до него не дорос еще C>и еще раз подумай что происходит с резиной.
Я рад, что ты переписал программу с dt. Теперь, подставив ещё меньший dt (0.0001, например), ты узреешь число, похожее на то, к которому будет стремиться твоя убогая аппроксимация. Я подсказал тебе правильный путь, которым ты пренебрег. Что ж, если ты настолько непроходимо глуп, что не видишь ошибки даже если тебе на неё явно указали, то не вижу смысла тратить даже тень своей мегагениальности на недостойного.
C>Ты хоть пробовал вывести первые числа которые получаются на твоей переделке ??? C>я бы сказал полный бред, получается что за первую секунду паук осилит только 3.84 сантиметра C>так что лучше не переделывай больше ничего и иди ка ты сам поучись товарисчь "мастер" хочется добавить #ев C>но не стану. Неужели понимание до тебя так никогда и не дойдет? ??
После первой секунды он пройдет 13.87. Спосбен ли ты скопипастить и запустить программу?
Здравствуйте, vadimcher, Вы писали:
V>Кажется до меня дошло, в чем суть разногласий, и откуда берутся другие результаты (полученные программным путем). Во всем виноваты растяжение и бесконечно малые.
И совершенно верно, что не важно как интергрировать логарифм — приближая прямоугольниками снизу (alpha = 0) или сверху (alpha = 1). Однако, при этом не следует оставлять "зазор", беря прямоугольники предыдущего шага, как было сделано в предложенном ранее программном решении.
V>Разумеется, при полном учете растяжения при конечных dt время получается меньше, так как величины второго порядка играют роль. Однако при уменьшении dt все сходится куда надо.
Ещё бы оно не сходилось! Решение должно быть гладкой функцией, иначе какая это скорость? Гораздо более опасна ошибка вычислений, появляющаяся при последовательных умножениях перемещений паучка на отношение новой и старой длин резинки. К счастью, в данной задаче она не проявляется.
Re[2]: Человек и паучок: финальный топик с программой.
От:
Аноним
Дата:
09.08.07 18:32
Оценка:
Здравствуйте, vadimcher, Вы писали:
V>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
SVV>>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
SVV>>Логически: SVV>>Человек движеться равномерно. Паучок с ускорением т.к. к его пройденному пути прибавляется растяжение нити и чем больше он прополз, тем больше это приращение. Отсуда следует что обязательно догонит. А вот как высчитать время?
V>Кажется до меня дошло, в чем суть разногласий, и откуда берутся другие результаты (полученные программным путем). Во всем виноваты растяжение и бесконечно малые.
V>Сначала теория, потом программа и тесты.
V>Итак, как я сказал до этого, паук, находясь в точке x за следующие dt секунд пробежит ds=.1dt метров. В моем подходе то, что та точка, с которой он стартовал, тоже за это время уедет, неважно, так как я измеряю все относительно резинки. Тем не менее остается вопрос о том, что то расстояние, которое должен пробежать за это время паук, тоже растянется. Весь вопрос в том, "задними или передними лапками" он цепляется за резинку. Действительно, пока он бежит свои ds, это самое ds также растянется. На сколько -- это вопрос того, на сколько резинка уже растянута, однако я берусь показать, что даже если паук "цепляется передними лапками" и, как следствие, пробегает растянутые ds, это дает лишь поправку второго порядка, которая на ответ не влияет.
V>Итак, если к моменту t резинка растянута до 1+t, то через dt она станет длиной 1+t+dt. Т.е. растянется в coef=(1+dt/(1+t)) раз. Далее, паук за это время пробегает ds, которые растягиваются в coef раз. Если он бежит "на задних лапах", то пробежит по резинке ds, "на пережних" -- ds*coef. Это можно понимать и так: либо мы растягиваем сначала резинку, а затем он бежит по ней ds, либо он сначала бежит ds, а мы затем растягиваем ее, т.е. получается, что он пробежал растянутые ds, т.е. ds*coef. На практике оба процесса в течении dt происходят одновременно, поэтому он пробежит сколько-то между ds и ds*coef. В своей программе я ввел alpha, которое учитывает в какой степени надо принимать растяжение, пока он бежит ds: alpha=0 -- не надо, т.е. пробежит ds, alpha=1 -- надо "по полной", т.е. пробежит ds*coef, промежуточные значения также допустимы.
V>Самое интересное, что с точки зрения теории нам учет растяжения расстояния ds ничего не дает! Дейтсивтельно, скорость будет определяться как ds*coef/dt = .1*(1+dt/(1+t)). Т.е. в силу того, что поправка на растяжение добавляет максимум ds*dt/(1+t) к расстоянию ds, т.е. величину заведомо меньшего порядка малости, такая поправка не влияет на величину мгновенной скорости в этой точке.
V>ОДНАКО, при написании программы, ошибкой было бы положить dt заданной какой-то, пусть малой, но все же конечной величиной, ибо здесь уже бесконечно малые второго порядка начинают играть свою роль.
V>Итак, программа написана, текст ее в самом конце, я ее запущу несколько раз: c alpha=0 (т.е. без учета растяжения ds) и различными dt, а также с alpha=1 (с полным учетом растяжения) и различными dt. ПРОГРАММА НАПИСАНА С ОБЫЧНЫМ ПОДХОДОМ, А НЕ С МОИМ ТЕОРЕТИЧЕСКИМ, Т.Е. НЕ В МЕТРАХ НЕРАСТЯНУТОЙ РЕЗИНКИ, А В ОБЫЧНОЙ СИСТЕМЕ КООРДИНАТ, С ТЕМ, ЧТОБЫ СТОРОННИКИ ПРОСТОГО ПРОГРАММНОГО ПОДХОДА МОГЛИ УБЕДИТЬСЯ, ЧТО НИКАКИХ "ТЕОРЕТИЧЕСКИХ ТРЮКОВ" ЗДЕСЬ НЕТ.
V>Результаты: V>
V>Разумеется, при полном учете растяжения при конечных dt время получается меньше, так как величины второго порядка играют роль. Однако при уменьшении dt все сходится куда надо.
V>codelord: Обратите также внимание на Ваш "результат" 12367 секунд, когда я принял во внимание растяжение ds по полной (alpha=1) и положил dt=1! Думаю, это ключ. Прочитайте еще раз мой теоретический подход в другом сообщении и подумайте немного. Там все правильно.
V>Программа: V>
V>#include <iostream>
V>using namespace std;
V>// The state of the World!
V>struct CState {
V> double rubberlen;
V> double bugx;
V> double manspeed;
V> double bugspeed;
V> double rubberlen0;
V> CState(): rubberlen(1.), bugx(0.), manspeed(1.), bugspeed(.1), rubberlen0(rubberlen) { }
V> Reset() { rubberlen = rubberlen0; bugx = 0.; }
V>};
V>// calculates a new state of the world based on the current state cur,
V>// alpha, which is the coefficient of the influence of rubber stretching,
V>// and dt -- small time period,
V>// alpha=0 -- take into account bug's speed only + the movement of the initial position
V>// alpha=1 -- take into account the movement of the final position as well
V>// Returns 1 if the man was caught, o/w returns 0
V>// Before: bugx=1., rubberlen = 2., dt = .01
V>// After: new rubber length = 2. + 1. * .01 = 2.01, stretch coefficient = 2.01/2. = 1.005,
V>// the distance the bug made: ds = .1 * .01 = .001,
V>// the movement of the start position (due to stretch): from bugx=1. to 1. * 1.005 = 1.005,
V>// the movement of the final position (due to stretch): from bugx+ds=1.001 to 1.001 * 1.005 = 1.006005,
V>// if alpha = 0., then new position = start position + ds = 1.005 + .001 = 1.006,
V>// if alpha = 1., then new position = final position = 1.006005
V>// if alpha between 0 and 1, then new position is calculated as an weighted sum of those two above
V>int move(CState & cur, double alpha, double dt) {
V> double ds = cur.bugspeed * dt;
V> double coef = 1 + cur.manspeed * dt / cur.rubberlen;
V> double startx = cur.bugx * coef; // where is the start due to stretching
V> double finishx = (cur.bugx + ds) * coef; // where is the finish due to stretching
V> double x0 = startx + ds; // if the stretch of the distance is not taken into account
V> double x1 = finishx; // otherwise, i.e. if it is taken
V> cur.bugx = x0 + alpha * (x1 - x0);
V> cur.rubberlen += cur.manspeed * dt;
V> return (cur.bugx >= cur.rubberlen);
V>}
V>// prints the state
V>void print(CState cur) {
V> cout << "Man: " << cur.rubberlen << "\tBug: " << cur.bugx << '\n';
V>}
V>int main() {
V> CState state;
V> for (double alpha = 0.0; alpha <= 1.0; alpha += 1.0) {
V> cout << "alpha = " << alpha << '\n';
V> for (double dt = 1; dt >= 0.001; dt /= 10.) {
V> cout << "dt = " << dt << '\n';
V> int cou = 0;
V> while(!move(state, alpha, dt)) {
V> if (++cou <= 3) print(state);
V> }
V> cout << "Caught at manx = " << state.rubberlen << ", bugx = " << state.bugx
V> << " after " << (state.rubberlen - state.rubberlen0) / state.manspeed << " secs\n";
V> state.Reset();
V> }
V> }
V>}
V>
(codelord)
Видимо так все и есть
спасибо за разъяснения.
сейчас еще гляну но уверен в вашей правоте.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Условие. Есть резинка растягивающаяся до бесконечности и по всей длинне равномерно длинной 1 метр. Один конец прикреплен к стене и на нем сидит паучок, другой держит в руках человек. Человек начинает двигаться от стены со скоростью 1 м/с — ондновременно с ним начинает двигаться паучок по резинке паучок со скоростью 0.10 м/с. SVV>>Вопрос: догонит ли паучок человека, и если догонит, то за какое время?
К>Удобнее привязать систему координат к человеку. К>То есть, переформулировать задачу так:
К>Резинку держат двое. Один стоит на месте, а второй (вместе со стенкой) начинает отходить. К>Паучок стартует со второго к первому.
К>В этом случае очевидно, что паучок дойдёт. К>Пусть он разделяет резинку x+y на части: x до первого и y до второго, в пропорции r=y:x К>Если бы он стоял на месте, то пропорция сохранялась бы. А он движется, постепенно меняя её.
Не очевидно. Ну, например, если бы он двигался с замедлением (т.е. не только из-за растяжения, но еще просто замедляясь), то уже не обязательно догнал бы, а пропорция менялась бы все равно. Или я чего-то не понял? Хотя идея хороша.
К>x' = v*x/(x+y) — s К>y' = v*y/(x+y) + s
К>Дальше надо решать дифур... Он, вроде бы, простой, но влом.
Здравствуйте, andyJB, Вы писали:
JB>Здравствуйте, codelord, Вы писали: C>>не смеши "мастер" ты ужасен C>>по поводу что ты так часто видишь, ты просто видимо очень далек от понимания этого C>>неправильно ты переделал дружок понимаешь или не понимаешь блин C>>возьми карандаш и отойди от компьютера ты до него не дорос еще C>>и еще раз подумай что происходит с резиной. JB>Я рад, что ты переписал программу с dt. Теперь, подставив ещё меньший dt (0.0001, например), ты узреешь число, похожее на то, к которому будет стремиться твоя убогая аппроксимация. Я подсказал тебе правильный путь, которым ты пренебрег. Что ж, если ты настолько непроходимо глуп, что не видишь ошибки даже если тебе на неё явно указали, то не вижу смысла тратить даже тень своей мегагениальности на недостойного.
Не могу отказать себе в удовольствии
назвать тебя полным мудаком и за слова я тебе могу ответить лично, и супер мега гений написал неправильный коэффициент надеюсь ты носом ткнешься и поймешь почему( который подгон под ответ )
Предлагаю встретиться в Москве любое удобное для тебя время и место, чтобы набить тебе твою сраную морду за твои сраные слова которые при встрече
собственно ручно ( в виде распечатанного топика ) засунешь в задний проход и будешь этому очень рад. т/к это будет лучшее развитие событий для тебя.
Предлагаю сегодня.
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, Seon, Вы писали:
S>>Здравствуйте, codelord, Вы писали:
C>>>Здравствуйте, Seon, Вы писали: S>>>>красиво, ничего не скажешь S>>>>if( time ==1 ) return 20; — это что?
C>>>это растояние паук преодолел за первую секунду, C>>>может и не красиво но я собственно к этому и не стремился
S>>так, это условие у тебя никогда не выполняется, поэтому не нужно. да и вообще оно не надо.
S>>
S>> double Lp = 0.0;
S>> double Lr = 1.0;
S>> double Vp = 0.1;
S>> double Vm = 1.0;
S>> double dt = 0.01;
S>> int t = 1;
S>> while (Lp < Lr)
S>> {
S>> Lp = (Lr + Vm * dt) * (Lp / Lr);
S>> Lp += Vp * dt;
S>> Lr += Vm * dt;
S>> printf("T=%d Lp=%f Lf=%f\n", t, Lp, Lr);
S>> t++;
S>> }
S>> printf("T=%d\n", int(t * dt));
S>>
S>>результат около 22000 сек — 6 часов
C>То что оно не выполнится условие я в курсе C>я не собирался преподавать уроки программирования( причем эта проверка осталась случайно ) C>позже ф-я выглядела так:
C>
C>#include <iostream>
C>#include <math.h>
C>using namespace std;
C>double absolute( double x ) {
C> return (( x >= 0.0 ) ? x : x*(-1) );
C> }
C>double get_cof( double time ) {
C> return ( ( time <=1 ) ? 1.0 : ( time + 1 ) / time );
C> }
C>double get_disnow( double time, double speed ) {
C> return (get_cof( time ) * speed);
C> }
C>using namespace std;
C>int main( int argc, char **argv ) {
C> double x = 10.0;
C> for( double t = 1.0; t < 100000 ;t+=1 )
C> {
C> x *= get_cof( t );
C> x += get_disnow( t, 10.0 );
C> cout <<" Moskitos = " << x << " cm, " << "Man = " << t*100 << "cm " << endl;
C> if( (absolute( x - (t * 100 ) ) < 10) )
C> { cout.width( 20 );
C> cout <<"___________________________________________" << endl;
C> cout << "TIME WAS = " << t << endl;
C> cout << "MOSKITOS = " << x << " cm; ";
C> cout << ", MAN = " << t * 100 << " cm; " << endl;
C> cout <<"___________________________________________" << endl;
C> break;
C> }
C> }
C> return 0;
C> }
C>
C> где ясно видно сколько проходит паук и человек можешь проверить на бумажке., C> в твоей функции которая видимо согласна только с тобой я этого не увидел.
C> Расстояния в студию.
Сори, ваапще без задней мысли. Никого обидеть не хотел, я думал ты прикалываешься... Извини.
Re[8]: Человек и паучок.
От:
Аноним
Дата:
10.08.07 08:29
Оценка:
Здравствуйте, Seon, Вы писали:
S> Сори, ваапще без задней мысли. Никого обидеть не хотел, я думал ты прикалываешься... Извини.
Здравствуйте, Pro100Oleh, Вы писали:
PO>Какой же вывод будет? PO>Может быть отсюда следует, что нужно использовать формулы, а не программы с дискретным подходом?
Ну да, тем более, что по формулам я решил эту задачу в уме за 3 минуты и получил правильный ответ, а вот на программу с приблизительным результатом мне пришлось убить добрый час.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
E>Я всё понимаю, но о чём тут дамал целых 5 минут Сахаров?
Для данной задачт есть нестандартные решения, которые позволяют "проинтегрировать" в уме, но все зависит от того, какое решение в голову прийдет. Если через дифуры, то лучше листик и 5 минут все же иметь. Известен факт, что как раз у академиков глаз, что называется, "замыливается" от стандартных подходов и решений. Поэтому, если человек всю жизнь имел дело с дифурами (например, изучал динамику в физике), то вполне вероятно, что первое что приходит в голову -- это дифуры. И это ПРАВИЛЬНО, ибо если я немного изменю условие, то все нестандартные решения полетят к черту, а дифуры останутся.
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, SlaVVVa, Вы писали:
SVV>>Легенда. Задача якобы задавалась на съезде академиков. И Сахаров решил ее за 5 минут на бумажной салфетке.
M>Типа так?
Здравствуйте, vadimcher, Вы писали:
V>...если я немного изменю условие, то все нестандартные решения полетят к черту, а дифуры останутся.
Интересно, а как, например?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, vadimcher, Вы писали:
V>>...если я немного изменю условие, то все нестандартные решения полетят к черту, а дифуры останутся.
E>Интересно, а как, например?
Ну как? Любое нетривиальное движение паука или человека, например.
Вот смотрите, два подхода, описанные в решениях моем и Кодт'а (самое элегантное решение в дифурах, имхо), соответственно (так сказать ЭЛЕГАНТНОСТЬ против УНИВЕРСАЛЬНОСТИ):
Через время t резинка станет длиной 1+t. Паучок ползет с постоянной скоростью 0.1 м/с относительной резинки.
Давайте резинку не растягивать, а скажем, что просто паучок ползет со скоростью .1/(1+t) относительно значальной резинки.
Резинку держат двое. Один стоит на месте, а второй (вместе со стенкой) начинает отходить.
...
Пусть он разделяет резинку x+y на части: x до первого и y до второго, в пропорции r=y:x
x' = v*x/(x+y) — s
y' = v*y/(x+y) + s
Теперь, попробуем задачу переписать так: в момент времени t скорость человека f(t).
Во что превращаются два решения?
Через время t резинка станет длиной 1+int[0,t]f(t). Паучок ползет с постоянной скоростью 0.1 м/с относительной резинки.
Давайте резинку не растягивать, а скажем, что просто паучок ползет со скоростью .1/(1+int[0,t]f(t)) относительно значальной резинки.
Резинку держат двое. Один стоит на месте, а второй (вместе со стенкой) начинает отходить.
...
Пусть он разделяет резинку x+y на части: x до первого и y до второго, в пропорции r=y:x
x' = f(t)*x/(x+y) — s
y' = f(t)*y/(x+y) + s
Сложность первого варианта существенно выросла, он уже почти как второй.
Теперь еще чуть-чуть усложним: скорость человека зависит от расстояния до паука (например, чем паук ближе -- тем страшнее ).
Через время t резинка станет длиной 1+???. Паучок ползет с постоянной скоростью 0.1 м/с относительной резинки.
Давайте резинку не растягивать, а скажем, что просто паучок ползет со скоростью .1/(1+???) относительно значальной резинки.
Резинку держат двое. Один стоит на месте, а второй (вместе со стенкой) начинает отходить.
...
Пусть он разделяет резинку x+y на части: x до первого и y до второго, в пропорции r=y:x
x' = f(t,x)*x/(x+y) — s
y' = f(t,x)*y/(x+y) + s
Первое решение окончательно развалилось, а второе -- нет. Если здесь есть аналитическое решение, оно его найдет. Если нет -- численно посчитает!
В борьбе ЭЛЕГАНТНОСТИ с УНИВЕРСАЛЬНОСТЬЮ в итоге побеждает последнее. Почти всегда и почти во всем. Иногда везет, и элегантное решение становится почти универсальным.
Именно поэтому с опытом (как у академиков, например) в голове остаются только универсальные шаблоны, которые они готовы моментально применить к любой задаче. Именно поэтому, скорее всего, как я думаю, Сахарову (если эту байку воспринимать всерьез) потребовался листик и 5 минут. Но ему же листика и 5 минут хватило бы на любой из представленных здесь трех вариантов. И именно поэтому, скорее всего, как я думаю, Арнольд в предисловии к своим "Задачам для детей от 5 до 15 лет" пишет "Я заметил даже, что пятилетние дети решают подобные задачи лучше школьников, испорченных натаскиванием, которым они даются легче, чем студентам, подвергшимся зубрежке в университете, но все же превосходящим своих профессоров (хуже всех решают эти простые задачи нобелевские и филдсовские лауреаты)."
Здравствуйте, vadimcher, Вы писали:
V>Именно поэтому с опытом (как у академиков, например) в голове остаются только универсальные шаблоны, которые они готовы моментально применить к любой задаче. Именно поэтому, скорее всего, как я думаю, Сахарову (если эту байку воспринимать всерьез) потребовался листик и 5 минут. Но ему же листика и 5 минут хватило бы на любой из представленных здесь трех вариантов. И именно поэтому, скорее всего, как я думаю, Арнольд в предисловии к своим "Задачам для детей от 5 до 15 лет" пишет "Я заметил даже, что пятилетние дети решают подобные задачи лучше школьников, испорченных натаскиванием, которым они даются легче, чем студентам, подвергшимся зубрежке в университете, но все же превосходящим своих профессоров (хуже всех решают эти простые задачи нобелевские и филдсовские лауреаты)."
Я может чего не понял, но я решал как-то так:
L(t) = L0 + Vч t -- длина растянутой резинки
Uп( t ) = Vп * L( 0 ) / L( t ) -- скорость паучка относительно "нерастянутой" резинки
Sп( t ) = int( 0, t, Uп( t ) dt ) = int( 0, t, Vп/( 1 + Vч/L0 t ) ) = дальше всё вычисляется и без бумажки и намного быстрее 5 минут. Особенно если в виде int( 0, t, 0.1/( 1 + t ) dt ) = 0.1 int( 1, t + 1, dt / t ) = 0.1 ln( t + 1 )
Таки о чём же он думал?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, vadimcher, Вы писали:
V>>Именно поэтому с опытом (как у академиков, например) в голове остаются только универсальные шаблоны, которые они готовы моментально применить к любой задаче. Именно поэтому, скорее всего, как я думаю, Сахарову (если эту байку воспринимать всерьез) потребовался листик и 5 минут. Но ему же листика и 5 минут хватило бы на любой из представленных здесь трех вариантов. И именно поэтому, скорее всего, как я думаю, Арнольд в предисловии к своим "Задачам для детей от 5 до 15 лет" пишет "Я заметил даже, что пятилетние дети решают подобные задачи лучше школьников, испорченных натаскиванием, которым они даются легче, чем студентам, подвергшимся зубрежке в университете, но все же превосходящим своих профессоров (хуже всех решают эти простые задачи нобелевские и филдсовские лауреаты)."
E>Я может чего не понял, но я решал как-то так:
E>L(t) = L0 + Vч t -- длина растянутой резинки E>Uп( t ) = Vп * L( 0 ) / L( t ) -- скорость паучка относительно "нерастянутой" резинки
E>Sп( t ) = int( 0, t, Uп( t ) dt ) = int( 0, t, Vп/( 1 + Vч/L0 t ) ) = дальше всё вычисляется и без бумажки и намного быстрее 5 минут. Особенно если в виде int( 0, t, 0.1/( 1 + t ) dt ) = 0.1 int( 1, t + 1, dt / t ) = 0.1 ln( t + 1 )
E>Таки о чём же он думал?
Ну вот, Вы опять о том же... как Вы решали. Я не спорю, что Ваше решение самое элегантное и ответ может быть получен за 3, нет за 1 минуту без бумажки. Просто, как мне кажется, решение с дифурами более универсально -- и это то, что первым придет в голову физику с опытом решения динамических задач. Есть динамическая система, и решение есть сразу -- система дифуров. Это как таблица умножения в физике. Может я и не прав. Вот, например, еще раз повторюсь, Кодт представил красивое решение в дифурах. А решать дифур для данной задачи в уме -- увольте! Байка на то она и есть байка, чтобы что-то в ней было правдой, а что-то почти правдой.
Здравствуйте, vadimcher, Вы писали:
E>>Я может чего не понял, но я решал как-то так:
E>>L(t) = L0 + Vч t -- длина растянутой резинки E>>Uп( t ) = Vп * L( 0 ) / L( t ) -- скорость паучка относительно "нерастянутой" резинки
E>>Sп( t ) = int( 0, t, Uп( t ) dt ) = int( 0, t, Vп/( 1 + Vч/L0 t ) ) = дальше всё вычисляется и без бумажки и намного быстрее 5 минут. Особенно если в виде int( 0, t, 0.1/( 1 + t ) dt ) = 0.1 int( 1, t + 1, dt / t ) = 0.1 ln( t + 1 )
E>>Таки о чём же он думал?
V>Ну вот, Вы опять о том же... как Вы решали. Я не спорю, что Ваше решение самое элегантное и ответ может быть получен за 3, нет за 1 минуту без бумажки. Просто, как мне кажется, решение с дифурами более универсально -- и это то, что первым придет в голову физику с опытом решения динамических задач. Есть динамическая система, и решение есть сразу -- система дифуров. Это как таблица умножения в физике. Может я и не прав. Вот, например, еще раз повторюсь, Кодт представил красивое решение в дифурах. А решать дифур для данной задачи в уме -- увольте! Байка на то она и есть байка, чтобы что-то в ней было правдой, а что-то почти правдой.
Ну я не понимаю, что может его "испортить"
Ну пусть будет L( t ) общего вида. Ну получим тот же интеграл.
Пусть даже скорость будет функцией положения паучка. Ну интеграл будет чуть страннее. Но не сильно.
Короче в чём неуниверсальность решения? При чём тут дифуры?
Мне вообще кажется, что такое решение оно прямое. Я не понимаю как иначе прямо интерпретировать идею "ползёт со скоростью 0.1 м/с по резинке"...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, vadimcher, Вы писали:
E>>>Я может чего не понял, но я решал как-то так:
E>>>L(t) = L0 + Vч t -- длина растянутой резинки E>>>Uп( t ) = Vп * L( 0 ) / L( t ) -- скорость паучка относительно "нерастянутой" резинки
E>>>Sп( t ) = int( 0, t, Uп( t ) dt ) = int( 0, t, Vп/( 1 + Vч/L0 t ) ) = дальше всё вычисляется и без бумажки и намного быстрее 5 минут. Особенно если в виде int( 0, t, 0.1/( 1 + t ) dt ) = 0.1 int( 1, t + 1, dt / t ) = 0.1 ln( t + 1 )
E>>>Таки о чём же он думал?
V>>Ну вот, Вы опять о том же... как Вы решали. Я не спорю, что Ваше решение самое элегантное и ответ может быть получен за 3, нет за 1 минуту без бумажки. Просто, как мне кажется, решение с дифурами более универсально -- и это то, что первым придет в голову физику с опытом решения динамических задач. Есть динамическая система, и решение есть сразу -- система дифуров. Это как таблица умножения в физике. Может я и не прав. Вот, например, еще раз повторюсь, Кодт представил красивое решение в дифурах. А решать дифур для данной задачи в уме -- увольте! Байка на то она и есть байка, чтобы что-то в ней было правдой, а что-то почти правдой.
E>Ну я не понимаю, что может его "испортить" E>Ну пусть будет L( t ) общего вида. Ну получим тот же интеграл. E>Пусть даже скорость будет функцией положения паучка. Ну интеграл будет чуть страннее. Но не сильно. E>Короче в чём неуниверсальность решения? При чём тут дифуры? E>Мне вообще кажется, что такое решение оно прямое. Я не понимаю как иначе прямо интерпретировать идею "ползёт со скоростью 0.1 м/с по резинке"...
Ok, я просто высказал свое мнение. Мне показалось решение в дифурах более универсальным, а потому более естественным для академика. Кроме того, я не могу решить эти дифуры в уме. Поэтому и предположил, что ему могли понадобиться ручка, листик и 5 минут, а Вам -- нет. Просто мнение.
Здравствуйте, vadimcher, Вы писали:
M>>Типа так?
V>Типа не совсем...
Там решалась задача с учетом того, что скорость паучка в 100 раз меньше скорости человека, а тут в уловии разница всего в 10 раз, что позволяет использовать вычислительную технику
Здравствуйте, codelord, Вы писали:
C>Здравствуйте, vadimcher, Вы писали:
V>>Здравствуйте, codelord, Вы писали:
C>>>А как учитывается расстояние которое паук уже прошел т/е прошел он 2 метра и движется со скоростью 10 * на растяжение C>>>то итоговое расстояние будет 2 метра * растяжение + 10 умноженное на растяжение C>>>т/е влияет и количество пути которое прошел паук
V>>В том-то и дело, что в таком подходе это неважно. Через время t человек уйдет на расстояние t, т.е. резинка растянется на расстояние 1+t равномерно. В этот момент паук, проползающий за бесконечно малое время dt расстояние ds=0.1dt по растянутой резинке, проползает расстояние ds/(1+t) по нерастянутой. Т.е. если Вы ему дадите проползти по ней это расстояние, а потом отпустите резинку в исходное положение, то окажется, что он прополз ds/(1+t). Т.е. его мгновенная скорость в момент времени t, выраженная в метрах нерастянутой резинки, равна ds/(1+t)/dt = 0.1/(1+t). Вот, собственно и вся идея. Ему надо проползти 1 метр нерастянутой резинки, а его скорость в момент времени t равна 0.1/(1+t) метров нерастянутой резинки в секунду. Надеюсь, понятно объяснил.
C>Я все же не понимаю почему в таком подходе это не важно, C>важно скорость паука зависит не только от длины резинки в данный момент, но еще и от расстояния которое он прошел, C>Опять таки прошу вывести 100 шагов паука и от Вас.
Просто представь что паук уменьшается в размерах (соответственно и его скорость), а не резинка расстягивается.
Здравствуйте, andyJB, Вы писали:
JB>Осталось подставить в условие встречи: VT+L = (VT+L)*ln(VT+L)v/V — L*ln(L)v/V JB>числа из условия: (T+1) = (T+1)ln(T+1)*0.1 или T = e^10-1
Кстати, как я понимаю, из этого следует, что при конечной скорости человека, и скорости паука больше нуля, паук всегда догонит человека за конечное время?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)