黃金分割法 三分法

2021-09-29 21:52:47 字數 1731 閱讀 4315

適用函式: 至少在搜尋的初始區間內要是乙個單峰函式

from sympy import *

import numpy as np

import math

import matplotlib.pyplot as plt

x,a,b,x1,x2 = symbols('x,a,b,x1,x2')

f1 = sin(x)

f2 = tan(1 - x)

# f = -sin(x)**6 * tan(1 - x) * (math.e**30) ** x

f = math.e**x + math.e**(-x)

def get_value(t):

return f.subs(x,t)

def golden_search(st,ed):

a = st

b = ed

cnt = 1

x1 = a + 0.382*(b - a)

x2 = a + 0.618*(b - a)

print(cnt, ' ', a, " ", x1, ' ', x2, ' ', b)

cnt += 1

while b - a > 1e-10:

x1_value = get_value(x1)

x2_value = get_value(x2)

if x1_value < x2_value:

b = x2

x2 = x1

x1 = a + 0.382*(b - a)

elif x1_value > x2_value:

a = x1

x1 = x2

x2 = a + 0.618*(b - a)

elif x1_value == x2_value:

a = x1

b = x2

x1 = a + 0.382 * (b - a)

x2 = a + 0.618 * (b - a)

print(cnt,' ',a," ",x1,' ',x2,' ',b)

cnt += 1

ans = ( b + a )/ 2

print('極小值點x*:', ans , ' 極小值:' ,get_value(ans))

if __name__ == '__main__':

st = -1 # 區間起始點

ed = 2 # 區間終止點

golden_search(st,ed)

x1=np.arange(0,1.01,0.01) # 注意右端點要去大乙個dx!!!!!!

# y1 = np.sin(x1)**6 * np.tan(1 - x1) * (np.e**30) ** x1

# y1 = np.sin(x1)**6 * np.tan(1 - x1)* (math.e**(30*x1))

y1 = ((np.e)**x1) + ((np.e)**(-1*x1))

x,y=np.meshgrid(x1,y1)

plt.plot(x1,y1,"g-",lw=2.5,label="f(x)")

# plt.title("e ^(x) + e ^ (-x)")

plt.title("-sin(x1)^6 * tan(1 - x1) * e^(30*x1)")

# plt.plot(step_x,step_y,c = 'r',marker = '*')

plt.show()

三分法(洛谷3382 模板 三分法)

如題,給出乙個n次函式,保證在範圍 l,r 內存在一點x,使得 l,x 上單調增,x,r 上單調減。試求出x的值。輸入格式 第一行一次包含乙個正整數n和兩個實數l r,含義如題目描述所示。第二行包含n 1個實數,從高到低依次表示該n次函式各項的係數。輸出格式 輸出為一行,包含乙個實數,即為x的值。四...

三分法小結

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如圖,類似二分的定義left和right,mid left right 2,midmid mid right 2 如果mid靠近極值點,則right midmid 否則...

三分法查詢

我們都知道 二分查詢 適用於單調函式中逼近求解某點的值。如果遇到凸性或凹形函式時,可以用三分查詢求那個凸點或凹點。下面的方法應該是三分查詢的乙個變形。如圖所示,已知左右端點l r,要求找到白點的位置。思路 通過不斷縮小 l,r 的範圍,無限逼近白點。做法 先取 l,r 的中點 mid,再取 mid,...