# -*- coding: UTF-8 -*- from math import * import numpy as np ############################################ # 黄金分割法(関数の最小値) # a,b : 初期区間 a < b # eps : 許容誤差 # val : 間数値 # ind : 計算状況 # >= 0 : 正常終了(収束回数) # = -1 : 収束せず # max : 最大試行回数 # fun : 関数値を計算する関数の名前 # return : 結果 # coded by Y.Suganuma ############################################ def gold(a, b, eps, val, ind, max, fun) : x = 0.0 tau = (sqrt(5.0) - 1.0) / 2.0 count = 0 ind[0] = -1 x1 = b - tau * (b - a) x2 = a + tau * (b - a) f1 = fun(x1) f2 = fun(x2) while count < max and ind[0] < 0 : count += 1 if f2 > f1 : if (abs(b-a) < eps) and (abs(b-a) < eps*abs(b)) : ind[0] = 0 x = x1 val[0] = f1 else : b = x2 x2 = x1 x1 = a + (1.0 - tau) * (b - a) f2 = f1 f1 = fun(x1) else : if (abs(b-a) < eps) and (abs(b-a) < eps*abs(b)) : ind[0] = 0 x = x2 val[0] = f2 f1 = f2 else : a = x1 x1 = x2 x2 = b - (1.0 - tau) * (b - a) f1 = f2 f2 = fun(x2) if ind[0] == 0 : ind[0] = count fa = fun(a) fb = fun(b) if fb < fa : a = b fa = fb if fa < f1 : x = a val[0] = fa return x ---------------------------------- # -*- coding: UTF-8 -*- import numpy as np import sys from math import * from function import gold ############################################ # 黄金分割法によるy=x^4+3x^3+2x^2+1の最小値 # coded by Y.Suganuma ############################################ # 関数値の計算 def snx(x) : return x * x * x * x + 3.0 * x * x * x + 2.0 * x * x + 1.0 # 設定と実行 a = -2.0 b = -1.0 eps = 1.0e-10 max = 100 val = np.empty(1, np.float) ind = np.empty(1, np.int) x = gold(a, b, eps, val, ind, max, snx) print("x " + str(x) + " val " + str(val[0]) + " ind " + str(ind[0]))