Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#16: 2010-04-07 19:38:28 ЛС | профиль | цитата
Assasin, даже в этом случае (вроде) точно не решается (пусть Леонид меня поправит, если что).
карма: 1

0
Ответов: 8953
Рейтинг: 824
#17: 2010-04-07 20:31:08 ЛС | профиль | цитата
iarspider, я сейчас и объём шара не могу вывести, всё время результат с минусом, блин!, а уж систему хотя бы их двух уравнений проинтегрировать тем более, вот вернётся коллега Assasin из учебного отпуска, тогда и посмотрим
карма: 19

0
Ответов: 5446
Рейтинг: 323
#18: 2010-04-07 20:50:42 ЛС | профиль | цитата
Леонид, посоветовался с коллегами из теор. отдела, они единогласны: аналитического решения даже для случая двух фиксированных тел нет.
карма: 1

0
Ответов: 8953
Рейтинг: 824
#19: 2010-04-08 12:53:12 ЛС | профиль | цитата
iarspider, а Вы ненароком подкинте теор. отделу идейку, что общее решение не нужно, пусть поищут частное, форму замкнутых в пределах одного оборота орбит в виде X=A*sin(a)+C, Y=B*cos(a)+D*cos(2*a)+E, может и выйдет что путное
(Х - ось проходит через неподвижные тела, 0 в центре тяжести их)
карма: 19

0
Разработчик
Ответов: 4698
Рейтинг: 426
#20: 2010-11-19 21:20:55 ЛС | профиль | цитата
Мда, у меня нечто невразумительное вышло Какая то катапульта...
code_21547.txt
карма: 10
0
файлы: 1code_21547.txt [2.2KB] [131]
Ответов: 8953
Рейтинг: 824
#21: 2010-11-19 22:35:09 ЛС | профиль | цитата
Assasin, Вы направили начальную скорость почти на "большое тело", поэтому при сильном сближении увеличивается ускорение, выбранная временная дискретность (t = 0.1;) становится слишком велика и вычисления становятся очень далеки от действительности (и не говорите, что Вас не предупреждали ) (Кстати - что это за тело массой 4Е12; маловато будет, Земля=5,976E+24 кг, не говоря о Солнце - 1,991E+30 кг )
Поставте начальную скорость:
t1.v.x := -2;;
t1.v.y := 2; и получите вполне приличный эллипс (не забудте раскоментировать и приращение положения a.x * t*t / 2; )
карма: 19

0
Разработчик
Ответов: 4698
Рейтинг: 426
#22: 2010-11-20 13:48:38 ЛС | профиль | цитата
Леонид писал(а):
Кстати - что это за тело массой 4Е12

Добуквенный перевод: 4 * 10^12


Сейчас все это испробую
------------ Дoбавленo в 14.04:
Леонид писал(а):
и получите вполне приличный эллипс

