светлое будущее
Mike Potanin potan
Previous Entry Share Next Entry
Очередная статейка на хабре...
Julia с реактивным программированием и программированием в ограничениях моделирует механику роботов (из веревочек и пружинок).

Ухты!

Удачно мне попалась ваша запись. Давно (несколько месяцев) хочу, но никак не соберусь исследовать вот такой геометрической вопрос. К вершинам треугольника общего положения прикреплены одним концом пружинки, свободные концы которых соединены "болтиком" в свободно перемещающейся точке. Какую траекторию проделает эта точка при изменении длины нерастянутых пружиной от ноля до радиуса описанной окружности? При ноле болтик - в центре масс (точке пересечения медиан), при радиусе - в центре оной окружности (точке пересечения серединных перпендикуляров). Как гуляет болтик при плавном изменении от ноля до радиуса? Хотелось думать, что по отрезку - но быстро доказать или хотя бы проверить я не смог. Друг с значительно более глубокой геометрической интуицией сомневается, что это - отрезок. Вам не сложно было бы с вашей наработкой в Julia попробовать посмотреть? У меня руки не дойдут ещё не знаю как долго!

Оно как-то странно себя ведет.
using Interact, Reactive, JuMP, Gadfly, MacroTools

macro wire(x,y,x0,y0, l)
    v = l^2
    :(@NLconstraint(m, ($x0-$x)^2+($y0-$y)^2 <= $v))
end

macro wire(x,y, x0,y0, x1,y1, l)
    :(@NLconstraint(m, sqrt(($x0-$x)^2+($y0-$y)^2) + sqrt(($x1-$x)^2+($y1-$y)^2) <= $l))
end


calcenergy(d) = MacroTools.@match d begin
    [t__] => :(+$(map(energy1,t)...))
    v_ => energy1(v)
  end

energy1(v) = MacroTools.@match v begin
    w(x1_,y1_, x2_,y2_, k_, l_) => :($k*(sqrt(($x1 - $x2)^2 + ($y1 - $y2)^2) - $l)^2)
    x_ => x
  end

macro energy(v)
    e = calcenergy(v)
    :(@NLobjective(m, Min, $e))
end

function myModel1(x,y, ln)
    m = Model()
    @variable(m, yp >= 0)
    @variable(m, xp >= 0)

    @energy([w(xp,yp, 0,0, 1, ln), w(xp,yp, 0,1, 1, ln), w(xp, yp, x,y, 1, ln)])
    
    status = solve(m)
    
    xpval = getvalue(xp)
    ypval = getvalue(yp)

    (status, xpval, ypval)
end


xsl = slider(0:0.01:1, label="X")

ysl = slider(0:0.01:1, label="Y")

@manipulate for x in xsl, y in ysl
    track = map(l -> myModel1(x, y, l)[2:3], 0:0.001:1)
    plot(x = map(xy -> xy[1], track), y = map(xy -> xy[2], track), Geom.point)
end

Спасибо большое, "странно себя ведёт" - хороший стимул попробовать разобраться, воспользуюсь вашим кодом. Напишу здесь новый комментарий или где-то отдельно.

Дошли руки попробовать попробовать, не получилось. Наустанавливал кучу всякого, но успешно выполнить код (как код jupyter notebook) не смог, ни с одним из предлагавшихся 3-х вариантов NLP (NPL?) solver-а, каждый раз какие-то ошибки. Ни разу не увидел ничего, кроме двух слайдеров под кодом. При шевелении слайдера вываливались вышеупомянутые ошибки. Однако, по идее, должно было что-то нарисоваться до шевеления слайдеров, но я так и не понял, где и как это увидеть. Короче, я получил какой-то опыт, не могу сказать, что 100% негативный, в принципе было интересно... Но, наверно, скорее не захотелось с этим играться, чем захотелось. Проще самому написать на чём-то знакомом, чем разбираться с этой машинерией ради одного эксперимента.

?

Log in