【发布时间】:2026-01-20 09:25:01
【问题描述】:
我想计算和绘制两个变量的任何标量函数的梯度。如果你真的想要一个具体的例子,让我们说 f=x^2+y^2 其中 x 从 -10 到 10 和 y 相同。如何计算和绘制 grad(f)?解决方案应该是矢量,我应该看到矢量线。我是python新手,所以请用简单的词。
编辑:
@Andras Deak:谢谢你的帖子,我尝试了你的建议,而不是你的测试函数 (fun=3*x^2-5*y^2) 我使用了我定义为 V(x, y);代码是这样的,但是报错了
import numpy as np
import math
import sympy
import matplotlib.pyplot as plt
def V(x,y):
t=[]
for k in range (1,3):
for l in range (1,3):
t.append(0.000001*np.sin(2*math.pi*k*0.5)/((4*(math.pi)**2)* (k**2+l**2)))
term = t* np.sin(2 * math.pi * k * x/0.004) * np.cos(2 * math.pi * l * y/0.004)
return term
return term.sum()
x,y=sympy.symbols('x y')
fun=V(x,y)
gradfun=[sympy.diff(fun,var) for var in (x,y)]
numgradfun=sympy.lambdify([x,y],gradfun)
X,Y=np.meshgrid(np.arange(-10,11),np.arange(-10,11))
graddat=numgradfun(X,Y)
plt.figure()
plt.quiver(X,Y,graddat[0],graddat[1])
plt.show()
AttributeError: 'Mul' object has no attribute 'sin'
假设我删除了罪,我得到另一个错误:
TypeError: can't multiply sequence by non-int of type 'Mul'
我阅读了 sympy 教程,它说“符号计算系统(如 SymPy)的真正强大之处在于能够以符号方式进行各种计算”。我明白了,我只是不明白为什么我不能将 x 和 y 符号与浮点数相乘。
解决这个问题的方法是什么? :(请帮忙!
更新
@Andras Deak:我想让事情变得更短,所以我从 V(x,y) 和 Cn*Dm 的原始公式中删除了许多常量。正如您所指出的,这导致 sin 函数始终返回 0(我刚刚注意到)。对此表示歉意。今天晚些时候,当我详细阅读您的评论时,我将更新该帖子。非常感谢!
更新 2 我更改了电压表达式中的系数,结果如下:
它看起来不错,只是箭头指向相反的方向(它们应该从红点出来并进入蓝色点)。你知道我怎么能改变它吗?如果可能的话,你能告诉我增加箭头大小的方法吗?我尝试了另一个主题 (Computing and drawing vector fields) 中的建议:
skip = (slice(None, None, 3), slice(None, None, 3))
这只会绘制每三个箭头,matplotlib 会自动缩放,但它对我不起作用(当我添加这个时,我输入的任何数字都不会发生任何事情) 你已经帮了我很大的忙,我感激不尽!
【问题讨论】:
-
那么这里有什么问题呢?梯度计算,使用 2D 监视器表示 4D 数据?
-
我知道如何在 python 中绘制二维函数。但我不知道如何计算和绘制作为该标量函数梯度的向量函数(因此,grad(V)= dV/dx * ex + dV/dy * ey,其中 ex 和 ey 是 ort 向量)
-
Python 中的自动微分怎么样?这是看起来不错的包pypi.python.org/pypi/ad
-
你的最后一个链接让我很困惑。该主题没有说任何关于绘图的内容(据我所知,他们谈论的是数值评估)
标签: python numpy plot gradient sympy