Python замена sympy работает только один раз - PullRequest
0 голосов
/ 05 мая 2020

Что не так с моими кодами? функция замены работает только в первый раз. Я использовал sympy и определенные переменные. Он работал только один раз, а затем, когда я использую для l oop, он больше не работает. Пытался распечатать, что происходит.

x1, x2 = sym.symbols('x1 x2')
t = sym.Symbol('t')
f = 2.0*x1*x2 + 2.0*x2 - x1**2 - 2.0*x2**2
df1 = sym.diff(f, x1)
df2 = sym.diff(f, x2)
init1 = 0.5
init2 = 0.5
def st(f, df1, df2, init1, init2):
  for i in range(2):
    grad1 = df1.subs([(x1,init1),(x2,init2)])
    grad2 = df2.subs([(x1,init1),(x2,init2)])
    print(grad1, grad2)
    t1 = init1 + grad1 * t
    t2 = init2 + grad2 * t
    print(f)
    func = f.subs([(x1, t1), (x2, t2)])
    print(f)
    print(func)
    dfunc = sym.diff(func, t)
    print(dfunc)
    s = np.asarray(solve(dfunc, t))
    init1 = init1+s*grad1
    init2 = init2+s*grad2
    print(init1)
st(f, df1, df2, init1, init2)

и результат

0
0 1.00000000000000
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
3.0*t - 2.0*(1.0*t + 0.5)**2 + 1.25
-4.0*t + 1.0
[0.500000000000000]
1
0.500000000000000 0
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
-x1**2 + 1.5*x1 + 0.375
0
[]

1 Ответ

1 голос
/ 05 мая 2020

Если вы измените строку s на s = solve(dfunc, t)[0] (используя SymPy solve), вы получите

>>> st(f, df1, df2, init1, init2)
0 1.00000000000000
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
3.0*t - 2.0*(1.0*t + 0.5)**2 + 1.25
1.0 - 4.0*t
0.500000000000000
0.500000000000000 0
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
-x1**2 + 2.0*x1*x2 - 2.0*x2**2 + 2.0*x2
0.75*t - 0.25*(t + 1)**2 + 1.125
0.25 - 0.5*t
0.750000000000000

. Я подозреваю, что возникла проблема с преобразованием объекта np. Взяв [0] из результата solve, вы будете работать только с выражениями SymPy.

...