编辑:
@Andras Deak:谢谢您的帖子,我尝试了您建议的,但使用了我定义的函数V(x,y)代替您的测试函数(fun=3*x^2-5*y^2)。代码如下,但报错了。
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'
假设我移除了"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会自动缩放,但这对我没有用(当我添加此选项时,无论我输入的数字是多少,都没有任何反应)。非常感谢你的帮助!