# -*- coding: UTF-8 -*- from math import * ############################################ # 二分法による非線形方程式(f(x)=0)の解 # fn : f(x)を計算する関数名 # x1,x2 : 初期値 # eps1 : 終了条件1(|x(k+1)-x(k)|<eps1) # eps2 : 終了条件2(|f(x(k))|<eps2) # max : 最大試行回数 # ind : 実際の試行回数 # (負の時は解を得ることができなかった) # return : 解 # coded by Y.Suganuma ############################################ def bisection(fn, x1, x2, eps1, eps2, max, ind) : x0 = 0.0 f1 = fn(x1) f2 = fn(x2) if f1*f2 > 0.0 : ind[0] = -1 else : ind[0] = 0; if f1*f2 == 0.0 : if f1 == 0.0 : x0 = x1 else : x0 = x2 else : sw = 0 while sw == 0 and ind[0] >= 0 : sw = 1 ind[0] += 1 x0 = 0.5 * (x1 + x2) f0 = fn(x0) if abs(f0) > eps2 : if ind[0] <= max : if abs(x1-x2) > eps1 and abs(x1-x2) > eps1*abs(x2) : sw = 0 if f0*f1 < 0.0 : x2 = x0 f2 = f0 else : x1 = x0 f1 = f0 else : ind[0] = -1 return x0 ---------------------------------- # -*- coding: UTF-8 -*- import numpy as np from math import * from function import bisection ############################################ # 二分法による exp(x)-3x=0 の根 # coded by Y.Suganuma ############################################ # 関数値の計算 def snx(x) : return exp(x) - 3.0 * x # データの設定 eps1 = 1.0e-10 eps2 = 1.0e-10 max = 100 x1 = 0.0 x2 = 1.0 ind = [0] # 実行と結果 x = bisection(snx, x1, x2, eps1, eps2, max, ind) print(" ind=" + str(ind[0]) + " x=" + str(x) + " f= " + str(snx(x)))