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

Потенциальная энергия массы на высоте равна , где - гравитационная постоянная на Земле. Кроме того, потенциальная энергия идеальной линейной пружины с постоянной пружины, растянутой до длины , составляет . В текущей модели пружина не идеальна, но имеет ненулевую длину покоя .
Математическая основа этого примера исходит от Лобо, Ванденберге, Бойда и Лебрета [1]. Версию этого примера на основе решателя см. в разделе Минимизация энергии кусочно-линейной масс-пружинной системы с использованием конусного программирования на основе решателя.
Местоположение массы - ), с горизонтальной координатой i) и вертикальной (i). Масса i имеет потенциальную энергию, обусловленную гравитацией x2 (i). Потенциальная энергия в пружине -1 (i)) где d (i) - длина пружины между массой и массой i-1. Возьмем точку привязки 1 в качестве положения массы 0, а точку привязки 2 в качестве массы n + 1. Предыдущий расчет энергии показывает, что потенциальная энергия пружины i равна
‖ -l (i)) 22.
Переформулирование этой потенциальной энергетической проблемы как проблемы программирования конуса второго порядка требует введения некоторых новых переменных, как описано в Лобо [1]. Создайте переменные ), равные квадратному корню термина i).
‖ -1 (i)) 22.
Пусть - вектор единичного столбца ]. Затем (i). Проблема становится
+‖t‖2 ). (1)
Теперь рассмотрим как переменную свободного вектора, не заданную предыдущим уравнением для ). Включить взаимосвязь между i) (i) в новый набор ограничений конуса
( i) t (i). (2)
Целевая функция еще не является линейной в своих переменных, как требуется для coneprog. Введите новую скалярную переменную . Обратите внимание, что неравенство t‖2≤y эквивалентно неравенству
≤1+y . (3)
Теперь проблема сводится к минимуму
( i ) + y ) ( 4 )
с учетом ограничений конуса на ) и i), перечисленных в пункте (2), и дополнительного ограничения конуса (3). Зависимость конуса (3) обеспечивает t‖2≤y. Следовательно, проблема (4) эквивалентна проблеме (1).
Целевая функция и ограничения конуса в задаче (4) подходят для решения с coneprog.
Определите шесть пружинных констант , шесть констант длины и пять масс .
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

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