Я хотел вычислить объем пересечения сферы и бесконечного цилиндра на некотором расстоянии b, и я подумал, что сделаю это, используя быстрый и грязный скрипт на python.Мои требования - вычисление <1 с> 3 значащими цифрами.
Мое мышление было таким: мы помещаем сферу с радиусом R так, чтобы ее центр находился в начале координат, и помещаем цилиндр с радиусом R 'так, чтобы ее ось была натянута на z от(б, 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()