Хочу тебя огорчить, получится спираль, правда настолько незаметно то, что она по чуть чуть отклоняется, что ты подумал будто это эллипс, на 5 обороте это уже заметно
------------ Дoбавленo в 14.19:
А вот так рисуем велосипедную шину
Add(MainForm,2953706,21,70)
{
Width=553
Height=547
}
Add(PaintBox,6464998,175,217)
{
Width=545
Height=520
Align=5
Color=16777215
}
Add(MMTimer,3013379,77,161)
{
Interval=1
link(onTimer,2160849:doSafeMode,[])
}
Add(InlineCode,1688360,175,161)
{
WorkPoints=#6:doDraw|
EventPoints=#6:onDraw|
DataPoints=#5:CDraw|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|17: TVector = record|14: x,y:double;|5: end;|1: |15: TBody = record|12: m:double;|14: x,y:double;|13: v:TVector;|5: end;|0:|28: THiAsmClass = class(TDebug)|10: private|14: p1:TBody;|14: t1:TBody;|9: public|28: CDraw,onDraw:THI_Event;|5: |24: constructor Create;|51: procedure doDraw(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|37:procedure _debug(r:double); overload;|5:begin|24: _debug(double2str(r));|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|17: p1.m := 3.9E12;|14: p1.x := 200;|14: p1.y := 200;|14: p1.v.x := 0;|14: p1.v.y := 0;|2: |12: t1.m := 1;|14: t1.x := 300;|14: t1.y := 300;|18: t1.v.x := -2.99;|20: t1.v.y := -t1.v.x;|4:end;|0:|29:procedure THiAsmClass.doDraw;|14:const t = 0.1;|16:var bmp:PBitmap;|14: a:TVector;|15: v,r:double;|15: s,c:double;|5:begin|33: bmp := ReadBitmap(_Data,CDraw);|27:// Bmp.BkColor := clWhite;|43:// Bmp.Canvas.Brush.BrushStyle := bsSolid;|40:// Bmp.Canvas.FillRect(Bmp.BoundsRect);|2: |65: r := (t1.x - p1.x)*(t1.x - p1.x) + (t1.y - p1.y)*(t1.y - p1.y);|14:// _debug(r);|27: v := 6.67E-11 * p1.m / r;|32: c := -(t1.x - p1.x) / sqrt(r);|32: s := -(t1.y - p1.y) / sqrt(r);|15: a.x := c * v;|15: a.y := s * v;|14:// _debug(c);|14:// _debug(s);|44: t1.x := t1.x + t1.v.x * t + a.x * t*t / 2;|44: t1.y := t1.y + t1.v.y * t + a.y * t*t / 2;|25: t1.v.x := t1.v.x + a.x;|25: t1.v.y := t1.v.y + a.y;|2: |28:{ v := 6.67E-11 * t1.m / r;|32: c := -(t1.x - p1.x) / sqrt(r);|32: s := -(t1.y - p1.y) / sqrt(r);|15: a.x := c * v;|15: a.y := s * v;|44: p1.x := p1.x + p1.v.x * t + a.x * t*t / 2;|44: p1.y := p1.y + p1.v.y * t + a.y * t*t / 2;|25: p1.v.x := p1.v.x - a.x;|26: p1.v.y := p1.v.y - a.y;}|2: |27: with bmp.Canvas^ do begin|28: pen.PenStyle := psSolid;|25: pen.Color := clBlack;|22: pen.PenWidth := 2;|32: brush.brushStyle := bsSolid;|27: brush.color := clBlack;|36: MoveTo(round(p1.x),round(p1.y));|40: LineTo(round(p1.x+2),round(p1.y+2));|36: MoveTo(round(t1.x),round(t1.y));|40: LineTo(round(t1.x+1),round(t1.y+1));|4: |34:// brush.brushStyle := bsClear;|45:// TextOut(0,0,'x = ' + double2str(t1.x));|46:// TextOut(0,15,'y = ' + double2str(t1.y));|6: end;|22: _hi_onEvent(onDraw);|4:end;|0:|4:end.|
link(CDraw,6464998:Bitmap,[(181,149)(218,149)(218,266)(181,266)])
}
Add(Timer,7357137,77,217)
{
Interval=10
link(onTimer,3287604:doSafeMode,[])
}
Add(SafeMode,2160849,126,161)
{
link(onSafeMode,1688360:doDraw,[])
}
Add(SafeMode,3287604,126,217)
{
link(onSafeMode,6464998:doRefresh,[])
}
карма: 10
0
Ответов: 8953
Рейтинг: 824
#23: 2010-11-20 21:39:40 ЛС | профиль | цитата
Assasin, ещё бОльшие нестыковки Вас ожидают если для увеличения точности расчётов установите интервал времени поменьше t=0.01; (лишний раз доказывает, что лучший компьютер - RCL цепь, интегрирует и дифференцирует в реальном времени и с любой точностью )
карма: 19

0
Разработчик
Ответов: 26303
Рейтинг: 2146
#24: 2010-11-20 22:06:17 ЛС | профиль | цитата
[flood]
Леонид писал(а):
что лучший компьютер - RCL цепь

Увы, все это уже открыто до нас. RCL цепь -- один из элементов аналогового компьютера[/flood]
карма: 22

0
Ответов: 8953
Рейтинг: 824
#25: 2010-11-20 23:32:03 ЛС | профиль | цитата
nesco, [flood]Мне довелось делать модели на АВМ, ну о-очень наглядно, даже даже девушки сходу понимали принципы автоматического регулирования процессами, чего и как подкрутить, чтобы свести ошибку к минимальному значению [/flood]
карма: 19

0
Ответов: 758
Рейтинг: 112
#26: 2010-11-22 16:41:49 ЛС | профиль | цитата
Assasin писал(а):
Мда, у меня нечто невразумительное вышло Какая то катапульта...

В моделировании нужно подходить последовательно.
Возникает сила --> Возникает ускорение --> меняется скорость --> меняется положение

