python – 如何以快速数学方式输入公式来绘制矢量场?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何以快速数学方式输入公式来绘制矢量场?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3836字,纯文字阅读大概需要6分钟。
内容图文
![python – 如何以快速数学方式输入公式来绘制矢量场?](/upload/InfoBanner/zyjiaocheng/781/7a25b136b0b7494a8306a899672e792b.jpg)
如果我在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)
<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 rs
ValueError: 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 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 – 如何以快速数学方式输入公式来绘制矢量场?全部内容,希望文章能够帮你解决python – 如何以快速数学方式输入公式来绘制矢量场?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。