修正版のオイラーの法を実行したいと考えています
python
1#こちらは修正前のオイラー法です。 2import numpy as np 3import math 4import matplotlib.pyplot as plt 5def func(x, y): 6 return y/(2.0*x) 7def euler(x0, y0, xmax, num): 8 x = np.linspace(x0, xmax, num+1) 9 h = (xmax-x0)/num 10 y = np.empty_like(x) 11 y[0] = y0 12 for k in range(len(x)-1): 13 y[k+1] = y[k] + h * func(x[k], y[k]) 14 return x, y 15x, y = euler(1.0, 1.0, 2.0, 10) 16print('Euler method') 17for (xx, yy) in zip(x, y): 18 print(f'x: {xx:.2f}, y: {yy:.6f}, true: {math.sqrt(xx):.6f}, error: {math.fabs(yy-math.sqrt(xx)):.6f}') 19plt.scatter(x, y, c='m') 20plt.plot(x, y, c="c") 21plt.grid() 22plt.show()
python
1#こちらが修正版オイラー法、k1,k2を使ってさらに誤差を小さくしたいと考えています。 2import numpy as np 3import math 4import matplotlib.pyplot as plt 5def func(x, y): 6 return y/(2.0*x) 7def Fix_euler(x0, y0, xmax, num): 8 x = np.linspace(x0, xmax, num+1) 9 h = (xmax-x0)/num 10 y = np.empty_like(x) 11 t = 0 12 y[0] = y0 13 for k in range(len(x)-1): 14 t = t + h 15 k1 = h * y[k] 16 k2 = h * (y[k]+k1) 17 y[k+1] = y[k] + (k1 +k2)/2 18 return x, y 19x, y = Fix_euler(1.0, 1.0, 2.0, 10) 20print('Euler method') 21for (xx, yy) in zip(x, y): 22 print(f'x: {xx:.2f}, y: {yy:.6f}, true: {math.sqrt(xx):.6f}, error: {math.fabs(yy-math.sqrt(xx)):.6f}') 23plt.scatter(x, y, c='m') 24plt.plot(x, y, c="c") 25plt.grid() 26plt.show()
しかし、修正版の方が誤差が大きくなってしまいます。
k1,k2部分の数式が違うかもしれません。
どなたかご教授よろしくお願いします。
オイラーの定理とオイラー法は別物ですよ。
あなたの回答
tips
プレビュー