Компьютерное моделирование 2017-2018 учебный год Лабораторная работа 6 Имитационное моделирование физических явлений и биологических процессов Физическая песочница, physics sandbox - программы Phun, Algodoo, Golem, Powder. Астросимулятор Celestia. Скриптовый язык программирования Thyme в среде моделирования Algodoo Примеры. Algodoo, Thyme F10 - Console Tab - help /command - help Объявление глобальной переменной Scene.my.var := 0 Вывод значения переменной в консоли Scene.my.var [Enter] или print(Scene.my.var) Box ПКМ - контекстное меню Script menu text = "Button Start" onClick = (e)=>{ scene.my.var = scene.my.var + 0.1; PBall = Scene.AddCircle({ GeomID := Scene.my.GlobalID; radius := 0.1; pos := [2.0, 1.3] }); PBall.ID = Scene.my.GlobalID; Scene.my.GlobalID = Scene.my.GlobalID + 1 } Box 2 Script menu text = "Button Decrement" onClick = (e)=>{ scene.my.var = scene.my.var - 0.1 } Box 3 Script menu text = { "scene.my.var = " + scene.my.var } Circle Script menu onClick = (e)=>{ scene.my.var = 1 } onHitByLazer = (e)=>{ pos = [scene.my.var, 0.29] } Выполните задания. 3. Создайте интерактивную динамическую модель внутривидовой конкуренции одного вида бактерий. 4. Создайте интерактивную динамическую модель межвидовой конкуренции двух видов бактерий. 5. Создайте интерактивную динамическую модель биологической системы «хищник- жертва». 6. Создайте интерактивную динамическую модель Солнечной системы. 8. Разработайте модель идеального газа. 9. Разработайте программу, моделирующую электростатическое поле системы зарядов. 10. Разработайте программу, моделирующую колебания пружинного маятника. 11. Распадаясь, первый радиоактивный элемент с небольшим периодом полураспада Т1 образует второй, но тоже радиоактивный элемент с периодом полураспада Т2. Начальное количество первого элемента известно. Определите, в какой момент времени масса первого радиоактивного будет максимальной. Высокий уровень: 1. Создайте интерактивную демонстрационную модель движения броуновской частицы. 2. Создайте интерактивную демонстрационную модель движения заряженной частицы в поле плоского конденсатора. 3. Создайте анимационный ролик, демонстрирующий движение тела, брошенного под углом к горизонту. 4. Создайте интерактивную динамическую модель внутривидовой конкуренции одного вида бактерий. 5. Создайте интерактивную динамическую модель межвидовой конкуренции двух видов бактерий. 6. Создайте интерактивную динамическую модель биологической системы «хищник-жертва». 7. Создайте интерактивную динамическую модель Солнечной системы. 8. Определите, с каким углом сектор требуется вырезать из круглого листа жести для получения пожарного ведра конической формы с максимальным объемом. 9. Разработайте модель идеального газа. 10. Разработайте программу, моделирующую электростатическое поле системы зарядов. 13. Определите длину траектории тела, брошенного с некоторой начальной скоростью, составляющей с горизонтом угол a.
Lazarus
type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Image1: TImage; Image2: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure CalcMatrix(a_col, a_row : Integer); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } const L = 89; M = 81; // L = 70; // M = 100; MAX_COLOR = 16777215; BRUSH_CL = clBlack; PEN_COLOR = clWhite; CURVE_COLOR = clLime; W_CELL = 4; H_CELL = 4; H_SPACE = 0; V_SPACE = 0; W_AREA = (L+2)*W_CELL; H_AREA = (M+2)*H_CELL; var N, C : array [0..L+1, 0..M+1] of single; col, row : Integer; procedure TForm1.CalcMatrix(a_col, a_row : Integer); const h = 1; dt = 0.1; R = 1.5; K = 200; b = 0.5; e = 0.4; Cs = 0.4; var ZZ : single; DN : single; DC : single; begin DC := 1.3; DN := 3; if (a_row > 50) then begin DC := 0.6; DN := 1; end; // N[a_col, a_row]:= MAX_COLOR*Random; ZZ:=b*C[a_col, a_row]*N[a_col, a_row]*dt; // N[a_col, a_row]:=N[a_col,a_row]+DN*(N[a_col,a_row+1]-2*N[a_col,a_row]+N[a_col,a_row-1])*dt/(h*h)+DN*(N[a_col+1,a_row]-2*N[a_col,a_row]+N[a_col-1,a_row])*dt/(h*h)-ZZ+R*N[a_col,a_row]*(K-N[a_col,a_row])/K; // N[a_col, a_row]:=N[a_col,a_row]+DN*(N[a_col,a_row+1]-2*N[a_col,a_row]+N[a_col,a_row-1])*dt/(h*h)+DN*(N[a_col+1,a_row]-2*N[a_col,a_row]+N[a_col-1,a_row])*dt/(h*h)-ZZ+R*N[a_col,a_row]*(K-N[a_col,a_row])/K; Memo1.Append(FloatToStr(N[a_col,a_row])); if N[a_col, a_row] < 0 then N[a_col, a_row] := 0; // C[a_col, a_row]:=C[a_col,a_row]+DC*(C[a_col,a_row+1]-2*C[a_col,a_row]+C[a_col,a_row-1])*dt/(h*h)+DC*(C[a_col+1,a_row]-2*C[a_col,a_row]+C[a_col-1,a_row])*dt/(h*h)-e*ZZ-Cs*C[a_col,a_row]; // C[a_col, a_row]:=C[a_col,a_row]+DC*(C[a_col,a_row+1]-2*C[a_col,a_row]+C[a_col,a_row-1])*dt/(h*h)+DC*(C[a_col+1,a_row]-2*C[a_col,a_row]+C[a_col-1,a_row])*dt/(h*h)+e*ZZ-Cs*C[a_col,a_row]; // C[i,j]:=C[i,j]+DC*(C[i,j+1]-2*C[i,j]+C[i,j-1])*dt/(h*h)+DC*(C[i+1,j]-2*C[i,j]+C[i-1,j])*dt/(h*h)+e*ZZ-Cs*C[i,j]; if C[a_col, a_row] < 0 then C[a_col, a_row] := 0; //.Append(FloatToStr(N[a_col,a_row])); N[a_col,a_row] := MAX_COLOR*N[a_col,a_row]; C[a_col, a_row]:= MAX_COLOR*Random; end; procedure TForm1.Button1Click(Sender: TObject); var i, j : Integer; begin Memo1.Clear; //********* C[20,20] := 10; //********* for i := 2 to L-1 do begin for j := 2 to M-1 do begin CalcMatrix(i, j); end; end; for i := L-1 downto 2 do begin for j := M-1 downto 2 do begin CalcMatrix(i, j); end; end; for i := 2 to L-1 do begin for j := 2 to M-1 do begin Image1.Canvas.Brush.Color := round(N[i, j]); // Image1.Canvas.Rectangle(i*4+10,j*4,i*4+13,j*4+3); Image1.Canvas.Rectangle(i*4+4,j*4,i*4+8,j*4+4); end; end; for i := 2 to L-1 do begin for j := 2 to M-1 do begin Image2.Canvas.Brush.Color := round(C[i, j]); Image2.Canvas.Rectangle(i*4+8,j*4,i*4+13,j*4+6); end; end; end; // Step procedure TForm1.Button2Click(Sender: TObject); begin Inc(col); if (col > L+1) then begin col := 0; Inc(row); end; if (row > M+1) then begin row := 0; end; Edit1.Text := IntToStr(col); Edit2.Text := IntToStr(row); end; procedure TForm1.FormCreate(Sender: TObject); var i, j : Integer; cell : TRect; begin Image1.Canvas.Pen.Width:=0; with Image1 do begin Canvas.Brush.Color := BRUSH_CL; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style :=psClear; Canvas.Pen.Color := PEN_COLOR; Canvas.Rectangle(0, 0, W_AREA, H_AREA); end; with Image2 do begin Canvas.Brush.Color := BRUSH_CL; Canvas.Brush.Style := bsSolid; Canvas.Pen.Style :=psClear; Canvas.Pen.Color := PEN_COLOR; Canvas.Rectangle(0, 0, W_AREA, H_AREA); end; Image1.Canvas.Brush.Color := StrToInt(Edit3.Text); Image2.Canvas.Brush.Color := StrToInt(Edit3.Text); col := 0; row := 0; Edit1.Text := IntToStr(col); Edit2.Text := IntToStr(row); Edit3.Text := IntToStr(MAX_COLOR); for i := 2 to L-1 do begin for j := 2 to M-1 do begin N[i, j] := 100; Image1.Canvas.Brush.Color := Round(StrToInt(Edit3.Text)*Random); // Image1.Canvas.Rectangle(i*4+8,j*4,i*4+13,j*4+6); Image1.Canvas.Rectangle(i*(W_CELL + H_SPACE), j*(H_CELL + V_SPACE), i*(W_CELL + H_SPACE) + W_CELL, j*(H_CELL + V_SPACE) + H_CELL); C[i, j] := 100; Image2.Canvas.Brush.Color := Round(StrToInt(Edit3.Text)*Random); // Image2.Canvas.Rectangle(i*4+8,j*4,i*4+13,j*4+6); Image2.Canvas.Rectangle(i*(W_CELL + H_SPACE), j*(H_CELL + V_SPACE), i*(W_CELL + H_SPACE) + W_CELL, j*(H_CELL + V_SPACE) + H_CELL); end; end; end; end.