0

私は quadpy を使用して Python に関数を統合しています。

関数

import numpy as np
T = 2*np.pi 

def ex1(t):
    return np.where(np.logical_and((t%T>=0), (t%T<np.pi)), t%T, np.pi)

関数は周期的で、これはそのプロットです:

x = np.linspace(0, 6*T, 1000)
plt.plot(x, ex1(x))
plt.grid(True)
plt.show()

ここに画像の説明を入力

問題

私はこの機能を統合しようとしています:

from scipy.integrate import quad
import quadpy

print(quadpy.quad(ex1, 0, 3))
print(quad(ex1, 0, 3))

生産する

(array(4.5), array(1.41692995e-19))
(4.5, 4.9960036108132044e-14)

0 から 3 までの間隔で、すべて正常に動作します。ただし、間隔をたとえば 4 に増やしても、scipy は引き続き機能します。

print(quad(ex1, 0, 4))

生産する

(7.631568411183528, 1.0717732083155035e-08)

しかし

print(quadpy.quad(ex1, 0, 4))

生産する

IntegrationError: Tolerances (abs: 1.49e-08, rel: 1.49e-08) could not be reached with the given max_num_subintervals (= 50).

質問

  • このエラーを防ぐにはどうすればよいですか? という引数を追加しようとしましたmax_num_subintervalsが、うまくいかないようでした。
  • 私がやろうとしていることに正しく quadpy を使用していますか? scipy がサポートしていない複素数の導関数を取得したかったので、それを使い始めました。万能のソリューションが必要なため、scipy で十分なこれらの簡単な例には quadpy を使用します。
4

2 に答える 2