(その1) RとWolframAlphaとCVXPY(非線型計画法)でやってみた。2021年03月30日
https://qiita.com/mrrclb48z/items/57602db64e2133a5f813
(再)オリジナル
・大学入試数学問題集成 様> 文系【2】 テキスト
・望星塾 様> 文系【2】 解答
>最大値は6。最小値は2。
>最大値は11.25。3.2が最小値である。
ChatGPT-3.5先生へ(1回目)
大学入試数学問題集成 様> 文系【2】 テキスト
・ページのソースを表示です。MathMLです。
省略しようと思いましたが、大学入試数学問題集成 様 の全文から必要部分の抜粋です。
<div class="qbody">
<p class="slevel"><a name="q-0103"
id="q-0103"></a><span
class="qnum">【2】</span> 座標平面上の点<math>
<mspace width=".2em"></mspace><mi mathvariant="normal">P</mi>
<mo lspace=".5em" stretchy="false">(</mo>
<mi>x</mi><mo>,</mo><mi>y</mi><mo rspace=".2em" stretchy="false">)</mo>
</math>が<math>
<mspace width=".2em"></mspace><mn>4</mn><mo>⁢</mo>
<mi>x</mi><mo>+</mo><mi>y</mi><mo>≦</mo>
<mn>9</mn><mspace width=".2em"></mspace><mtext>,</mtext>
</math><math>
<mrow><mi>x</mi><mo>+</mo><mn>2</mn><mo>⁢</mo>
<mi>y</mi><mo>≧</mo><mn>4</mn>
<mspace width=".2em"></mspace><mtext>,</mtext></mrow>
</math><math>
<mrow><mn>2</mn><mo>⁢</mo><mi>x</mi><mo>-</mo>
<mn>3</mn><mo>⁢</mo><mi>y</mi><mo>≧</mo>
<mo>-</mo><mn>6</mn></mrow><mspace width=".2em"></mspace>
</math>の範囲を動くとき,<math>
<mrow><mn>2</mn><mo>⁢</mo><mi>x</mi><mo>+</mo>
<mi>y</mi><mspace width=".2em"></mspace><mtext>,</mtext>
</mrow>
</math><math>
<mrow><msup><mi>x</mi><mn>2</mn></msup>
<mo>+</mo><msup><mi>y</mi><mn>2</mn></msup>
</mrow><mspace width=".2em"></mspace>
</math>のそれぞれの最大値と最小値を求めよ.
</p>
</div>
</div>
結果
関数 2𝑥+yの最大値は 6、最小値は 2。
???関数 x^2+y^2 の最大値は 11.25、最小値は 4。
>望星塾 様
>最大値は6。最小値は2。
>最大値は11.25。3.2が最小値である。
ChatGPT-3.5先生へ(2回目) sympyのソースコード
sympyのソースコードをお願いします
import sympy as sp
# 変数の定義
x, y = sp.symbols('x y')
# 不等式の定義
inequality1 = 4*x + y - 9 <= 0
inequality2 = x + 2*y - 4 >= 0
inequality3 = 2*x - 3*y + 6 >= 0
# 目的関数の定義
f1 = 2*x + y
f2 = x**2 + y**2
# 不等式をリストにまとめる
inequalities = [inequality1, inequality2, inequality3]
# 範囲を求める関数
def find_extrema(func):
extrema = []
for ineq in inequalities:
solution = sp.solve([ineq, sp.Eq(sp.diff(func, x), 0), sp.Eq(sp.diff(func, y), 0)], (x, y), dict=True)
extrema.extend(solution)
boundary_points = []
for i in range(len(inequalities)):
for j in range(i+1, len(inequalities)):
boundary_solution = sp.solve([inequalities[i], inequalities[j]], (x, y))
if boundary_solution:
boundary_points.append(boundary_solution)
extrema.extend(boundary_points)
return extrema
# 極値の計算
extrema_f1 = find_extrema(f1)
extrema_f2 = find_extrema(f2)
# 最大値と最小値の計算
max_f1 = max([f1.subs(point) for point in extrema_f1])
min_f1 = min([f1.subs(point) for point in extrema_f1])
max_f2 = max([f2.subs(point) for point in extrema_f2])
min_f2 = min([f2.subs(point) for point in extrema_f2])
# (max_f1, min_f1), (max_f2, min_f2)
print("#", (max_f1, min_f1), (max_f2, min_f2))
ValueError: can only solve for one symbol at a time
申し訳ありません。私は、ここまでです。