//Classic 2nd order nonlinear ordinary differential equation I64 mp_not_done_flags; #define OX 10 #define OY GR_HEIGHT / 2 - FONT_HEIGHT #define MICRO_STEP 0.000001 class State { F64 wabbits, hawks, d_wabbits, d_hawks; //Technically, these are not part of the state. }; U0 Steps(State *s) { I64 i; for (i = 0; i < 10000; i++) { s->d_wabbits = s->wabbits * (1.0 - 0.10 * s->hawks); s->d_hawks = -s->hawks * (1.0 - 0.01 * s->wabbits); s->hawks += s->d_hawks * MICRO_STEP; s->wabbits += s->d_wabbits * MICRO_STEP; } } U0 PlotTrajectory(CTask *parent) { I64 i; CDC *dc = DCAlias(, parent); State s; MemSet(&s, 0, sizeof(State)); s.wabbits = RandU16 % 100 + 10; s.hawks = RandU16 % 10 + 1; for (i = 0; i < 1000; i++) { dc->color = LTGREEN; GrPlot(dc, s.wabbits + OX, OY - s.d_wabbits); dc->color=LTRED; GrPlot(dc, s.hawks + OX, OY - s.d_hawks); Steps(&s); } DCDel(dc); LBtr(&mp_not_done_flags, Gs->num); } U0 PredatorPrey() { I64 i; CDC *dc = DCAlias; PopUpOk("This will plot multiple predator-prey\n" "trajectories. It restarts many times\n" "with different, random, initial populations.\n"); SettingsPush; //See SettingsPush try { AutoComplete; WinBorder; WinMax; DocClear; Refresh; dc->color = BLACK; GrLine(dc, OX, 0, OX, GR_HEIGHT - FONT_HEIGHT - 1); GrLine(dc, 0, OY, GR_WIDTH - 1, OY); while (!CharScan) { mp_not_done_flags = 1 << mp_count - 1; for (i = 0; i < mp_count; i++) JobQueue(&PlotTrajectory, Fs, i); do Yield; while (mp_not_done_flags); } } catch PutExcept; SettingsPop; DCFill(dc); DCDel(dc); } PredatorPrey;