python 速度矢量表达式_python – 如何以快速数学方式输入公式来绘制矢量场?...

如果我在matplotlib中绘制矢量场,我通常会明确地为每个组件写下公式,以避免出现问题,例如形状和广播.然而,在稍微复杂的公式中,代码变得混乱,写入和读取.

考虑以下示例,我想绘制由此公式定义的矢量字段:

是否有任何方便的方法来输入更符合向量操作的数学公式,如下面的我(不工作)伪代码?

# Run with ipython3 notebook

%matplotlib inline

from pylab import *

## The following works, but the mathematical formula is a complete mess to red

def 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 ret

x0, x1=-10,10

y0, y1=-10,10

X=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)

in ()

26 a = [3,4]

27

---> 28 Bx,By = B_dipole(m,a,X,Y)

29

30 fig = figure(figsize=(10,10))

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 rs

ValueError: operands could not be broadcast together with shapes (2,55,55) (2,)

如果我不移动r错误消息:

--

ValueError Traceback (most recent call last)

in ()

23 a = [3,4]

24

---> 25 Bx,By = B_dipole(m,a,X,Y)

26

27 fig = figure(figsize=(10,10))

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 return

ValueError: 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) m1

4: -------------------------------------- - -------------------------- + 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) m1

2: ----------------- - ------------ + 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) m1

1: ----------------- - --- + 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**3

Fy = 3*Y*H/R**5-m[1]/R**3

标签:python,syntax,math,matplotlib,numpy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值