首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sympy.subs不能替换点到数组

sympy.subs不能替换点到数组
EN

Stack Overflow用户
提问于 2022-01-21 11:59:52
回答 1查看 77关注 0票数 1
代码语言:javascript
运行
复制
import sympy
import numpy
from sympy import ordered, Matrix
x1,x2=sympy.symbols('x1 x2')
f=x1**2-x1*x2-4*x1+x2**2-x2
X0=numpy.array([[1],[1]])
v = list(ordered(f.free_symbols))
gradient = lambda f, v: Matrix([f]).jacobian(v)
gradf=sympy.transpose(gradient(f, v))
gradfx0=(gradf.subs([(x1, X0[0]), (x2, X0[1])]))
print(gradfx0)

我想在python中的一个点上计算两个变量函数的梯度。定义函数,求函数的梯度向量(grad)。现在,当我尝试将X0替换为grad时,结果是

Matrix([[2*x1 - x2 - 4], [-x1 + 2*x2 - 1]])

我想结果应该是

Matrix([[-3], [0]]).

如何将点替换为交点数组?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 12:34:14

使用.subsderive_by_array

代码语言:javascript
运行
复制
from sympy import symbols
from sympy.tensor.array import derive_by_array

x1, x2 = symbols('x1 x2')
f = x1 ** 2 - x1 * x2 + x2 ** 2 - 4 * x1 - x2

grad = derive_by_array(f, (x1, x2))
#    = [2*x1 - x2 - 4, -x1 + 2*x2 - 1]

gradx0 = grad.subs({x1: 1, x2: 1})
#      = [-3, 0]

如果您想首先调用点x0,那么使用变量x0

代码语言:javascript
运行
复制
x0 = (1, 1)
gradx0 = grad.subs(zip((x1,x2), x0))
#      = [-3, 0]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70800934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档