Sympy реализация многомерной функции Розенброка? - PullRequest
0 голосов
/ 14 июля 2020

Недавно я пытался научиться использовать символьное c исчисление в Python. Большинство базовых c руководств по SymPy были достаточно простыми, но как я могу go представить что-то столь же сложное, как N-мерное (даже для N) функция Розенброка ? Эта функция имеет два основных усложняющих фактора: ее аргумент является вектором, а функция обращается к определенным c индексированным элементам в этом векторе, а функция включает индексированную сумму.

Можно ли представить что-то вроде этого в SymPy? Если да, не могли бы вы предоставить фрагмент кода или советы о том, как я могу справиться с этими двумя проблемами?

1 Ответ

1 голос
/ 14 июля 2020

Вы можете сделать это, используя Sum и Indexed:

https://docs.sympy.org/latest/modules/concrete.html

https://docs.sympy.org/latest/modules/tensor/indexed.html

In [34]: x = IndexedBase('x')                                                                                          

In [35]: i, n = symbols('i, n', integer=True)                                                                          

In [36]: Sn = Sum(100*(x[2*i-1]**2 - x[2*i])**2 + (x[2*i-1] - 1)**2, (i, 1, n))                                        

In [37]: Sn                                                                                                            
Out[37]: 
  n                                                    
 ____                                                  
 ╲                                                     
  ╲                                                    
   ╲  ⎛                                              2⎞
   ╱  ⎜                2       ⎛          2         ⎞ ⎟
  ╱   ⎝(x[2*i - 1] - 1)  + 100⋅⎝x[2*i - 1]  - x[2*i]⎠ ⎠
 ╱                                                     
 ‾‾‾‾                                                  
i = 1                                                  

In [38]: Sn.subs(n, 2).doit()                                                                                          
Out[38]: 
                                2                                   2
          2       ⎛    2       ⎞              2       ⎛    2       ⎞ 
(x[1] - 1)  + 100⋅⎝x[1]  - x[2]⎠  + (x[3] - 1)  + 100⋅⎝x[3]  - x[4]⎠

Вы можете делать что-то с Sn, но есть ограничения на то, какие операции вы можете использовать, не заменяя n конкретным целым числом.

...