Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么三维箭图的箭头指向错误的方向?_Python_Numpy_Matplotlib_Simulation_Physics - Fatal编程技术网

Python 为什么三维箭图的箭头指向错误的方向?

Python 为什么三维箭图的箭头指向错误的方向?,python,numpy,matplotlib,simulation,physics,Python,Numpy,Matplotlib,Simulation,Physics,我一直在为研究建立磁场模型。下面的代码允许我计算任意给定点(x,y,z)的正确字段值;然而,当我通过代码传递一个np.meshgrid对象时,结果开始变得不可靠 这是我的代码: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import axes3d def normal_vector(u): return u/np.linalg.norm(u) class Path:

我一直在为研究建立磁场模型。下面的代码允许我计算任意给定点(x,y,z)的正确字段值;然而,当我通过代码传递一个
np.meshgrid
对象时,结果开始变得不可靠

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d


def normal_vector(u):
    return u/np.linalg.norm(u)
class Path:
    """
    This defines the Path class which allows for the calculations of the magnetic field.
    """

    def __init__(self, xs, ys, zs):
        self.points = zip(*[xs, ys, zs])  # defines the points
        self.x = xs
        self.y = ys
        self.z = zs
        self.path_vectors = [(self.points[i + 1][0] - self.points[i][0],
                              self.points[i + 1][1] - self.points[i][1],
                              self.points[i + 1][2] - self.points[i][2]) for i in range(len(self.x) - 1)]
    def get_length(self):
        """
        Calculates the path length
        :return: returns float length
        """
        return sum([np.sqrt(((self.x[i + 1] - self.x[i]) ** 2) + ((self.y[i + 1] - self.y[i]) ** 2) + (
                (self.z[i + 1] - self.z[i]) ** 2)) for i in
                    range(len(self.x) - 1)])

    def get_magnetlic_function(self,axes,current=1.0,magnetic_constant = 1.25663706212e-6):
        magnetic_parameter = (current*magnetic_constant)/(4*np.pi)
        field_function = lambda x,y,z: sum([magnetic_parameter*np.cross(self.path_vectors[j],normal_vector(np.stack([x-self.x[j],y-self.y[j],z-self.z[j]],axis=-1)))/(np.linalg.norm(np.stack([x-self.x[j],y-self.y[j],z-self.z[j]],axis=-1))**2) for j in range(len(self.x)-1)]).swapaxes(0,-1)
        return field_function

n = 200
r = 1
h = 5
grid_x,grid_y,grid_z = np.meshgrid(np.linspace(-10,10,5),
                    np.linspace(-10,10,5),
                    np.linspace(-10,10,5))
c = h / (2 * n * np.pi)
t = np.linspace(0,2*np.pi, 5000)
xp = 3*np.cos(t)
yp = 3*np.sin(t)
zp = 0*t
p = Path(list(xp), list(yp), list(zp))
func = p.get_magnetlic_function([grid_x,grid_y,grid_z])
u,v,w = func(grid_x,grid_y,grid_z)
r = np.sqrt(u**2+v**2+w**2)
print func(-10.0,00.0,0.0)
ax1 = plt.subplot(111,projection='3d')
ax1.plot(xp,yp,zp,'r-')
ax1.plot([-10],[0],[0],'ro')
ax1.quiver(grid_x,grid_y,grid_z,u/r,v/r,w/r,length=1)
plt.show()

正如底部附近清楚显示的,如果运行代码,则-10.0,00.0,0.0处的向量方向与打印的值不同。为什么? 从代码中,我在这里接收到箭袋图:

它应该是这样的:
当试图找出电流分布所引起的磁场时,我发现考虑成对的相互作用通常更清楚(尽管<代码> lambda < /Case>函数远大于python)。考虑这种方法

类路径:
# ...
def磁功能(自、x、y、z,电流=1.0,磁常数=1.25663706212e-6):
磁参数=电流*磁常数/(4*np.pi)
s=x.shape
res=np.zero((s[0],s[1],s[2],3))
对于范围(s[0])内的i:
对于范围(s[1])内的j:
对于范围(s[2])内的k:
对于枚举(zip(self.x,self.y,self.z))中的idx(xc,yc,zc):
res[i,j,k,:]+=mag_param*\
np.cross(自路径_向量[idx],[x[i,j,k]-xc,
y[i,j,k]-yc,z[i,j,k]-zc])/\
np.linalg.norm([x[i,j,k]-xc,y[i,j,k]-yc,
z[i,j,k]-zc]**2
返回res[:,:,:,0],res[:,:,:,1],res[:,:,:,2]
#...
u、 v,w=p.mag_func(网格x,网格y,网格z)
r=np.sqrt(u**2+v**2+w**2)
ax1=plt.子地块(111,投影=3d')
ax1.绘图(xp,yp,zp,'r-')
ax1.箭袋(栅格x、栅格y、栅格z、u/r、v/r、w/r、长度=1)
plt.show()
这将给

这是载流导线周围磁场的正确表示


至于为什么
lambda
首先不起作用的问题,我认为这是由于通过
np.meshgrid
创建了网格,因此外部
sum
的总和超过了它应该得到的点数。以上述方式迭代可以解决该问题。可以使用
lambda
函数,但我认为您仍然需要按照所示的方式迭代
grid\u x
grid\u y
、和
grid\u z

我的答案是否更符合您的要求?如果我提供一个演示,演示如何使用
np.meshgrid
正确使用
lambda
函数,会更好吗?答案很好!谢谢你的帮助!事实证明,numpy数组在lambda函数中变得非常不稳定。如果您有时间的话,我也希望看到您在lambda上的实现!