Add(PaintBox,6464998,483,182)
{
Width=545
Height=520
Align=5
Color=16777215
}
Add(MMTimer,3013379,371,182)
{
Interval=10
link(onTimer,1688360:doDraw,[])
}
Add(InlineCode,1688360,434,182)
{
WorkPoints=#6:doDraw|
EventPoints=#6:onDraw|
DataPoints=#5:CDraw|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|17: TVector = record|14: x,y:double;|5: end;|1: |15: TBody = record|12: m:double;|14: x,y:double;|13: v:TVector;|5: end;|0:|28: THiAsmClass = class(TDebug)|10: private|14: p1:TBody;|14: t1:TBody;|9: public|28: CDraw,onDraw:THI_Event;|5: |24: constructor Create;|51: procedure doDraw(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|37:procedure _debug(r:double); overload;|5:begin|24: _debug(double2str(r));|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|15: p1.m := 4E12;|14: p1.x := 200;|14: p1.y := 200;|14: p1.v.x := 0;|14: p1.v.y := 0;|2: |12: t1.m := 1;|14: t1.x := 200;|14: t1.y := 150;|14: t1.v.x := 1;|16: t1.v.y := 1.5;|4:end;|0:|29:procedure THiAsmClass.doDraw;|14:const t = 0.1;|16:var bmp:PBitmap;|14: a:TVector;|16: v,r2:double;|15: s,c:double;|5:begin|33: bmp := ReadBitmap(_Data,CDraw);|25: Bmp.BkColor := clWhite;|41: Bmp.Canvas.Brush.BrushStyle := bsSolid;|38: Bmp.Canvas.FillRect(Bmp.BoundsRect);|2: |66: r2 := (t1.x - p1.x)*(t1.x - p1.x) + (t1.y - p1.y)*(t1.y - p1.y);|14:// _debug(r);|28: v := 6.67E-11 * p1.m / r2;|33: c := -(t1.x - p1.x) / sqrt(r2);|33: s := -(t1.y - p1.y) / sqrt(r2);|20: a.x := c * v/t1.m;|20: a.y := s * v/t1.m;|29: t1.v.x := t1.v.x + a.x * t;|29: t1.v.y := t1.v.y + a.y * t;|28: t1.x := t1.x + t1.v.x * t;|28: t1.y := t1.y + t1.v.y * t;|2: |27: with bmp.Canvas^ do begin|28: pen.PenStyle := psSolid;|25: pen.Color := clBlack;|22: pen.PenWidth := 2;|32: brush.brushStyle := bsSolid;|27: brush.color := clBlack;|36: MoveTo(round(p1.x),round(p1.y));|40: LineTo(round(p1.x+2),round(p1.y+2));|36: MoveTo(round(t1.x),round(t1.y));|40: LineTo(round(t1.x+1),round(t1.y+1));|6: end;|22: _hi_onEvent(onDraw);|4:end;|0:|4:end.|
link(onDraw,6464998:doRefresh,[])
link(CDraw,6464998:Bitmap,[(440,170)(464,170)(464,226)(489,226)])
}

------------ Дoбавленo в 17.12:
Вот решение для системы трех тел

