В этом примере показано, как использовать подход, основанный на проблеме, чтобы найти положение равновесия массово-пружинной системы, висящей от двух точек привязки. Пружины имеют кусочные линейные растяжимые силы. Система состоит из массы в двух измерениях. Масса соединяется с пружинами и . Спрингс и также соединяются, чтобы разделить точки привязки. В этом случае, продолжительность нулевой силы пружины положительная длина , и пружина генерирует силу когда расширено к длине . Проблема состоит в том, чтобы найти минимальную настройку потенциальной энергии масс, куда потенциальная энергия прибывает из силы тяжести и из протяжения нелинейных пружин. Равновесие происходит в минимальной энергетической настройке.
Этот рисунок показывает пять пружин и четыре массы, приостановленные от двух точек привязки.
Потенциальная энергия массы на высоте , где ускорение свободного падения на Земле. Кроме того, потенциальная энергия идеальной линейной пружины с коэффициентом упругости расширенный к длине . В текущей модели пружина не идеальна, но это имеет ненулевую продолжительность отдыха .
Математический базис этого примера прибывает от Лобо, Vandenberghe, Бойда и Лебрета [1]. Для основанной на решателе версии этого примера смотрите, Минимизируют энергию Кусочной Линейной Системы массового Spring Используя Коническое Программирование, Основанное на решателе.
Местоположение массы , с горизонтальной координатой и вертикальная координата . Масса имеет потенциальную энергию из-за серьезности . Потенциальная энергия пружиной , где продолжительность пружины между массой и масса . Возьмите точку привязки 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] Лобо, Мигель Соуза, Lieven Vandenberghe, Стивен Бойд и Эрве Лебре. “Приложения Программирования Конуса Второго порядка”. Линейная алгебра и Ее Приложения 284, № 1-3 (ноябрь 1998): 193–228. https://doi.org/10.1016/S0024-3795(98)10032-0
.