Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите разобраться с задачей

55K
07 декабря 2009 года
Ragnar_NSK
2 / / 07.12.2009
Дано: два груза, первый через пружину подвешен к потолку, второй через пружину подвешен к первому грузу.

Класс блок - сбсно груз, вложенный спринг - пружина на которой подвешен груз
Код:
class block{
public:
class spring
        {
        public:
        int length, k;
        double dx;
        spring(){length=dx=0;}
        spring(int _length,int _k,double _dx){length=_length;k=_k;dx=_dx;}
        };
spring *s;
int width,height,m;
double v,a,x,y;
block(){width=height=x=y=v=a=m=0;s=NULL;}
block(int _width,int _height,double _x,double _y,double _v,double _a,int _m,int _length,int _k,double _dx){
width=_width; height=_height;x=_x;y=_y;v=_v;a=_a;m=_m;
s=new spring(_length,_k,_dx);
}
};



Обработчик по таймеру
Force и Forced - силы прикладываемые к грузу,
верхний груз обозначен как A нижний как B,
координата грузов отсчитываются от "места крепления" пружины, т.е. при у=длина_пружины пружина в "свободном" состоянии,
ctime - время паузы таймера:
Код:
{
//вывод на экран

//координаты
A->y=A->y+(A->v)*ctime+((A->a)/2.0)*ctime*ctime;
B->y=B->y+(B->v)*ctime+((B->a)/2.0)*ctime*ctime;

//параметры
A->s->dx=A->s->length-A->y;
B->s->dx=B->s->length-B->y;

//ускорения
A->a=9.8-(-A->s->k*A->s->dx+ForceA+ForcedA+B->s->k*B->s->dx)/A->m;
B->a=9.8-A->a-(ForceB+ForcedB-B->s->k*B->s->dx)/B->m;

//скорости
A->v=A->v+(A->a)*ctime;
B->v=B->v+(B->a)*ctime;

//удар
        //с потолком
if(A->y<=0)
        {A->v=-A->v;A->y=1;}
        //между блоками
if(B->y<=0)
        {
        int P;
        B->y=1;
        P=(A->v-B->v)*(A->m+B->m);
        A->v=-P/A->m;
        B->v=P/B->m;
        }
ForcedA=ForcedB=0;
};


По условиям задачи, да и по моделированию, система - идеальная, т.е. без потерь энергии, следовательно затухать колебания не должны.
При данном алгоритме колебания затухают примерно 1-3 пикселя за цикл, если амлитуда около 50.
Если же сначала высчитать скорости а потом уже ускорения, как вроде и должно быть, то система начинает разгонятся при любых параметрах, чего вроде тоже не должно быть.
Собственно вопрос: можно ли сделать так чтобы колебания не затухали, но и не увеличивались, без каких либо костылей которые бы портили реалистичность модели?
1.9K
08 декабря 2009 года
andriano
474 / / 10.01.2008
На протяжении временнОго шага у тебя изменяются координаты, скорости и ускорения. Ты же в формулах вместо средних величин по всему временному шагу берешь значения на одном из концов отрезка.
За счет этой погрешности и накапливается ошибка.
55K
08 декабря 2009 года
Ragnar_NSK
2 / / 07.12.2009
насколько я понимаю, при том же шаге избавиться от этой ошибки не удастся?
1.9K
09 декабря 2009 года
andriano
474 / / 10.01.2008
Цитата: Ragnar_NSK
насколько я понимаю, при том же шаге избавиться от этой ошибки не удастся?

Проблема связана не с шагом, а с неверно записанными уравнениями.
Изменением временого шага ее не решить.
У тебя энергия не сохраняется.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог