・超越方程式。❌ sympy.solve() は この問題には基本的に使えません。
・✅ 対処法:nsolve() を使う
・私は、作図を忘れていました。
オリジナル
Prosamo 様 へ。投稿ありがとうございます。
(本日の)ChatGPT先生へ
質問リスト
# 本チャット内の質問リスト(2025-07-08)
1. ピザを縦に3等分したい!
2. SymPyの計算コードを教えて下さい。
3. matplotlibを使った図付きの確認コードも提供できますか?(→「お願いします」)
4. sympy の solve は無理ですか?
5. 上記の私の質問すべてから、Markdownのテキスト形式で、質問リストを出力して。
❌ sympy.solve() は この問題には基本的に使えません。
...は、代数的(解析的)に解けない、つまり:
・三角関数(arcsin)
・無理関数(√)
・変数が両方にかかる(非線形)
を含む超越方程式だからです。
✅ 対処法:nsolve() を使う
このような場合は、数値的にしか解けないため nsolve() を使うのが唯一の実用的な方法です。
from sympy import symbols, sqrt, asin, pi, Eq, nsolve
a = symbols('a', real=True, positive=True)
eq = Eq(2 * a * sqrt(1 - a**2) + 2 * asin(a), pi/3)
sol = nsolve(eq, a, 0.2) # 初期値が必要!
print(sol.evalf())
🔚 結論
手法 | 解けるか | 理由 |
---|---|---|
solve() |
❌ 無理 | 三角関数+無理関数+変数混合のため解析的に解けない |
nsolve() |
✅ 解ける | 数値的な近似法で解ける(初期値が必要) |
必要であれば、Newton法の数式的説明やnsolveの内部原理も説明できます!
以下省略。
Gemini先生へ
(本日の)copilot先生へ(その1)
### ピザの分割と数学に関する質問リスト
1. ピザを縦に3等分したい!
2. 縦でお願いします。
3. 正確にお願いします。
4. 面積で。
5. 半径を1で。
6. Pythonで。
7. 本当ですか。
8. それぞれの面積を教えて。
9. xは、0.5でなく、0.2649になりませんか。
10. pythonのソースコードで教えて下さい。
11. 上記の私の質問すべてから、Markdownのテキスト形式で、質問リストを出力して。
12. sympy のソースコードで教えて下さい。
13. NotImplementedError がでます。
14. 上記の私の質問すべてから、Markdownのテキスト形式で、質問リストを出力して。
(回答抜粋)
from sympy import symbols, sqrt, integrate, pi, lambdify
from scipy.optimize import bisect
import numpy as np
# 記号定義
x, t = symbols('x t')
# 半円の関数
f = sqrt(1 - t**2)
# 積分式(tを使う)
area_expr = 2 * integrate(f, (t, -1, x))
# 数値関数に変換
area_func = lambdify(x, area_expr, modules=["numpy"])
# 目標面積
target = float(pi / 3)
# 目的関数
def objective(x_val):
return area_func(x_val) - target
# 解を数値的に求める
x1 = bisect(objective, -1, 0)
x2 = -x1
print(f"x1 ≈ {x1:.6f}")
print(f"x2 ≈ {x2:.6f}")
print(f"中央帯の幅 ≈ {x2 - x1:.6f}")
・Sympy live Shell で
x1 ≈ -0.264932
x2 ≈ 0.264932
中央帯の幅 ≈ 0.529864
(本日の)copilot先生へ(その2) matlab symbolic toolboxへ書き換え
15. 上記をmatlab symbolic toolbox に書き換えて下さい。
16. 上記の私の質問すべてから、Markdownのテキスト形式で、質問リストを出力して。
🧮 MATLAB Symbolic Toolbox 版:面積3等分のx座標を求める
% シンボリック変数の定義
syms x t
% 半円の式(上半分)
f = sqrt(1 - t^2);
% -1からxまでの面積(上下2倍)
area_expr = 2 * int(f, t, -1, x);
% 目標面積(円の1/3)
target = pi / 3;
% 数値関数に変換
area_func = matlabFunction(area_expr);
% 目的関数(targetとの差)
g = @(xval) area_func(xval) - double(target);
% 解を数値的に求める(左側のx座標)
x_left = fzero(g, [-1, 0]);
% 対称性より右側のx座標
x_right = -x_left;
% 結果表示
fprintf('x1 ≈ %.6f\n', x_left);
fprintf('x2 ≈ %.6f\n', x_right);
fprintf('中央帯の幅 ≈ %.6f\n', x_right - x_left);
✅ 実行結果の例(MATLAB上で)
x1 ≈ -0.264932
x2 ≈ 0.264932
中央帯の幅 ≈ 0.529864
いつもの? sympyの実行環境と 参考のおすすめです。
いつもと違うおすすめです。
Doc
sympy.solvers.solvers.nsolve (*args, dict=False, **kwargs)[source]
Solve a nonlinear equation system numerically: nsolve(f, [args,] x0, modules=['mpmath'], **kwargs).