Modelica - соединять разъемы через некоторое расстояние - PullRequest
1 голос
/ 29 ноября 2010

В modelica мне нужно соединить два пробела и передать объект, скажем, мяч, между ними через некоторое расстояние.В моем примере у меня есть два пространства, одно из которых - свободное пространство (без сил), и внезапно мы попадаем в земное пространство (гравитация), которое действует на шар.Мне нужно уметь передавать мяч из первого пробела во второй, но я не могу его получить.Вот минимальный пример.

model Ball
  Real[2] position;
  Real[2] velocity;
  parameter Real mass=1;
equation
  der(position) = velocity;
end Ball;

connector Flange
  Real p;
  flow Ball b;
end Flange;

model FreeSpace
  Ball ball;
  parameter Real length;
  Flange f;
equation
  // need to do something, probably here, to end the first space when ball is at length
end FreeSpace;

model NearEarth
  extends FreeSpace;
  parameter Real[2] g={0,-9.8};
equation
  der(ball.velocity) = g;
end NearEarth;

model PassBall
  FreeSpace free(ball.velocity={5,0},ball.position={0,10});
  NearEarth near;
equation
  connect(free.f,near.f);
end Equation;

Возможно, я делаю что-то очень неправильное, но это то, где я нахожусь.(В настоящей задаче у меня импульс электронов, распространяющийся по пространствам, которые наследуются от FreeSpace, но в каждом из них действуют разные силы.) Любые предложения будут хороши!

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Я не профессор Тиллер, но у меня есть некоторый опыт моделирования с помощью Modelica.

Если я вас правильно понял, вы хотите смоделировать движение шара в двухмерной плоскости,которая состоит из двух областей: пространство невесомости и гравитационное поле с центром вокруг планеты на плоскости.

Следующие переменные описывают движение мяча как внутри невесомого пространства, так и внутри гравитационного поля:

  • Реальная [2] скорость
  • Реальная [2] позиция
  • Реальное [2] ускорение

Тогда у вас есть постоянный параметр, который описывает, где находится земля:

  • параметр Real [2] positionEarth

Вам также необходим параметр, который описывает, насколько далеко простирается гравитационное поле и насколько оно сильное:

  • параметр Real radiusGravField
  • параметр Real gravConstant

Теперь вы можете написать уравнения для движения шара в обеих областях, где ускорение, действующее на шар, может быть вычислено по различным выражениям, в зависимости от того, где в плоскости находится шарis:

model grav
  import Modelica.Math.Vectors.*;
  Real[2] velocity(start={-1,-0.9});
  Real[2] position(start={5,5});
  Real[2] acceleration;
  parameter Real[2] positionEarth={0,0};
  parameter Real radiusGravField=2;
  parameter Real gravConstant=10;
equation 
  der(position) = velocity;
  der(velocity) = acceleration;
  if norm(positionEarth - position, 2) > radiusGravField then
    acceleration = {0,0};
  else
    acceleration = gravConstant/norm(positionEarth - position, 2)^2 
                    * normalize(positionEarth - position);
  end if;
end grav;

Переключение с одного домена на другой определяется автоматически, и правильные уравнения применяются без необходимости указывать какие-либо передачи.

Вы можете добавлять действия, выполняемые при отдельных событиях, например:

  when norm(positionEarth - position, 2) < radiusGravField/1000 then
    terminate("Simulation over, crashed on planet");
  end when;
1 голос
/ 30 ноября 2010

Если я понимаю вашу цель, вы хотите иметь две разные "среды" и затем передавать объекты между этими двумя средами?

Это проблематично в Modelica. Modelica предназначена для систем со статической топологией. Под этим я подразумеваю, что все соединения присутствуют в начале симуляции, и никакие соединения не добавляются и не удаляются во время симуляции. Конечно, было бы неплохо иметь больше динамических функций, но если вы добавите слишком много функций / возможностей, все может быстро обескуражить.

Что касается вашей проблемы, вы могли бы иметь класс FreeSpaceInteraction для описания взаимодействия между мячом и объектом FreeSpace и класс NearEarthInteraction для описания взаимодействия между мячом и объектом NearEarth. Затем вы можете получить логический сигнал для обоих, указывающий, который должен быть активным в любой момент времени (в зависимости от расстояния).

Я мог бы разработать пример, если хотите. Очень похожий пример представлен во «Введение в физическое моделирование с помощью Modelica» (если у вас есть копия), который включает в себя планеты и гравитационное притяжение. Существует одна проблема, которая возникает в том, что вы сталкиваетесь с некоторыми комбинаторными проблемами, когда у вас много тел, действующих друг на друга.

Обновление:

Джоэл, Google Книги здесь твой друг. Я выполнил поиск "Modelica gravity Tiller" и нашел эту ссылку . Я надеюсь, что это работает для вас. Если нет, дайте мне знать, и я могу попытаться вставить копию модели здесь.

Рад слышать, что у меня была моя книга ... вот где я получил докторскую степень. Я хотел бы думать, что это было, потому что я был квасцами, но я сомневаюсь в этом.

Ключом к этому является то, что у вас в «FixedSpace» есть «Шар». Это не тот способ, которым я смоделировал это (потому что отношения has-a были бы временными). В орбитальной модели я создаю «солнечную систему», которая имеет кучу «планет», а затем я создаю целую сеть из множества объектов «гравитационного притяжения», соединяющих все со всем. В вашем случае вы можете создать похожий объект типа «силы» и связать его с мячом и каждой средой, а затем попросить его выяснить, как он может вести себя, основываясь на своей позиции. Это, по крайней мере, концептуально, один из способов сделать это.

...