// ************************************************************************** // // // // eses eses // // eses eses // // eses eseses esesese eses Embedded Systems Group // // ese ese ese ese ese // // ese eseseses eseseses ese Department of Computer Science // // eses eses ese eses // // eses eseses eseseses eses University of Kaiserslautern // // eses eses // // // // ************************************************************************** // // Two trains A,B that are initially dist0 apart are traveling towards each // // other along the same track with speeds speedA and speeB. A very fast fly // // is hovering just above the nose of train A. It buzzes from train A to train// // B and turns around immediatly, flies back to train A, and turns around // // again. It goes on flying back and forth between the two trains until they // // collide. The fly's speed is speedFly miles per hour, and n counts the // // number that the fly meets the train A and train B. // // // // The example has been taken from the following reference: // // http://mathforum.org/dr.math/faq/faq.fly.trains.html // // ************************************************************************** // macro speedA = 60.0; macro speedB = -90.0; macro speedF = 120.0; macro dist0 = 150.0; module Trainfly(int n) { hybrid real posA, posB, posF; real dirF; // initial values posA = 0.0; // initial x-coordinate of train A posB = dist0; // initial x-coordinate of train B posF = 0.0; // initial x-coordinate of the posFly dirF = 1.0; // fly goes initially in direction of train A pause; loop{ flow{ drv(posA) <- speedA; drv(posB) <- speedB; drv(posF) <- speedF * dirF; } until(cont(posA<=posF | posF>=posB)); // the fly hit one of the trains if(posA < posB) { // the trains have still not hit each other, the fly can fly back next(n) = n+1; next(dirF) = -dirF; } pause; } }