ある距離 b にある球体と無限円柱の交差部分の体積を計算したかったのですが、手早く汚い python スクリプトを使用してそれを行うことにしました。私の要件は、有効数字が 3 桁を超える 1 秒未満の計算です。
私の考えは次のとおりです。半径 R の球を、その中心が原点にあるように配置し、半径 R' の円柱を、その軸が (b,0,0 )。円柱の内側にある場合は 1 を返し、そうでない場合は 0 を返すステップ関数を使用して、球を積分します。したがって、球と円柱の両方の内側にあることによって制約されたセット、つまり交差で 1 を積分します。
scipy.intigrate.tplquad を使用してこれを試しました。うまくいきませんでした。次のような警告が表示されるため、ステップ関数の不連続が原因だと思います。もちろん、私はこれを間違っているかもしれません。ばかげた間違いを犯していないと仮定すると、交差点の範囲を定式化して、ステップ関数の必要性を取り除くことができますが、最初にフィードバックを得ようとするかもしれないと考えました. 誰でも間違いを見つけたり、簡単な解決策を指摘したりできますか?
警告: サブディビジョンの最大数 (50) に達しました。
制限を増やしても改善が得られない場合は
、問題を判断するために被積分関数を分析することをお勧めします。局所的な困難の位置 (特異点、不連続点) を決定できる場合は、区間を分割し、部分範囲で積分器を呼び出すことでおそらく利益が得られます。おそらく、専用のインテグレーターを使用する必要があります。
コード:
from scipy.integrate import tplquad
from math import sqrt
def integrand(z, y, x):
if Rprim >= (x - b)**2 + y**2:
return 1.
else:
return 0.
def integral():
return tplquad(integrand, -R, R,
lambda x: -sqrt(R**2 - x**2), # lower y
lambda x: sqrt(R**2 - x**2), # upper y
lambda x,y: -sqrt(R**2 - x**2 - y**2), # lower z
lambda x,y: sqrt(R**2 - x**2 - y**2), # upper z
epsabs=1.e-01, epsrel=1.e-01
)
R=1
Rprim=1
b=0.5
print integral()