这是我的代码,经过一次迭代后,即使存在真正的解决方案,sym.solve的返回也是一个空列表。为什么会这样呢?我做错了什么?
from scipy import *
import matplotlib.pyplot as plt
import numpy as np
import sympy as sym
rosenbrock = lambda x,y: (1 + x)**2 + 100*(y - x**2)**2
df_rosenbrock = lambda x,y: np.array([-400*x*y + 400*x**3 + 2*x -2,200*y -200*x**2])
gradient = lambda x,y,alpha: np.array((x,y)) - (alpha * df_rosenbrock(x,y))
x,y = (-2,-2)
for i in range(10):
a = sym.symbols('alpha',real = True)
d_0 = - df_rosenbrock(x,y)
x_0 = np.array((x,y))
f = rosenbrock(*(x_0 + a*d_0))
f_df = sym.diff(f,a)
results = sym.solve(f_df,a)
results = [result.evalf() for result in results]
new_results = [sym.re(result) for result in results if (sym.re(result) > 0)]
if new_results == []:
alpha = 0.0002
else:
alpha = max(new_results)
x,y = gradient(x,alpha)