Wolfram言語

記号的微積分と数値的微積分

カムの形状を最適化する

カムの1回転に対する弁の開口が最大化されるよう,カムの半径に制約条件を付けて凸状カムの形状を設計する.

カムの形状は,半径 の円周の角度では円であり,残りの上では対称な形であると想定する.

設計変数 , , , , , は角度,つまりカムの円状の部分ではない上半分に分布した等間隔の角度 でのカムの半径を表す.

In[1]:=
Click for copyable input
n = 100; vars = Array[r, n];

それぞれの半径 は,区間になければならない.

In[2]:=
Click for copyable input
rmin = 1; rmax = 2; varbounds = Table[rmin <= r[i] <= rmax, {i, 1, n}];

上で定義された角度 を入力する.

In[3]:=
Click for copyable input
\[Theta] = 2 Pi/(5 (n + 1));

凸性制約は不等式系により表される.

In[4]:=
Click for copyable input
convexconstri = (1/2) r[i - 1] r[i + 1] Sin[2 \[Theta]] <= (1/2) r[i - 1] r[i] Sin[\[Theta]] + (1/2) r[i] r[ i + 1] Sin[\[Theta]];

を使うと,系は下のように再表現することができる. はカムの円状の部分にある点の半径なので に等しいということに注目のこと.

In[5]:=
Click for copyable input
convexconstr = Table[2 r[i - 1] r[i + 1] Cos[\[Theta]] <= r[i] (r[i - 1] + r[i + 1]), {i, 0, n}] /. {r[-1] -> rmin, r[0] -> rmin, r[n + 1] -> rmax};

半径の変化率に対する制約は,パラメータ α として表される.

In[6]:=
Click for copyable input
\[Alpha] = 1.5; rchangeconstr = Table[-\[Alpha] <= (r[i + 1] - r[i])/\[Theta] <= \[Alpha], {i, 0, n}] /. {r[0] -> rmin, r[n + 1] -> rmax};

目的関数(弁の開口部)は, は値の幾何学に関連した定数)として与えられる設計変数 と単純な線形関係を持つと想定される.

In[7]:=
Click for copyable input
rv = 1; objfun = Pi rv^2 (1/n) Sum[r[i], {i, 1, n}];

変数の初期点を選ぶ.

In[8]:=
Click for copyable input
initpts = Table[.5 (rmin + rmax), {i, 1, n}];

最大化問題を解く.

In[9]:=
Click for copyable input
sol = FindMaximum[ Join[{objfun}, varbounds, convexconstr, rchangeconstr], Thread[vars, initpts]];

最大の半径のうちのいくつかは最大の である.

In[10]:=
Click for copyable input
Table[r[i], {i, 95, 100}] /. sol[[2]]
Out[10]=

解をプロットする.

完全なWolfram言語入力を表示する
In[11]:=
Click for copyable input
solpts1 = Table[{r[i] Cos[-2. Pi/5 + \[Theta] i], r[i] Sin[-2. Pi/5. + \[Theta] i]}, {i, -1, n + 2}] /. {r[-1] -> rmin, r[0] -> rmin, r[n + 1] -> rmax, r[n + 2] -> r[n]} /. sol[[2]]; solpts2 = Map[{#[[1]], -#[[2]]} &, Reverse@solpts1]; solpts = Join[solpts1, solpts2]; Show[ListLinePlot[solpts, PlotRange -> {{-2.1, 2.1}, {-2.1, 2.1}}, PlotLabel -> "Cam Shape", AspectRatio -> 1, Axes -> False, Frame -> True], Graphics[{Circle[{0., 0.}, 1.]}], ImageSize -> Medium]
Out[11]=

関連する例

de en es fr ko pt-br ru zh