Вычисление двойного интеграла
Мне нужно вычислить двойной интеграл с помощью dblquad.
У меня ругается вот так: IntegrationWarning: The maximum number of subdivisions (50) has been achieved. If increasing the limit yields no improvement it is advised to analyze the integrand in order to determine the difficulties. If the position of a local difficulty can be determined (singularity, discontinuity) one will probably gain from splitting up the interval and calling the integrator on the subranges. Perhaps a special-purpose integrator should be used.
У меня pix[i,j][0] массив из значений пикселей. n[i]= массив из чисел от 1 до 600 m[j] = 1 до 462
C = [[0] * width for i in range(height)]
for i in range(len(n)):
for j in range(len(m)):
C[i][j] = dblquad(lambda x, y: pix[i, j][0] * math.sin(math.pi*x*n[i]/width)*math.sin(math.pi*y*m[j]/height)*math.sin(math.pi*x*n[i]/width)*math.sin(math.pi*y*m[j]/height), 0, height, lambda x: 0, lambda x: width)
Я просто пытаюсь реализовывать разные методы устранения артефактов\шумов на изображении. Решил попробовать разложить по синусам и косинусам.
Ответы (1 шт):
При высоких частотах синусоида сильно осциллирует, поэтому адаптивный алгоритм выбора делителя интервала на отрезки за 50 итераций не сходится.
Исходный текст dblquad показывает, что эта функция внутри себя вызывает nquad. В вашем случае вызов сводится к nquad(ваша_функция, [[0,width], [0,height]], opts={"epsabs": 1.49e-8, "epsrel": 1.49e-8})
Число итераций управляется опцией limit. Добавьте в параметр opts пару "limit": 100 или любое другое число.
Но на самом деле я бы рекомендовал вам освоить numpy и быстрое двумерное преобразование Фурье numpy.fft.fft2. После этого вы сможете легко и непринуждённо раскладывать изображения на двумерные гармоники специализированным методом rfft2 для вещественно значных функций.