Add(PaintBox,6464998,483,182)
{
Width=628
Height=525
Align=5
Color=16777215
}
Add(MMTimer,3013379,371,182)
{
Interval=10
link(onTimer,1688360:doDraw,[])
}
Add(InlineCode,1688360,434,182)
{
WorkPoints=#6:doDraw|
EventPoints=#6:onDraw|
DataPoints=#5:CDraw|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|17: TVector = record|14: x,y:double;|5: end;|1: |15: TBody = record|12: m:double;|14: x,y:double;|13: v:TVector;|5: end;|0:|28: THiAsmClass = class(TDebug)|10: private|14: p1:TBody;|14: p2:TBody;|14: t1:TBody;|9: public|28: CDraw,onDraw:THI_Event;|5: |24: constructor Create;|51: procedure doDraw(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|37:procedure _debug(r:double); overload;|5:begin|24: _debug(double2str(r));|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|15: p1.m := 4E12;|14: p1.x := 190;|14: p1.y := 180;|14: p1.v.x := 0;|14: p1.v.y := 0;|2: |15: p2.m := 4E12;|14: p2.x := 200;|14: p2.y := 200;|14: p2.v.x := 0;|14: p2.v.y := 0;|2: |12: t1.m := 1;|14: t1.x := 200;|14: t1.y := 150;|14: t1.v.x := 4;|16: t1.v.y := 2.5;|4:end;|0:|29:procedure THiAsmClass.doDraw;|14:const t = 0.8;|16:var bmp:PBitmap;|14: a:TVector;|23: v1,v2,r1,r2:double;|15: s,c:double;|5:begin|33: bmp := ReadBitmap(_Data,CDraw);|27: //Bmp.BkColor := clWhite;|43: //Bmp.Canvas.Brush.BrushStyle := bsSolid;|40: //Bmp.Canvas.FillRect(Bmp.BoundsRect);|2: |66: r1 := (t1.x - p1.x)*(t1.x - p1.x) + (t1.y - p1.y)*(t1.y - p1.y);|66: r2 := (t1.x - p2.x)*(t1.x - p2.x) + (t1.y - p2.y)*(t1.y - p2.y);|14:// _debug(r);|29: v1 := 6.67E-11 * p1.m / r1;|29: v2 := 6.67E-11 * p2.m / r2;|80: a.x := (-(t1.x - p1.x) / sqrt(r1) * v1 - (t1.x - p2.x) / sqrt(r2) * v2) /t1.m;|80: a.y := (-(t1.y - p1.y) / sqrt(r1) * v1 - (t1.y - p2.y) / sqrt(r2) * v2) /t1.m;|29: t1.v.x := t1.v.x + a.x * t;|29: t1.v.y := t1.v.y + a.y * t;|28: t1.x := t1.x + t1.v.x * t;|28: t1.y := t1.y + t1.v.y * t;|2: |27: with bmp.Canvas^ do begin|28: pen.PenStyle := psSolid;|25: pen.Color := clBlack;|22: pen.PenWidth := 2;|32: brush.brushStyle := bsSolid;|27: brush.color := clBlack;|36: MoveTo(round(p1.x),round(p1.y));|40: LineTo(round(p1.x+2),round(p1.y+2));|36: MoveTo(round(p2.x),round(p2.y));|40: LineTo(round(p2.x+2),round(p2.y+2));|36: MoveTo(round(t1.x),round(t1.y));|40: LineTo(round(t1.x+1),round(t1.y+1));|6: end;|22: _hi_onEvent(onDraw);|4:end;|0:|4:end.|
link(onDraw,6464998:doRefresh,[])
link(CDraw,6464998:Bitmap,[(440,170)(464,170)(464,226)(489,226)])
}

orbita.png


карма: 1

0
файлы: 1orbita.png [22.3KB] [356]
Разработчик
Ответов: 4698
Рейтинг: 426
#27: 2010-11-23 13:55:01 ЛС | профиль | цитата
miver писал(а):
Возникает сила --> Возникает ускорение --> меняется скорость --> меняется положение

Я делал именно так, но вот почему тут у тебя деление на m1?
#pas
a.x := c * v/t1.m;
a.y := s * v/t1.m;
Хы, зато я нашел свою ошибку, у меня здесь без t Ускорение же меряется в м/c^2, а у меня просто сложение:
#pas
t1.v.x := t1.v.x + a.x;
t1.v.y := t1.v.y + a.y;
Вот оттуда и катапульты вышли
карма: 10
0
Ответов: 758
Рейтинг: 112
#28: 2010-11-23 14:34:43 ЛС | профиль | цитата
Assasin писал(а):
Я делал именно так, но вот почему тут у тебя деление на m1?
a.x := c * v/t1.m;
a.y := s * v/t1.m;

http://ru.wikipedia.org/wiki/Второй_закон_Ньютона
карма: 1

0
Разработчик
Ответов: 4698
Рейтинг: 426
#29: 2010-11-23 18:36:53 ЛС | профиль | цитата
Ну, так получается такой вывод формул:

a := F / m1; //m1 - масса тела
F = G * m1 * m2 / (r*r)//m2 - масса планеты
//Подставляем F в выражение a:
a := (G * m1 * m2 / (r*r)) / m1;
a := G * m2 / (r*r);

Разве не так?

А у нас V равно: v := 6.67E-11 * p1.m / r2; => v := G * m2 / (r*r);
карма: 10
1
Голосовали:miver
Ответов: 758
Рейтинг: 112
#30: 2010-11-24 10:27:15 ЛС | профиль | цитата
Для этой модели можно сделать поправку ошибки скорости из закона сохранения енергии
Потенциальная + кинетическая = constant
В случае с планетами Потенциальную заменяем на Гравитационную энергию

Откуда можно делать поправку скорости

карма: 1

0
файлы: 1zakon.png [2.1KB] [467]
30
Сообщение
...
Прикрепленные файлы
(файлы не залиты)