首页 > 解决方案 > 为什么我的代码永远运行,我已经很久没有运行代码了。然而,没有输出。我走了很长的路吗?下面的所有1个代码

问题描述

从 sympy 导入 sympy 导入符号、cos、函数、pi、diff

""" 柯西求函数最小值的方法 """

x = symbols('x')
y = symbols('y')
f = Function('f')

""" 函数和初始点 """

f = x*x + 2*y*y - 0.3*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.7
p = [0.1,0.1]

def fib(n) : """ 斐波那契数列 """

a = 0
b = 1
if n <= 1 :
    return n
else:
    for i in range(1, n):
        c = a + b
        a = b
        b = c
    return b

def grad(X) : """ 函数的梯度 """

x0 = X[0]
y0 = X[1]

s1 = - ((f.diff(x)).subs([(x,x0),(y,y0)]))
s2 = - ((f.diff(y)).subs([(x,x0),(y,y0)]))

return s1.evalf(), s2.evalf()

S = 毕业(p)

def lam_star(func,X) : """ 计算最优 lambda"""

x0 = X[0]
y0 = X[1]

dl = 0.01
l = 0

z = f.subs([(x,x0 + l*S[0]),(y,y0 + l*S[1])])
minima = 0

while minima == 0 :
    l = l + dl
    znew = f.subs([(x,x0 + l*S[0]),(y,y0 + l*S[1])])
    if znew > f.subs([(x,x0 + (l-dl)*S[0]),(y,y0 + (l-dl)*S[1])]) :
        minima = 1
    else : minima = 0
else : z = znew

n = 25
fn = fib(n)
a = l - 2*dl
b = l
l0 = b - a
fa = f.subs([(x,x0 + a*S[0]),(y,y0 + a*S[1])])
fb = f.subs([(x,x0 + b*S[0]),(y,y0 + b*S[1])])

for i in range(1,n) :
    L = fib(n-i)*l0/fn
    c = b - L
    d = a + L

    if c == d :
        d = c + 0.0001

    fc = f.subs([(x,x0 + c*S[0]),(y,y0 + c*S[1])])
    fd = f.subs([(x,x0 + d*S[0]),(y,y0 + d*S[1])])

    if fc <= fd :
        b = d
        fb = fd
    else : 
        a = c
        fa = fc

if fc <= fd :
    l_star = c
else: l_star = d

return l_star

""" 求函数的最小值 """

Xnew = [0.1,0.1]
conv = 0

while conv == 0 :
    x_sol = Xnew
    Fx = grad(x_sol)
    s = [-Fx[0],-Fx[1]]
    lam = lam_star(f,x_sol)
    Xnew = [x_sol[0]+s[0]*lam, x_sol[1]+s[1]*lam]
    if ((abs(Fx[0]) <= 1e-1) & ((abs(Fx[1]) <= 1e-1))) :
        conv = 1

print(x_sol)

标签: pythonpython-3.xpython-2.7

解决方案


推荐阅读