Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 为什么是SciPy';s ODE解算器未生成正确的解决方案?_Python - Fatal编程技术网

Python 为什么是SciPy';s ODE解算器未生成正确的解决方案?

Python 为什么是SciPy';s ODE解算器未生成正确的解决方案?,python,Python,我正在使用scipy的ode解算器来计算电子在B和E场中的轨迹(但目前所有组件的E场均为零)。我首先对常数和字段使用了非常简单的数字,即q=m=Bz=Ez=vy=1,得到了正确的解。然而,当我试图为q和m输入更现实的值时,它给我的解决方案是完全错误的。我不认为这是ode解算器的错,但我自己的错在这里,所以我想问一下,是否有人能看到我的初始条件和时间步长可能有什么问题,看看为什么会发生这种情况。代码: import numpy as np import pylab from scipy.integ

我正在使用scipy的ode解算器来计算电子在B和E场中的轨迹(但目前所有组件的E场均为零)。我首先对常数和字段使用了非常简单的数字,即q=m=Bz=Ez=vy=1,得到了正确的解。然而,当我试图为q和m输入更现实的值时,它给我的解决方案是完全错误的。我不认为这是ode解算器的错,但我自己的错在这里,所以我想问一下,是否有人能看到我的初始条件和时间步长可能有什么问题,看看为什么会发生这种情况。代码:

import numpy as np
import pylab
from scipy.integrate import odeint
import matplotlib.pyplot as plt
#import random
import mpl_toolkits.mplot3d.axes3d as p3

P0 = [0,0,0]
V0 = [1.759E+11,0,0]
t = np.linspace(0,9E-8,num=10E-8)

#Physical/Natural Constants
q_e = -1.602E-19
m_e = 9.11E-31

#Math
ICs = np.concatenate((P0,V0),axis=0)

def BField(x,y,z):

    Bx = 0
    By = 0
    Bz = 1

    BVec = np.array([Bx,By,Bz])

    return BVec

Bout = BField(0,0,0.02)


def EField(x,y,z):

    Ex = 0
    Ey = 0
    Ez = 0
    EVec = np.array([Ex,Ey,Ez])

    return EVec


def LorentzForce(PosVel,t,Constants):

    x,y,z,vx,vy,vz = PosVel
    Ex,Ey,Ez,Bx,By,Bz,q_e,m_e = Constants

    EFInput = np.array([Ex,Ey,Ez])
    BFInput = np.array([Bx,By,Bz])
    VelInput = np.array([vx,vy,vz])

    Accel = (q_e/m_e) * (EFInput + np.cross(VelInput, BFInput))   

    LFEqs = np.concatenate((VelInput, Accel), axis = 0)


    return LFEqs


Ex,Ey,Ez = EField(P0[0],P0[1],P0[2])
Bx,By,Bz = BField(P0[0],P0[1],P0[2])
#Ex = Ey = Ez = 0
AllConstantInputs = [Ex,Ey,Ez,Bx,By,Bz,q_e,m_e]
ParticleTrajectory = odeint(LorentzForce, ICs, t, args=(AllConstantInputs,))

print(ParticleTrajectory)


fig = pylab.figure()
particleplot = p3.Axes3D(fig)
plt.plot(ParticleTrajectory[:, 0],ParticleTrajectory[:, 1],ParticleTrajectory[:, 2],'b')
plt.legend(loc='best')
plt.grid()
plt.show()

在您的字段函数定义中,无论您以x、y和z的形式输入什么,结果都是一样的,因为您不给它们赋值。如果您的意思是,无论输入如何,我都为所有组件赋值零,那么是的,我是故意这么做的。否则我就误解了你的评论。当你说
Bout=BField(0,0,0.02)
时,第三个分量仍然是1,因为你的输出不依赖于输入。如果你是故意这么做的,那么定义函数有什么意义呢?这是因为这是我想要解决的更复杂问题的设置结构,因此我首先要确保ODE解算器在给定常量字段的情况下生成正确的解决方案。然后,一旦我发现它是正确的,就转到非均匀字段。至少您应该将
def BField(x,y,z):
更改为
def BField(BX,By,Bz):
,以便按照您的预期工作。埃菲尔德也一样。