В этом примере показано, как использовать основанный на проблеме подход для нахождения равновесного положения системы масса-пружина, висящей из двух якорных точек. Пружины имеют кусочно-линейные силы растяжения. Система состоит из: массы в двух размерностях. Масса соединяется с пружинами и . Спрингс и также соединяются с отдельными якорными точками. В этом случае длина пружины с нулевой силой - положительная длина , и пружина генерирует силу при растягивании до длины . Задача состоит в том, чтобы найти минимальное потенциальное энергетическое строение масс, где потенциальная энергия исходит от силы тяжести и от растяжения нелинейных пружин. Равновесие происходит при минимальном энергетическом строении.
Этот рисунок показывает пять пружин и четыре массы, подвешенные к двум опорным точкам.
Потенциальная энергия массы на высоте является , где - ускорение свободного падения на Земле. Кроме того, потенциальная энергия идеальной линейной пружины с коэффициента упругости растянутый до длины является . В текущей модели пружина не идеальна, но имеет ненулевую длину упора .
Математический базис этого примера происходит от Лобо, Ванденберге, Бойда и Лебрета [1]. Для версии этого примера, основанной на решателе, смотрите Минимизацию энергии кусочно-линейной системы масса-пружина Используя программирование конуса, основанное на решателе.
Расположение массы является , с горизонтальной координатой и вертикальная координата . Масса имеет потенциальную энергию от силы тяжести . Потенциальная энергия весной является , где - длина пружины между массами и масса . Примите якорную точку 1 как положение массы 0 и якорную точку 2 как положение массы . Предыдущий энергетический расчет показывает, что потенциальная энергия пружины является
.
Переформулирование этой потенциальной энергетической задачи как задачи программирования конуса второго порядка требует введения некоторых новых переменных, как описано в Лобо [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;
Задайте переменные оптимизации, соответствующие математическим переменным задачам. Для простоты установите якорные точки как две виртуальные масс-точки 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
.