В этом примере показано, как найти равновесное положение системы масс-пружин, зависшей от двух опорных точек. Пружины обладают кусочно-линейными растягивающими силами. Система состоит из масс в двух измерениях. Масса соединена с пружинами и 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, шесть компонентов вектора t и переменная y. Давайте v быть вектором, содержащим все эти переменные.
[v(1),v(2)] соответствует переменной 2-D ).
[v(3),v(4)] соответствует переменной 2-D ).
[v(5),v(6)] соответствует переменной 2-D ).
[v(7),v(8)] соответствует переменной 2-D ).
[v(9),v(10)] соответствует переменной 2-D ).
[v(11):v(16)] соответствует 6-D вектору .
v(17) соответствует скалярной переменной .
С помощью этих переменных создайте соответствующий вектор целевой функции. f.
f = zeros(size(m)); f = [f;g*m]; f = f(:); f = [f;zeros(length(k)+1,1)]; f(end) = 1;
Создайте зависимости конуса, соответствующие пружинам между массами (2)
≤2k (i) t (i).
coneprog решатель использует ограничения конуса для переменного вектора в форме
Asc⋅v-bsc‖≤dscTv-γ.
В следующем коде Asc матрица представляет член i-1) ‖, сbsc = [0;0]. Конусная переменная dsc = ) и соответствующееgamma = ).
d = zeros(1,length(f)); Asc = d; Asc([1 3]) = [1 -1]; A2 = circshift(Asc,1); Asc = [Asc;A2]; ml = length(m); dbase = 2*ml; bsc = [0;0]; for i = 2:ml gamma = -l(i); dsc = d; dsc(dbase + i) = sqrt(2/k(i)); conecons(i) = secondordercone(Asc,bsc,dsc,gamma); Asc = circshift(Asc,2,2); end
Создайте зависимости конуса, соответствующие пружинам между конечными массами и опорными точками, используя опорные точки для расположения конечных масс, как в предыдущем коде.
x0 = [0;5]; xn = [5;4]; Asc = zeros(size(Asc)); Asc(1,(dbase-1)) = 1; Asc(2,dbase) = 1; bsc = xn; gamma = -l(ml); dsc = d; dsc(dbase + ml) = sqrt(2/k(ml)); conecons(ml + 1) = secondordercone(Asc,bsc,dsc,gamma); Asc = zeros(size(Asc)); Asc(1,1) = 1; Asc(2,2) = 1; bsc = x0; gamma = -l(1); dsc = d; dsc(dbase + 1) = sqrt(2/k(1)); conecons(1) = secondordercone(Asc,bsc,dsc,gamma);
Создайте ограничение конуса (3), соответствующее переменной y
≤1+y
путем создания матрицы Asc который, при умножении на v вектор, дает вектор ]. bsc вектор соответствует константе 1 в члене . dsc вектор, при умножении на v, возвращает . И gamma = -1.
Asc = 2*eye(length(f)); Asc(1:dbase,:) = []; Asc(end,end) = -1; bsc = zeros(size(Asc,1),1); bsc(end) = -1; dsc = d; dsc(end) = 1; gamma = -1; conecons(ml+2) = secondordercone(Asc,bsc,dsc,gamma);
Наконец, создайте нижние границы, соответствующие переменным t и y.
lb = -inf(size(f)); lb(dbase+1:end) = 0;
Постановка проблемы завершена. Решить проблему, позвонив coneprog.
[v,fval,exitflag,output] = coneprog(f,conecons,[],[],[],[],lb);
Optimal solution found.
Постройте график точек решения и анкеров.
pp = v(1:2*ml); pp = reshape(pp,2,[]); pp = pp'; plot(pp(:,1),pp(:,2),'ro') hold on xx = [x0,xn]'; plot(xx(:,1),xx(:,2),'ks') xlim([x0(1)-0.5,xn(1)+0.5]) ylim([min(pp(:,2))-0.5,max(x0(2),xn(2))+0.5]) xxx = [x0';pp;xn']; plot(xxx(:,1),xxx(:,2),'b--') legend('Calculated points','Anchor points','Springs','Location',"best") hold off

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