如果我在matplotlib中绘制矢量场,我通常会明确地为每个组件写下公式,以避免出现问题,例如形状和广播.然而,在稍微复杂的公式中,代码变得混乱,写入和读取.
是否有任何方便的方法来输入更符合向量操作的数学公式,如下面的我(不工作)伪代码?
# Run with ipython3 notebook%matplotlib inlinefrom pylab import *## The following works, but the mathematical formula is a complete mess to reddef B_dipole(m, a, x,y): return (3*(x - a[0])*(m[0]*(x - a[0]) m[1]*(y-a[1]))/((x - a[0])**2 (y-a[1])**2)**(5/2.0) -m[0]/((x - a[0])**2 (y-a[1])**2)**(3/2.0),3*(y - a[1])*(m[0]*(x - a[0]) m[1]*(y-a[1]))/((x - a[0])**2 (y-a[1])**2)**(5/2.0) -m[1]/((x - a[0])**2 (y-a[1])**2)**(3/2.0))## I want something like (but doesn't work)#def B_dipole(m, a, x,y):# r = array([x,y])# rs = r - a ## shifted r# mrs = dot(m,rs) ## dot product of m and rs# RS = dot(rs,rs)**(0.5) ## euclidian norm of rs# ret = 3*mrs*rs/RS**5 - m/RS**3 ## vector/array to return# return retx0, x1=-10,10y0, y1=-10,10X=linspace(x0,x1,55)Y=linspace(y0,y1,55)X,Y=meshgrid(X, Y)m = [1,2]a = [3,4]Bx,By = B_dipole(m,a,X,Y)fig = figure(figsize=(10,10))ax = fig.add_subplot(1, 1, 1)ax.streamplot(X, Y, Bx, By,color='black',linewidth=1,density=2)#ax.quiver(X,Y,Bx,By,color='black',minshaft=2)show()
输出:
编辑:
我的非工作代码的错误消息:
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-2-43b4694cc590> in <module>() 26 a = [3,4] 27 ---> 28 Bx,By = B_dipole(m,a,X,Y) 29 30 fig = figure(figsize=(10,10))<ipython-input-2-43b4694cc590> in B_dipole(m, a, x, y) 10 def B_dipole(m, a, x,y): 11 r = array([x,y])---> 12 rs = r - a ## shifted r 13 mrs = dot(m,rs) ## dot product of m and rs 14 RS = dot(rs,rs)**0.5 ## euclidian norm of rsValueError: operands could not be broadcast together with shapes (2,55,55) (2,)
如果我不移动r错误消息:
--ValueError Traceback (most recent call last)<ipython-input-4-e0a352fa4178> in <module>() 23 a = [3,4] 24 ---> 25 Bx,By = B_dipole(m,a,X,Y) 26 27 fig = figure(figsize=(10,10))<ipython-input-4-e0a352fa4178> in B_dipole(m, a, x, y) 8 r = array([x,y]) 9 rs = r# - a ## not shifted r---> 10 mrs = dot(m,rs) ## dot product of m and rs 11 RS = dot(rs,rs)**0.5 ## euclidian norm of rs 12 ret = 3*mrs*rs/RS**5 - m/RS**3 ## vector/array to returnValueError: shapes (2,) and (2,55,55) not aligned: 2 (dim 0) != 55 (dim 1)
解决方法:
我用简单的CAS简化了你的表达
--- Emacs Calculator Mode --- 3 (m0*(x - a0) m1*(y - a1)) (x - a0) m0 3 (m0*(x - a0) m1*(y - a1)) (y - a1) m14: -------------------------------------- - -------------------------- i*(-------------------------------------- - --------------------------) 2 2 2.5 2 2 1.5 2 2 2.5 2 2 1.5 ((x - a0) (y - a1) ) ((x - a0) (y - a1) ) ((x - a0) (y - a1) ) ((x - a0) (y - a1) )3: [X = x - a0, Y = y - a1] 3 X*(X m0 Y m1) m0 3 Y*(X m0 Y m1) m12: ----------------- - ------------ i*(----------------- - ------------) 2 2 2.5 2 2 1.5 2 2 2.5 2 2 1.5 (X Y ) (X Y ) (X Y ) (X Y ) 3 X*(X m0 Y m1) m0 3 Y*(X m0 Y m1) m11: ----------------- - --- i*(----------------- - ---) 5. 3. 5. 3. R R R R
我将该字段的两个组成部分表示为复数的实部和虚部.
从最后一个表达开始,可能是写
x, y = np.meshgrid(...)X, Y = x-a[0], y-a[1]R = np.sqrt(X*X Y*Y)H = X*m[0] Y*m[1]Fx = 3*X*H/R**5-m[0]/R**3Fy = 3*Y*H/R**5-m[1]/R**3
来源:https://www.icode9.com/content-1-288351.html
联系客服