Я сделал следующее:
- триангулировать область
- вычислить интеграл по каждому треугольнику
- суммировать интегралы по треугольникам (это можно сделать к интегральному свойству аддитивности)
Допустим, у нас есть следующие данные:
import numpy as np
X = np.array([0, 0, 1, 1, 1.5])
Y = np.array([0, 1.1, 0, 1, 1.3])
A = np.array([2, 1.1, 0.5, 2, 0.3])
Мы выполняем триангуляцию, используя scipy
:
from scipy.spatial import Delaunay
domain_points = np.array(list(zip(X,Y)))
tri = Delaunay(domain_points)
введите описание изображения здесь
Вычисляем интеграл:
def area_from_3_points(x, y, z):
return np.sqrt(np.sum(np.cross(x-y, x-z), axis=-1)**2)/2
integral = 0
for vertices in tri.simplices:
mean_value = (A[vertices[0]] + A[vertices[1]] + A[vertices[2]]) / 3
area = area_from_3_points(domain_points[vertices[0]], domain_points[vertices[1]], domain_points[vertices[2]])
integral += mean_value*area
print(integral)
Out: 2.1166666666666667