为什么Sympy无法解决eq并返回空列表?

这是我的代码,经过一次迭代后,即使存在真正的解决方案,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)
henryjiangyun 回答:为什么Sympy无法解决eq并返回空列表?

在使用Floats时,最好避免使用solvensolve是一个不错的选择; real_roots是多项式表达式的最佳选择。修改后的循环代码如下:

x,y = (-2,-2)
a = sym.symbols('alpha',real = True)
g = 0
for i in range(10):
  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 = real_roots(f_df)
  results = [result.evalf() for result in results]
  print(results)
  if results == []:
    alpha = 0.0002
  else:
    alpha = max(results)
  x,y = gradient(x,y,alpha)

将其作为输出:

[0.000441337793142084]
[0.00515203928757550,0.0319174312939091,0.0586149494008985]
[-3.10788521492778,-1.55403909321385,0.000190101167850467]
[9.55804650314387e-6,0.888327666156469,1.77644094084023]
[-2.10061893789262,-1.05020390268404,4.22416276906710e-6]
[-2.21819554773374,-1.10898951281205,2.77707471229222e-7]
[-2.22597281529973,-1.11287797130474,1.83791879133972e-8]
[-2.22648773727225,-1.11313542069817,1.21690353113779e-9]
[-2.22652183165770,-1.11315246712336,8.05747904731784e-11]
[-2.22652408915671,-1.11315359582205,5.33504194318928e-12]

real_roots的优点是根是真实的,因此您不必担心处理虚部。

,

我最近发现发生这种情况是因为我将alpha声明为实数,并且尽管该表达式具有实数解,但求解器仍以接近零(1e-50)的虚部返回答案。这些解决方案被视为复数,因此,求解器返回了一个空列表。

本文链接:https://www.f2er.com/2641409.html

大家都在问