ニュートン法

モジュールのインポート

import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt
import scienceplots
#Warning : As of version 2.0.0, you need to add import scienceplots before setting the style (plt.style.use('science')).
plt.style.use(['science', 'notebook'])

$f_1(x) = 0$ の零点

関数 $f_1(x) = x^2 - 4$ の零点をニュートン法より求めよう.
def func5(x):
    y = x*x-4.0
    return y
導関数は,
def dfunc5(x):
    y = 2.0*x
    return y
関数の値を計算し,出力するためのユーザ関数は,
def calf(func, x0, dx, nx):# 与えられた関数計算,出力
    print(f"{'x':>8s} {'f(x)':>15s}")
    for i in range(nx):
        x = x0 + dx*i
        y = func(x)
        print(f"{x:>8.3f} {y:>15.11f}")
    return
これより,計算,出力すると,
calf(func5, 0.0, 0.2, 21)
x            f(x)
0.000  -4.00000000000
0.200  -3.96000000000
0.400  -3.84000000000
0.600  -3.64000000000
0.800  -3.36000000000
1.000  -3.00000000000
1.200  -2.56000000000
1.400  -2.04000000000
1.600  -1.44000000000
1.800  -0.76000000000
2.000   0.00000000000
2.200   0.84000000000
2.400   1.76000000000
2.600   2.76000000000
2.800   3.84000000000
3.000   5.00000000000
3.200   6.24000000000
3.400   7.56000000000
3.600   8.96000000000
3.800  10.44000000000
4.000  12.00000000000
零点を,
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html#scipy.optimize.newton
より求めると,
x_ini = 1.0
optimize.newton(func5, x_ini, dfunc5)
2.0
導関数が与えられていない場合,セカント法が使用される.
x_ini = 1.0
xzero3 = optimize.newton(func5, x_ini)# 導関数が与えられていない場合,セカント法が使用される.
print ('optimize.newton: ',xzero3)
optimize.newton:  2.0000000000000004
プロットすると,
xx = np.linspace(-4.0, 4.0, 101)

fig = plt.figure() # グラフ領域の作成
plt.grid(color = "gray", linestyle="--")
plt.plot(xx,func5(xx), label='$f(x)$')
plt.plot(xx,dfunc5(xx), label=r'$\frac{df(x)}{dx}$')
plt.legend(ncol=1, loc='lower right', fancybox=False, frameon=True)
fig.savefig('p1_ex05_1.pdf')