Sympy中遍历列表元素循环求偏导的异常问题排查
问题原因
你遇到的问题核心是SymPy通过对象身份而非变量名称识别符号。代码开头用symbols('x y z')创建的x、y、z是三个独立的Symbol对象,而循环里用Symbol(i)创建的新符号,虽然名字和前者相同,但属于完全不同的对象。你的函数x*y+z绑定的是开头定义的那三个符号,循环里的新符号并不存在于函数表达式中,所以对其求偏导结果自然是0。
解决方法
有两种简单的修复方式:
方法1:直接使用已定义的符号列表
既然已经创建了x、y、z符号,直接把它们放进列表循环即可:
from sympy import symbols, diff x, y, z = symbols('x y z', real=True) # 直接用已创建的符号组成列表 variables = [x, y, z] function = x * y + z for v in variables: function_partial = diff(function, v) print(function_partial)
输出:
y x 1
方法2:建立字符串到已有符号的映射
如果必须保留字符串形式的变量列表,可以创建一个字典,将字符串映射到对应的符号对象:
from sympy import symbols, diff x, y, z = symbols('x y z', real=True) variables = ["x", "y", "z"] # 建立字符串到符号的映射 var_map = {'x': x, 'y': y, 'z': z} function = x * y + z for i in variables: v = var_map[i] function_partial = diff(function, v) print(function_partial)
输出和方法1一致。
内容的提问来源于stack exchange,提问作者rude.boy
相关产品推荐
相关产品推荐

