錐計画法を使用した区分線形ばね質量系のエネルギーの最小化、問題ベース
この例では、問題ベースのアプローチを使用して、2 つの固定点からぶら下がっているばね質量系の平衡位置を見つける方法を示します。ばねには区分線形張力がかかります。系は、2 つの次元の 個の質量で構成されます。質量 はばね とばね に接続されます。ばね とばね は別々の固定点に接続されます。この場合、ばね の 0 力長さは正の長さ で、ばねは長さ に伸びたときに力 を発生させます。問題は、質量の最小位置エネルギー構成を見つけることです。ここで、位置エネルギーは、重力と非線形ばねの伸びから生じます。平衡は、最小エネルギー構成で実現します。
この図は、2 つの固定点からつるされている 5 つのばねと 4 つの質量を示しています。
高さ における質量 の位置エネルギーは です。ここで、 は地球上の重力定数です。また、長さ に伸びた、ばね定数 の理想的な線形ばねの位置エネルギーは です。現在のモデルは、ばねが理想的ではありませんが、非ゼロの静止長 をもちます。
この例の数学的基礎は、Lobo、Vandenberghe、Boyd、および Lebret [1] にあります。この例のソルバーベースのバージョンについては、錐計画法を使用した区分線形ばね質量系のエネルギーの最小化 (ソルバーベース)を参照してください。
数学的定式化
質量 の位置は、水平座標が で、垂直座標が の です。質量 は、 の重力による位置エネルギーをもちます。ばね の位置エネルギーは です。ここで、 は、質量 と質量 間のばねの長さです。固定点 1 を質量 0 の位置として、固定点 2 を質量 の位置としてとります。前述のエネルギー計算は、ばね の位置エネルギーが以下であることを示しています。
.
この位置エネルギー問題を 2 次錐計画法の問題として再定式化するには、Lobo [1] で説明されているように、いくつかの新しい変数の導入が必要です。項 の平方根に等しい変数 を作成します。
を単位列ベクトル とします。すると、 になります。問題は次のようになります。
(1)
ここで、 を、 の以前の方程式で与えるのではなく、自由ベクトル変数と見なします。 と の関係を次の錐制約の新しいセットに組み込みます。
(2)
目的関数は、まだ、coneprog
に規定されているように、変数内で線形ではありません。新しいスカラー変数 を導入します。不等式 は次の不等式と同等であることに注意してください。
.(3)
ここで、問題は、次を最小化することです。
(4)
これは、(2) に記載されている と に対する錐制約と追加の錐制約 (3) の影響を受けます。錐制約 (3) は であることを確保します。したがって、問題 (4) は問題 (1) と同等です。
問題 (4) の目的関数と錐制約は coneprog
を使用した解法に適しています。
MATLAB® での定式化
6 つのばね制約 、6 つの長さ制約 、および 5 つの質量 を定義します。
k = 40*(1:6); l = [1 1/2 1 2 1 1/2]; m = [2 1 3 2 1]; g = 9.807;
数学的問題の変数に対応する最適化変数を定義します。簡単にするため、固定点を 2 つの仮想質点 x(1,:)
および x(end,:)
として設定します。この定式化により、各ばねは 2 つの質量間で伸縮することになります。
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
を指定します。2 つの仮想先端質量が固定点にあることを指定する等式制約を作成します。
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] Lobo, Miguel Sousa, Lieven Vandenberghe, Stephen Boyd, and Hervé Lebret.“Applications of Second-Order Cone Programming.”Linear Algebra and Its Applications 284, no. 1–3 (November 1998):193–228. https://doi.org/10.1016/S0024-3795(98)10032-0
.