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

问题描述 投票:0回答:1

这是我的代码,经过一次迭代后,即使存在实际的解决方案,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,y,alpha)
python sympy equation solver symbolic-math
1个回答
0
投票

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


0
投票

当您使用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的好处是根是真实的,因此您不必担心处理虚部。

© www.soinside.com 2019 - 2024. All rights reserved.