現在sympyやscipyを使わずに台形法則、シンプソン法、ガウス=ルジャンドル法を使って積分の近似をし、ステップ数を増やすと誤差がどうなっていくのかをプロットしたいと思っています。
自分の作った関数では、単純な積分近似はできるのですが、誤差を計算する段階になるとSympifyErrorが出てしまいます。
どこがどのようにまずいのかもわからず困っています。
まだプログラミングを始めて日が浅いので優しく御教授いただけると助かります。
ガウス=ルジャンドルについてはわからないようなら先生の方からWikipediaのテーブルを移して良いとの回答を頂いたのでこのようになっていますので、あまり気にしなくても大丈夫なのですが、その他は質問しても教えられないとだけ言われてしまい、お手上げ状態です。
エラーメッセージ: SympifyError: Sympify of expression 'could not parse '<function <lambda> at 0x7fec74eba3b0>'' failed, because of exception being raised: SyntaxError: invalid syntax (<string>, line 1)
該当のソースコード
ソースコード def integral(f, a, b, N, method='trapezoid'): if method == 'trapezoid': s = (b - a) / N t = 0.5 * (f(a) + f(b)) for i in range(1, N): t = t + f(a + i * s) return s * t elif method == 'simpson': if N % 2 == 1: return ValueError("N must be an even integer.") h = (b - a)/ N x0 = f(a) + f(b) x1 = 0 x2 = 0 for i in np.arange(1, N): x = a + i * h if i % 2 == 0: x2 += f(x) else: x1 += f(x) X = h * (x0 + 2 * x2 + 4 * x1) / 3 return X elif method == 'gauss': s1 = (b - a) / 2 s2 = (b + a) / 2 if N == 1: x = [0] w = [2] elif N == 2: x = [-1/np.sqrt(3), 1/np.sqrt(3)] w = [1, 1] elif N == 3: x = [-np.sqrt(3/5), 0, np.sqrt(3/5)] w = [5/9, 8/9, 5/9] elif N == 4: x = [-np.sqrt(3/7+2/7*np.sqrt(6/5)), -np.sqrt(3/7-2/7*np.sqrt(6/5)), np.sqrt(3/7-2/7*np.sqrt(6/5)), np.sqrt(3/7+2/7*np.sqrt(6/5))] w = [(18-np.sqrt(30))/36, (18+np.sqrt(30))/36, (18+np.sqrt(30))/36, (18-np.sqrt(30))/36] elif N == 5: x = [-1/3*np.sqrt(5+2*np.sqrt(10/7)), -1/3*np.sqrt(5-2*np.sqrt(10/7)), 0, 1/3*np.sqrt(5-2*np.sqrt(10/7)), 1/3*np.sqrt(5+2*np.sqrt(10/7))] w = [(322-13*np.sqrt(70))/900, (322+13*np.sqrt(70))/900, 128/225, (322+13*np.sqrt(70))/900, (322-13*np.sqrt(70))/900] else: ValueError('N must be less than 6.') p = 0 for i in np.arange(N): p += w[i] * f(s1 * x[i] + s2) return s1 * p else: return ValueError('Not a valid method.') N = [2 ** (t) for t in np.arange(1, 7)] trap = np.zeros(len(N)) simp = np.zeros(len(N)) true_ = np.zeros(len(N)) f = lambda x: np.exp(-x) for index, i in enumerate(N): trap[index] = integrate(f, 0, 1, i, 'trapezoid') simp[index] = integrate(f, 0, 1, i, 'simpson') true_[index] = 1 / i * (sum(f(-(np.linspace(0, 1, i))))) et = abs((trap - true_) / true_) * 100 es = abs((simp - true_) / true_) * 100
試したこと
関数は台形とシンプソンはできているとは思うのですが、誤差を計算してプロットを描くためにループ処理しようとするとエラーになってしまいます。
補足情報(FW/ツールのバージョンなど)
Python 3.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/17 21:57