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

В этом примере показано, как найти равновесное положение системы масса-пружина, висящей от двух точек якоря. Пружины имеют кусочно-линейные силы растяжения. Система состоит из: 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)-l(i))2/2, где d(i) - длина пружины между массами i и масса i-1. Примите якорную точку 1 как положение массы 0 и якорную точку 2 как положение массы n+1. Предыдущий энергетический расчет показывает, что потенциальная энергия пружины i является

Energy(i)=k(i)(x(i)-x(i-1)-l(i))22.

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

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

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

minx,t(igm(i)eTx(i)+t2).               (1)

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

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

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

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

Теперь проблема в том, чтобы минимизировать

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

удовлетворяющее ограничениям конуса на x(i) и t(i) приведенный в (2) и дополнительное ограничение конуса (3). Ограничение конуса (3) гарантирует, что t2y. Поэтому задача (4) эквивалентна задаче (1).

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

Состав MATLAB ®

Задайте шесть коэффициентов упругости k, шесть констант длины lи пять масс m.

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

Задайте приблизительное ускорение свободного падения на Земле g.

g = 9.807;

Переменные для оптимизации являются десятью компонентами x векторы, шесть компонентов t вектор, и y переменная. Позвольте v быть вектором, содержащим все эти переменные.

  • [v(1),v(2)] соответствует переменной 2-D x(1).

  • [v(3),v(4)] соответствует переменной 2-D x(2).

  • [v(5),v(6)] соответствует переменной 2-D x(3).

  • [v(7),v(8)] соответствует переменной 2-D x(4).

  • [v(9),v(10)] соответствует переменной 2-D x(5).

  • [v(11):v(16)] соответствует вектору 6-D t.

  • v(17) соответствует переменному скаляру y.

Используя эти переменные, создайте соответствующий вектор целевой функции f.

f = zeros(size(m));
f = [f;g*m];
f = f(:);
f = [f;zeros(length(k)+1,1)];
f(end) = 1;

Создайте ограничения конуса, соответствующие пружинам между массами (2)

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

The coneprog решатель использует ограничения конуса для вектора переменной v в форме

Ascv-bscdscTv-γ.

В следующем коде Asc матрица представляет термин x(i)-x(i-1), с bsc = [0;0]. Переменная конуса dsc = 2/k(i) и соответствующее gamma = -l(i).

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 переменная

[2t1-y]1+y

путем создания матрицы Asc который, при умножении на v вектор, задает вектор [2t-y]. The bsc вектор соответствует константе 1 в члене 1-y. The dsc вектор, при умножении на v, возвращает y. И 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

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.

См. также

|

Похожие темы