首页 > 解决方案 > 多维 Rosenbrock 函数的 Sympy 实现?

问题描述

我最近一直在尝试学习如何在 Python 中使用符号微积分。大多数基本的 SymPy 教程都很简单,但是我将如何表示像 N 维(甚至 N)Rosenbrock 函数这样复杂的东西呢?这个函数有两个主要的复杂因素:它的参数是一个向量,函数访问这个向量中特定的索引元素,并且函数包括一个索引和。

是否可以在 SymPy 中表示类似的东西?如果是这样,您能否提供有关我如何应对这两个挑战的代码片段或提示?

标签: python-3.xsympy

解决方案


您可以使用Sumand执行此操作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


推荐阅读