В этом примере показано, как найти равновесное положение системы масса-пружина, висящей от двух точек якоря. Пружины имеют кусочно-линейные силы растяжения. Система состоит из: массы в двух размерностях. Масса соединяется с пружинами и . Спрингс и также соединяются с отдельными якорными точками. В этом случае длина пружины с нулевой силой - положительная длина , и пружина генерирует силу при растягивании до длины . Задача состоит в том, чтобы найти минимальное потенциальное энергетическое строение масс, где потенциальная энергия исходит от силы тяжести и от растяжения нелинейных пружин. Равновесие происходит при минимальном энергетическом строении.
Этот рисунок показывает пять пружин и четыре массы, подвешенные к двум опорным точкам.
Потенциальная энергия массы на высоте является , где - ускорение свободного падения на Земле. Кроме того, потенциальная энергия идеальной линейной пружины с коэффициента упругости растянутый до длины является . Текущая модель состоит в том, что пружина не идеальна, но имеет ненулевую длину покоя .
Математический базис этого примера происходит от Лобо, Ванденберга, Бойда и Лебрета [1]. Для основанной на проблеме версии этого примера смотрите Минимизацию энергии кусочно-линейной системы масса-пружина Используя программирование конуса, основанная на проблеме.
Расположение массы является , с горизонтальной координатой и вертикальная координата . Масса имеет потенциальную энергию от силы тяжести . Потенциальная энергия весной является , где - длина пружины между массами и масса . Примите якорную точку 1 как положение массы 0 и якорную точку 2 как положение массы . Предыдущий энергетический расчет показывает, что потенциальная энергия пружины является
.
Переформулирование этой потенциальной энергетической задачи как задачи конуса второго порядка требует введения некоторых новых переменных, как описано в Lobo [1]. Создайте переменные равным квадратному корню термина .
Давайте быть модулем вектора-столбца . Тогда . Задача становится
(1)
Теперь рассмотрим как переменная свободного вектора, не заданная предыдущим уравнением для . Включите отношения между и в новом наборе конусных ограничений
(2)
Целевая функция еще не линейна в своих переменных, как требуется для coneprog
. Введите новую скалярную переменную . Заметьте, что неравенство эквивалентно неравенству
. (3)
Теперь проблема в том, чтобы минимизировать
(4)
удовлетворяющее ограничениям конуса на и приведенный в (2) и дополнительное ограничение конуса (3). Ограничение конуса (3) гарантирует, что . Поэтому задача (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;
Переменные для оптимизации являются десятью компонентами векторы, шесть компонентов вектор, и переменная. Позвольте 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)
.
The coneprog
решатель использует ограничения конуса для вектора переменной в форме
.
В следующем коде Asc
матрица представляет термин , с 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), соответствующее переменная
путем создания матрицы Asc
который, при умножении на v
вектор, задает вектор . The bsc
вектор соответствует константе 1 в члене . The dsc
вектор, при умножении на v
, возвращает . И gamma
= .
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);
Наконец, создайте нижние границы, соответствующие и переменные.
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
.