ChatGPT先生へ
質問リスト
・質問リストの追番は無視して下さい。1個ずつです。途中の回答表示は省略しています。
# 質問リスト
1. 三角錐の体積の求め方を教えて下さい。
2. 図を描いて説明して下さい。
3. 上記をsympy のソースコードで。
4. 興味あります。
5. 正面から
6. 保存したい。
7. sympy のソースコードで、積分を使って体積をシンボリックの変数のままで、結果も出力して下さい。
8. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。追番を追加して。本質問も含めて下さい。
図を描いて説明して下さい。
???
from sympy import symbols, Rational, Eq, solve
# 記号の定義
b, h_b, H = symbols('b h_b H') # b: 底辺, h_b: 底面の高さ, H: 錐の高さ
# 底面積(△の面積)
base_area = Rational(1, 2) * b * h_b
# 三角錐の体積公式
volume = Rational(1, 3) * base_area * H
# 結果を表示
print("底面積 =", base_area)
print("体積 =", volume)
実行結果:
# 数値代入して計算
volume_val = volume.subs({b: 6, h_b: 4, H: 10})
print("数値代入後の体積 =", volume_val)
実行すると、数値代入後の体積 = 40 が出ます。
よし、それなら matplotlib を使って三角錐の図を描いてみよう。以下は、三角錐の立体図を簡単に表示する Python コード(SymPy + Matplotlib 使用)です:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import numpy as np
# 頂点の定義(適当な座標)
A = np.array([0, 0, 0])
B = np.array([4, 0, 0])
C = np.array([2, 3, 0])
D = np.array([2, 1, 5])
# 三角錐の面
faces = [
[A, B, C],
[A, B, D],
[B, C, D],
[C, A, D]
]
# 描画
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 面の描画
poly3d = [face for face in faces]
ax.add_collection3d(Poly3DCollection(poly3d, facecolors='skyblue', edgecolors='k', linewidths=1, alpha=0.6))
# 点のラベル
for point, name in zip([A, B, C, D], ['A', 'B', 'C', 'D']):
ax.text(*point, name, fontsize=12)
# 軸設定
ax.set_xlim(0, 5)
ax.set_ylim(0, 5)
ax.set_zlim(0, 6)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('正面から見た三角錐')
# 正面からの視点(z 軸を上に、x 軸を左右に、y 軸が奥行きになる視点)
ax.view_init(elev=10, azim=-90) # elev: 上下角度, azim: 水平角度
plt.show()
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import numpy as np
# 頂点の定義
A = np.array([0, 0, 0])
B = np.array([4, 0, 0])
C = np.array([2, 3, 0])
D = np.array([2, 1, 5])
# 三角錐の面
faces = [
[A, B, C],
[A, B, D],
[B, C, D],
[C, A, D]
]
# 描画
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 面の描画
poly3d = [face for face in faces]
ax.add_collection3d(Poly3DCollection(poly3d, facecolors='skyblue', edgecolors='k', linewidths=1, alpha=0.6))
# ラベル
for point, name in zip([A, B, C, D], ['A', 'B', 'C', 'D']):
ax.text(*point, name, fontsize=12)
# 軸設定
ax.set_xlim(0, 5)
ax.set_ylim(0, 5)
ax.set_zlim(0, 6)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('正面から見た三角錐')
# 正面からの視点
ax.view_init(elev=10, azim=-90)
# 画像として保存(例: PNG形式)
plt.savefig("triangular_pyramid_front.png", dpi=300, bbox_inches='tight') # 高解像度で保存
plt.show()
ついでに、sympy のソースコードで、積分を使って体積をシンボリックの変数のままで、結果も出力して下さい。
了解!では、三角錐の体積を 積分を使って求める SymPy のコードを、シンボリック変数のまま計算・出力する形で紹介します。
from sympy import symbols, integrate, Rational
# 変数定義
x, y, z = symbols('x y z')
b, h_b, H = symbols('b h_b H', positive=True) # b: 底辺, h_b: 底面高さ, H: 錐の高さ
# z の上限は錐の高さに比例(x, y による傾斜あり)
# 底面の三角形を x: [0, b], y: [0, h_b*(1 - x/b)] にすると、ピラミッド形になる
# z の上面:線形に減衰するように仮定(高さ H に比例)
z_top = H * (1 - x / b - y / h_b)
# 積分:dz dy dx の順で三重積分
volume = integrate(
integrate(
integrate(1, (z, 0, z_top)),
(y, 0, h_b * (1 - x / b))),
(x, 0, b))
# 結果出力
print("積分による体積(シンボリック) =")
print(volume.simplify())
結果(出力):
積分による体積(シンボリック) =
b*h_b*H/6
Gemini先生へ
copilot先生へ
いつもの? sympyの実行環境と 参考のおすすめです。
いつもと違うおすすめです。
wikipedia