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;
};
//вывод на экран
//координаты
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.
Если же сначала высчитать скорости а потом уже ускорения, как вроде и должно быть, то система начинает разгонятся при любых параметрах, чего вроде тоже не должно быть.
Собственно вопрос: можно ли сделать так чтобы колебания не затухали, но и не увеличивались, без каких либо костылей которые бы портили реалистичность модели?
За счет этой погрешности и накапливается ошибка.
насколько я понимаю, при том же шаге избавиться от этой ошибки не удастся?
Цитата: Ragnar_NSK
насколько я понимаю, при том же шаге избавиться от этой ошибки не удастся?
Проблема связана не с шагом, а с неверно записанными уравнениями.
Изменением временого шага ее не решить.
У тебя энергия не сохраняется.