exponenta event banner

Минимизация энергии кусочно-линейной масс-пружинной системы с помощью конусного программирования, основанного на проблемах

В этом примере показано, как использовать подход, основанный на проблемах, для нахождения равновесного положения системы масс-пружин, зависшей от двух опорных точек. Пружины обладают кусочно-линейными растягивающими силами. Система состоит из n масс в двух измерениях. Масса i соединена с пружинами i и i + 1. Пружины 1 и n + 1 также соединены с отдельными анкерными точками. В этом случае длина пружины i с нулевой силой является положительной длиной l (i), и пружина генерирует силу k (i) q при растяжении до длины q + l (i). Проблема состоит в том, чтобы найти минимальную конфигурацию потенциальной энергии масс, где потенциальная энергия исходит от силы тяжести и от растяжения нелинейных пружин. Равновесие происходит при конфигурации минимальной энергии.

На этом рисунке показаны пять пружин и четыре массы, подвешенные к двум опорным точкам.

Потенциальная энергия массы m на высоте h равна mgh, где g - гравитационная постоянная на Земле. Кроме того, потенциальная энергия идеальной линейной пружины с постоянной k пружины, растянутой до длины q, составляет kq2/2. В текущей модели пружина не идеальна, но имеет ненулевую длину покоя l.

Математическая основа этого примера исходит от Лобо, Ванденберге, Бойда и Лебрета [1]. Версию этого примера на основе решателя см. в разделе Минимизация энергии кусочно-линейной масс-пружинной системы с использованием конусного программирования на основе решателя.

Математическая формулировка

Местоположение массы i - x (i), с горизонтальной координатой x1 (i) и вертикальной координатой x2 (i). Масса i имеет потенциальную энергию, обусловленную гравитацией gm (i) x2 (i). Потенциальная энергия в пружине i равна k (i) (d (i) -1 (i)) 2/2, где d (i) - длина пружины между массой i и массой i-1. Возьмем точку привязки 1 в качестве положения массы 0, а точку привязки 2 в качестве положения массы n + 1. Предыдущий расчет энергии показывает, что потенциальная энергия пружины i равна

Энергия (i) = k (i) (x (i) -x (i-1) ‖ -l (i)) 22.

Переформулирование этой потенциальной энергетической проблемы как проблемы программирования конуса второго порядка требует введения некоторых новых переменных, как описано в Лобо [1]. Создайте переменные t (i), равные квадратному корню термина Энергия (i).

t (i) = k (i) (x (i) -x (i-1) ‖ -1 (i)) 22.

Пусть e - вектор единичного столбца [01]. Затем x2 (i) = eTx (i). Проблема становится

minx, t (∑igm (i) eTx (i) +‖t‖2      ).         (1)

Теперь рассмотрим t как переменную свободного вектора, не заданную предыдущим уравнением для t (i). Включить взаимосвязь между x (i) и t (i) в новый набор ограничений конуса

x (i) -x (i-1) -1 (i) ≤2k  ( i) t (i). (2)

Целевая функция еще не является линейной в своих переменных, как требуется для coneprog. Введите новую скалярную переменную y. Обратите внимание, что неравенство t‖2≤y эквивалентно неравенству

[2t1-y] ≤1+y   .                            (3)

Теперь проблема сводится к минимуму

minx, t, y (∑igm (i) eTx  ( i )  +  y )  ( 4 )         

с учетом ограничений конуса на x (i) и t (i), перечисленных в пункте (2), и дополнительного ограничения конуса (3). Зависимость конуса (3) обеспечивает t‖2≤y. Следовательно, проблема (4) эквивалентна проблеме (1).

Целевая функция и ограничения конуса в задаче (4) подходят для решения с coneprog.

Состав MATLAB ®

Определите шесть пружинных констант k, шесть констант длины l и пять масс м.

k = 40*(1:6);
l = [1 1/2 1 2 1 1/2];
m = [2 1 3 2 1];
g = 9.807;

Определите переменные оптимизации, соответствующие математическим переменным задачи. Для простоты задайте опорные точки как две виртуальные массовые точки x(1,:) и x(end,:). Эта композиция позволяет каждой пружине растягиваться между двумя массами.

nmass = length(m) + 2;
% k and l have nmass-1 elements
% m has nmass - 2 elements
x = optimvar('x',[nmass,2]);
t = optimvar('t',nmass-1,'LowerBound',0);
y = optimvar('y','LowerBound',0);

Создайте задачу оптимизации и задайте для целевой функции выражение в (4).

prob = optimproblem;
obj = dot(x(2:(end-1),2),m)*g + y;
prob.Objective = obj;

Создайте зависимости конуса, соответствующие выражению (2).

conecons = optimineq(nmass - 1);
for ii = 1:(nmass-1)
    conecons(ii) = norm(x(ii+1,:) - x(ii,:)) - l(ii) <= sqrt(2/k(ii))*t(ii);
end
prob.Constraints.conecons = conecons;

Укажите опорные точки anchor0 и anchorn. Создайте ограничения равенства, указывающие, что две виртуальные конечные массы расположены в опорных точках.

anchor0 = [0 5];
anchorn = [5 4];
anchorcons = optimeq(2,2);
anchorcons(1,:) = x(1,:) == anchor0;
anchorcons(2,:) = x(end,:) == anchorn;
prob.Constraints.anchorcons = anchorcons;

Создайте зависимость конуса, соответствующую выражению (3).

ycone = norm([2*t;(1-y)]) <= 1 + y;
prob.Constraints.ycone = ycone;

Решить проблему

Постановка проблемы завершена. Решить проблему, позвонив solve.

[sol,fval,eflag,output] = solve(prob);
Solving problem using coneprog.
Optimal solution found.

Постройте график точек решения и анкеров.

plot(sol.x(2:(nmass-1),1),sol.x(2:(nmass-1),2),'ro')
hold on
plot([sol.x(1,1),sol.x(end,1)],[sol.x(1,2),sol.x(end,2)],'ks')
plot(sol.x(:,1),sol.x(:,2),'b--')
legend('Calculated points','Anchor points','Springs','Location',"best")
xlim([sol.x(1,1)-0.5,sol.x(end,1)+0.5])
ylim([min(sol.x(:,2))-0.5,max(sol.x(:,2))+0.5])
hold off

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Calculated points, Anchor points, Springs.

Можно изменить значения параметров m, l, и k чтобы увидеть, как они влияют на решение. Можно также изменить количество формообразующих элементов; код берет количество масс из предоставленных данных.

Ссылки

[1] Лобо, Мигель Соуза, Ливен Ванденберге, Стивен Бойд и Эрве Лебрет. «Приложения программирования конуса второго порядка». Линейная алгебра и ее приложения 284, № 1-3 (ноябрь 1998): 193-228. https://doi.org/10.1016/S0024-3795(98)10032-0.

См. также

Связанные темы