Y=0の線に接する円r
前提条件
Y=0の線に接する円rをx, y ,rの代数で式で表すとこうなる。
x^2 + (y-r)^2 = r^2
これを変形して$x = f(y)$の形にすると
x = \sqrt{r^2-(y-r)^2}
となる、これをy軸方向に積分していくと蒲鉾を積み重ねた時の体積が出るはずである。つまり0から無限まで積分する。
\int_{0}^{\infty}x dy = \int_{0}^{\infty}\sqrt{r^2-(y-r)^2} dy
Sympyによる計算
この計算は非常に複雑でありsympyライブラリに任せてしまった方がいい。
そこでこの積分をしてもらうコードを如何に示す。
int_circle.py
from sympy import symbols, integrate, sqrt
x, y, r = symbols('x y r')
i = integrate(sqrt(r**2-(y-r)**2), y)
print(i)
その出力を以下に示す。
result.py
Piecewise(
(-I*r**2*acosh((-r + y)/r)/2 - I*r*(-r + y)/(2*sqrt(-1 + (-r + y)**2/r**2)) + I*(-r + y)**3/(2*r*sqrt(-1 + (-r + y)**2/r**2)),
Abs((r - y)**2/r**2) > 1),
(r**2*asin((-r + y)/r)/2 + r*sqrt(1 - (-r + y)**2/r**2)*(-r + y)/2,
True)
)
一見複雑そうな結果が出てきたので解釈する。まずPiecewiseとは部分的という意味であるから。
この積分結果は場合分けの必要がある事が分かる。
でタプルの2段目は整理浮上剣であるから、Piecewise[0][1]はこの式が成立する条件である。一見複雑であるがy>2rの式なので今回の目的からは外れる。となるとPiecewise[1][0]が目的の式に当たる。ずいぶんと複雑そうであるのでTexで形を示してみる。
\int_{0}^{2r}x dy = \frac{r^2}{2}*\arcsin \frac{y-r}{r} + \frac{r(y-r)}{2}\sqrt{1 - \frac{(y-r)^2}{r^2}}
つまりこの円の式の値を返すにはPythonのifで2r以下であることを確認した上で対応することになる。
実際は
correcta\value.py
func(value: float) -> float:
if value > 2r:
value = 2r
~~~
~~~
という形にすれば良さそうである。これ、デコレータにした方がいいな。
にしても複雑……
cap_value.py
def cap_value(max_value: float):
def decorator(func):
def wrapper(value):
if value > max_value:
value = max_value
return func(value)
return wrapper
return decorator
Chat GPT思考のORMに成っとる……