一维黄金分割法、牛顿法(最优化附加2)

依赖

anaconda3-Python3.5

牛顿法

Newton_img.png

黄金分割法

Gold_ratio_img.png

程序

Gold_ratio.py

import math
import numpy as np
import matplotlib.pyplot as plt
Epsilon=1e-3#极限

y=lambda t:t*(t+2)#函数

(a,b)=[-3,5]# 确定a,b

Belta=(3-math.sqrt(5))/2
t2=a+Belta*(b-a)
y2=y(t2)

while True:
    t1=a+b-t2
    y1=y(t1)
    if abs(t1-t2)=Epsilon:
            if y1

Newton.py

import sympy
import matplotlib.pyplot as plt
import numpy as np

Epsilon = 0.01
t = sympy.symbols('t')

# y=t*(t+2)
y = t ** 3 - 2 * t + 1
f=lambda t:t ** 3 - 2 * t + 1
t0 = 0.5#初始值




y_diff1 = sympy.diff(y, t)
y_diff2 = sympy.diff(y, t, 2)
k = 1
def Next_t(t0):
    global k
    delta = (y_diff1 / y_diff2).subs(t, t0)
    t1 = (t - delta).subs(t, t0)
    # print(t1)
    if abs(delta) < Epsilon:
        print('第%d次迭代:%f=%f%+f' % (k, t1, t0, -delta))
        plt.plot([t1], [f(t1)], marker='o', markersize=8, markerfacecolor="red")
        plt.text(t1, f(t1), k, color='red', fontsize=k*2 + 10)
        return t1
    else:
        print('第%d次迭代:%f=%f%+f' % (k, t1, t0, -delta))
        plt.plot([t1], [f(t1)], marker='o', markersize=8, markerfacecolor="green")
        plt.text(t1,f(t1) , k, color='green', fontsize=k*2 + 10)
        k += 1
        return Next_t(t1)


Next_t(t0)

def printFunc(f, a, b):
    t = np.arange(a, b, 0.01)
    s = f(t)
    plt.plot(t, s)
    plt.show()

printFunc(f,t0,t0+0.5)


你可能感兴趣的:(一维黄金分割法、牛顿法(最优化附加2))